private GameOperationResponse HandleLoginUser(int sessionId, LoginUser operation)
        {
            try
            {
                var userData = this.application.UserDatabase.Query <UserData>("UserData/ByUsername")
                               //.Customize(x => x.WaitForNonStaleResultsAsOfNow())
                               .Select(user => new { user.Username, user.Salt, user.Password })
                               .FirstOrDefault(user => user.Username.Equals(operation.Username, StringComparison.CurrentCultureIgnoreCase));
                if (userData == null)
                {
                    return(operation.GetErrorResponse((short)ResultCode.IncorrectUsernameOrPassword));
                }

                var passwordHash = SaltedHash.Create(userData.Salt, userData.Password);
                if (passwordHash.Verify(operation.Password) == false)
                {
                    return(operation.GetErrorResponse((short)ResultCode.IncorrectUsernameOrPassword));
                }

                // requesting master to authorize client
                this.peer.SendOperationRequest(new OperationRequest((byte)ServerOperationCode.AckClientUserLogin,
                                                                    new AckClientUserLogin
                {
                    SessionId = sessionId,
                    Username  = userData.Username
                }),
                                               new SendParameters());
                return(null);
            }
            catch (Exception e)
            {
                _logger.Error(e);
                return(operation.GetErrorResponse((short)ResultCode.Fail));
            }
        }
        protected virtual GameOperationResponse HandleOperationLogin(GameOperationRequest operationRequest, MessageParameters parameters)
        {
            var operation = new LoginUser(peer.Protocol, operationRequest);

            if (!operation.IsValid)
            {
                return(operation.GetErrorResponse((short)ResultCode.InvalidOperationParameter, operation.GetErrorMessage()));
            }

            ThreadPool.QueueUserWorkItem(
                o => this.ExecUserOperation(() => this.HandleLoginUser(operationRequest.ClientId, operation), operationRequest.ClientId, parameters));

            return(null);
        }