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