public ResponseStruct Login(string SeasonID, string UserName, string Password)
        {
            ResponseStruct Result;

            MySqlConnection DBConnection = new MySqlConnection(OverallInformations.TShockDBConnectionString);
            DBConnection.Open();

            string SQLQuery = "SELECT Username,Password,Usergroup FROM users WHERE Username=@UserName";
            MySqlCommand DBCommand = new MySqlCommand(SQLQuery, DBConnection);
            DBCommand.Prepare();
            DBCommand.Parameters.Add("@UserName", MySqlDbType.VarChar).Value = UserName;
            MySqlDataReader DBReader = DBCommand.ExecuteReader();

            List<TShockUserInformations> TShockUserList = new List<TShockUserInformations>();

            while(DBReader.Read())
            {
                TShockUserInformations TShockUserInstance = new TShockUserInformations();
                TShockUserInstance.UserName = DBReader.GetString("Username");
                TShockUserInstance.Password = DBReader.GetString("Password");
                TShockUserInstance.UserGroup = DBReader.GetString("Usergroup");
                TShockUserList.Add(TShockUserInstance);
            }

            DBReader.Dispose();
            DBCommand.Dispose();
            DBConnection.Dispose();

            LauncherClientInformations aClient;
            if (!OverallInformations.ManagementClients.TryGetValue(SeasonID, out aClient))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không tìm thấy Season ID." }, Broadcast = new List<string>() { "Khởi động lại Launcher Client." } };
            }
            else if (UserName == "")
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "'User Name' trống rỗng." }, Broadcast = new List<string>() { "'User Name' không được phép để trống, nhập đầy đủ thông tin để tiếp tục." } };
            }
            else if (UserName.Length > 32)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tên tài khoản quá dài." }, Broadcast = new List<string>() { "Nhập tên tài khoản với độ dài không quá 32 kí tự." } };
            }
            else if (TShockUserList.Count == 0)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tài khoản không tồn tại." }, Broadcast = new List<string>() { "Tạo tài khoản để có thể bắt đầu chơi." } };
            }
            else if (TShockUserList.Count > 1)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tài khoản bị trùng." }, Broadcast = new List<string>() { "Liên hệ Admin quản lí cơ sở dữ liệu." } };
            }
            else if (String.IsNullOrWhiteSpace(Password))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Mật mã trống rỗng." }, Broadcast = new List<string>() { "Nhập mật mã đầy đủ." } };
            }
            else
            {
                if (BCrypt.Net.BCrypt.Verify(Password, TShockUserList[0].Password))
                {
                    if (TShockUserList[0].UserGroup != "superadmin")
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tài khoản của bạn không có quyền sử dụng Launcher Management." }, Broadcast = new List<string>() { "Yêu cầu tài khoản phải có quyền quản trị cao nhất: superadmin." } };
                    }
                    else
                    {
                        if (OverallInformations.ManagementClients.TryUpdate(SeasonID, new LauncherClientInformations { SeasonID = aClient.SeasonID, UserName = UserName, Password = Password, TheFirstQueueName = aClient.TheFirstQueueName }, aClient))
                        {
                            Result = new ResponseStruct() { Status = ResponseStatusType.Done, Error = new List<string>() { "Không có lỗi xảy ra." }, Broadcast = new List<string>() { "Đăng nhập thành công.", "Bạn có quyền sử dụng Launcher Management." } };
                            LauncherServer.OutputMessage(String.Format("[Management]: {0} has logged in.", UserName), LauncherServer.MessageType.Success);
                        }
                        else
                        {
                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không thể thêm bản ghi của bạn vào danh sách Client." }, Broadcast = new List<string>() { "Khởi động lại Launcher Management và tiến hành đăng nhập." } };
                        }
                    }
                }
                else
                {
                    Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Mật mã không chính xác." }, Broadcast = new List<string>() { "Nhập lại mật mã nếu có sai sót. Liên hệ Admin nếu quên mật mã." } };
                }
            }

            return Result;
        }
        public ResponseStruct Login(string SeasonID, string UserName, string Password)
        {
            ResponseStruct Result;
            #region Lấy danh sách bản ghi có User Name theo yêu cầu trong tshock\users.

            MySqlConnection DBConnection = new MySqlConnection(OverallInformations.TShockDBConnectionString);
            DBConnection.Open();

            string SQLQuery = "SELECT Username,Password FROM users WHERE Username=@UserName";
            MySqlCommand DBCommand = new MySqlCommand(SQLQuery, DBConnection);
            DBCommand.Prepare();
            DBCommand.Parameters.Add("@UserName", MySqlDbType.VarChar).Value = UserName;
            MySqlDataReader DBReader = DBCommand.ExecuteReader();

            List<TShockUserInformations> TShockUserList = new List<TShockUserInformations>();

            while (DBReader.Read())
            {
                TShockUserInformations TShockUserInstance = new TShockUserInformations();
                if (!DBReader.IsDBNull(DBReader.GetOrdinal("Username")))
                {
                    TShockUserInstance.UserName = DBReader.GetString("Username");
                }
                if (!DBReader.IsDBNull(DBReader.GetOrdinal("Password")))
                {
                    TShockUserInstance.Password = DBReader.GetString("Password");
                }
                TShockUserList.Add(TShockUserInstance);
            }

            DBReader.Dispose();
            DBCommand.Dispose();
            DBConnection.Dispose();
            #endregion
            #region Kiểm tra điều kiện.
            LauncherClientInformations aClient;

            if (!OverallInformations.Clients.TryGetValue(SeasonID, out aClient))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không tìm thấy Season ID." }, Broadcast = new List<string>() { "Khởi động lại Launcher Client." } };
            }
            else if (UserName == "")
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "'User Name' trống rỗng." }, Broadcast = new List<string>() { "'User Name' không được phép để trống, nhập đầy đủ thông tin để tiếp tục." } };
            }
            else if (UserName.Length > 32)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tên tài khoản quá dài." }, Broadcast = new List<string>() { "Nhập tên tài khoản với độ dài không quá 32 kí tự." } };
            }
            else if (TShockUserList.Count == 0)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tài khoản không tồn tại." }, Broadcast = new List<string>() { "Tạo tài khoản để có thể bắt đầu chơi." } };
            }
            else if (TShockUserList.Count > 1)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tài khoản bị trùng." }, Broadcast = new List<string>() { "Liên hệ Admin để xử lí." } };
            }
            else if (Password == "")
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Mật khẩu trống rỗng." }, Broadcast = new List<string>() { "Nhập mật mã đầy đủ." } };
            }
            else if (IsAnUserLoggedOnLauncherServer(UserName))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Phát hiện tài khoản đang có mặt trên hệ thống." }, Broadcast = new List<string>() { "Không dùng đăng nhập trên hai nơi khác nhau." } };
            }
            else
            {
                if (BCrypt.Net.BCrypt.Verify(Password, TShockUserList[0].Password))
                {
                    if (OverallInformations.Clients.TryUpdate(SeasonID, new LauncherClientInformations { SeasonID = aClient.SeasonID, UserName = UserName, Password = Password, TheFirstQueueName = aClient.TheFirstQueueName }, aClient))
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Done, Broadcast = new List<string>() { "Đăng nhập thành công.", "Chào mừng bạn trở lại với Terraria Việt Nam." } };
                        LauncherServer.OutputMessage(String.Format("[Client]: {0} has logged in.", UserName), LauncherServer.MessageType.Success);
                    }
                    else
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Thông tin đăng nhập vừa bị thay đổi." }, Broadcast = new List<string>() { "Thử đăng nhập lại một lần nữa." } };
                    }
                }
                else
                {
                    Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Mật mã không chính xác." }, Broadcast = new List<string>() { "Nhập lại mật mã nếu có sai sót.", "Liên hệ Admin nếu quên mật mã." } };
                }
                #endregion
            }
            return Result;
        }