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); }