public void Login(MsgrClient client, Packet packet) { var unkString = packet.GetString(); var entityId = packet.GetLong(); var entityName = packet.GetString(); var server = packet.GetString(); var channelName = packet.GetString(); var accountId = packet.GetString(); var sessionKey = packet.GetLong(); var unkLong = packet.GetLong(); var unkInt = packet.GetInt(); // Check session if (!MsgrServer.Instance.Database.CheckSession(accountId, sessionKey)) { Log.Warning("Someone tried to login with invalid session (Account: {0}).", accountId); client.Kill(); return; } // Check if pet if (entityId >= MabiId.Pets) { Send.LoginR(client, LoginResult.Pet); return; } // Check character if (!MsgrServer.Instance.Database.AccountHasCharacter(accountId, entityId, server)) { Log.Warning("User '{0}' tried to login with invalid character.", accountId); client.Kill(); return; } // Get contact // If no contact with this data exists in the db yet it's created, // this way we don't have to worry about creating contacts for existing // characters and the msgr server can operate independently. client.User = MsgrServer.Instance.Database.GetOrCreateContact(accountId, entityId, entityName, server, channelName); if (client.User == null) { Log.Warning("Failed to get or create contact for user '{0}'.", accountId); Send.LoginR(client, LoginResult.Fail); return; } client.User.Client = client; Log.Info("User '{0}' logged in as '{1}'.", client.User.AccountId, client.User.FullName); Send.LoginR(client, LoginResult.Okay); MsgrServer.Instance.UserManager.Add(client.User); }