コード例 #1
0
        public async Task Handle(Client client, byte[] packet)
        {
            var p        = new InPacket(packet);
            var username = p.ReadString();

            p.Seek(19); // Skip past the 17 character + \0 username
            var password = p.ReadString();

            if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
            {
                OnLoginFail(client);
                return;
            }


            DbUser user;

            await using (var db = Database.Get())
            {
                user = await db.QueryFirstAsync <DbUser>("SELECT * FROM users WHERE username = @username;", new { username });

                if (user == null || user.Password != password)
                {
                    OnLoginFail(client);
                    return;
                }

                // Update the auth token so the user can authenticate later
                try
                {
                    var token = GenerateLoginToken();
                    await db.ExecuteAsync("UPDATE users SET auth_token = @token WHERE id = @id;",
                                          new { token, id = user.Id });

                    user.AuthToken = token;
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "Unable to set the user's auth token.");
                    OnLoginFail(client);
                    return;
                }
            }

            await OnLoginOk(client, user);
        }