private ModelStatus login(ModelLogin packet, ServiceContext context) { packet.Email = Repository.CheckIsIntruder(context, packet.Email, packet.Login); if (packet.Login == "system") { return(null); } var player = Repository.GetPlayerByLogin(packet.Login); if (player != null) { if (!string.IsNullOrEmpty(packet.KeyReconnect)) { if (!player.KeyReconnectVerification(packet.KeyReconnect)) { Loger.Log("Reconnect " + player.Public.Login + " Fail"); player = null; } else { Loger.Log("Reconnect " + player.Public.Login + " OK"); } } else if (player.Pass != packet.Pass) { player = null; } } if (player == null) { return(new ModelStatus() { Status = 1, Message = "User or password incorrect" }); } //перед входом закрываем все подключения этого же игрока context.AllSessionAction(session => { var sc = session.GetContext(); if (sc == null || sc.Player?.Public?.Login != player.Public.Login || sc == context) { return; } Loger.Log("Disconnect old session at relogin " + player.Public.Login); session.Dispose(); }); //действия перед входом player.ExitReason = OCUnion.Transfer.DisconnectReason.AllGood; player.ApproveLoadWorldReason = OCUnion.Transfer.Types.ApproveLoadWorldReason.LoginOk; //При восстановлении подключения ничего не делаем if (string.IsNullOrEmpty(packet.KeyReconnect)) { //если зашли по паролю, то сбрасываем ключ, для передачи клиенту нового player.KeyReconnect1 = null; //отмена атаки, если оба участника были отключены одновременно if (player.AttackData != null) { player.AttackData.Finish(); } //удаление всех писем с командой на перезагрузку if (player.Mails != null) { for (int i = 0; i < player.Mails.Count; i++) { if (player.Mails[i] is ModelMailAttackCancel) { player.Mails.RemoveAt(i--); } } } // обновляем словарь Номер чата, индекс последнего полученного сообщения if (packet.Login != "discord") { foreach (var v in player.Chats.Values) { v.Value = -1; v.Time = DateTime.MinValue; } } } context.Player = player; context.Logined(); return(new ModelStatus() { Status = 0, Message = null }); }