public void VerifyLogin(NoS0575Packet loginPacket) { try { if (false) //TODO Maintenance { Session.SendPacket(new FailcPacket { Type = LoginFailType.Maintenance }); Session.Disconnect(); return; } if (_loginConfiguration.ClientData != null && loginPacket.ClientData != _loginConfiguration.ClientData) { Session.SendPacket(new FailcPacket { Type = LoginFailType.OldClient }); Session.Disconnect(); return; } var acc = DaoFactory.AccountDao.FirstOrDefault(s => string.Equals(s.Name, loginPacket.Name, StringComparison.OrdinalIgnoreCase)); if (acc != null && acc.Name != loginPacket.Name) { Session.SendPacket(new FailcPacket { Type = LoginFailType.WrongCaps }); Session.Disconnect(); return; } if (acc == null || !string.Equals(acc.Password, loginPacket.Password, StringComparison.OrdinalIgnoreCase)) { Session.SendPacket(new FailcPacket { Type = LoginFailType.AccountOrPasswordWrong }); Session.Disconnect(); return; } switch (acc.Authority) { case AuthorityType.Banned: Session.SendPacket(new FailcPacket { Type = LoginFailType.Banned }); break; case AuthorityType.Closed: case AuthorityType.Unconfirmed: Session.SendPacket(new FailcPacket { Type = LoginFailType.CantConnect }); break; default: var servers = WebApiAccess.Instance.Get <List <WorldServerInfo> >("api/channels"); var alreadyConnnected = false; var connectedAccount = new Dictionary <int, List <ConnectedAccount> >(); var i = 1; foreach (var server in servers) { var channelList = WebApiAccess.Instance.Get <List <ConnectedAccount> >("api/connectedAccount", server.WebApi); connectedAccount.Add(i, channelList); i++; if (channelList.Any(a => a.Name == acc.Name)) { alreadyConnnected = true; } } if (alreadyConnnected) { Session.SendPacket(new FailcPacket { Type = LoginFailType.AlreadyConnected }); Session.Disconnect(); return; } acc.Language = _loginConfiguration.UserLanguage; DaoFactory.AccountDao.InsertOrUpdate(ref acc); if (servers.Count <= 0) { Session.SendPacket(new FailcPacket { Type = LoginFailType.CantConnect }); Session.Disconnect(); return; } var subpacket = new List <NsTeStSubPacket>(); i = 1; var servergroup = string.Empty; var worldCount = 1; foreach (var server in servers.OrderBy(s => s.Name)) { if (server.Name != servergroup) { i = 1; servergroup = server.Name; worldCount++; } var channelcolor = (int)Math.Round((double)connectedAccount[i].Count / server.ConnectedAccountLimit * 20) + 1; subpacket.Add(new NsTeStSubPacket { Host = server.Host, Port = server.Port, Color = channelcolor, WorldCount = worldCount, WorldId = i, Name = server.Name }); i++; } var newSessionId = SessionFactory.Instance.GenerateSessionId(); subpacket.Add(new NsTeStSubPacket { Host = "-1", Port = null, Color = null, WorldCount = 10000, WorldId = 10000, Name = "1" }); //useless server to end the client reception Session.SendPacket(new NsTestPacket { AccountName = loginPacket.Name, SubPacket = subpacket, SessionId = newSessionId }); break; } Session.Disconnect(); } catch { Session.SendPacket(new FailcPacket { Type = LoginFailType.UnhandledError }); Session.Disconnect(); } }
public void VerifyLogin(NoS0575Packet loginPacket) { try { if (!true)//TODO OldClient { Session.SendPacket(new FailcPacket { Type = LoginFailType.OldClient }); return; } AccountDTO acc = DAOFactory.AccountDAO.FirstOrDefault(s => s.Name.ToUpper() == loginPacket.Name.ToUpper()); if (acc != null && acc.Name != loginPacket.Name) { Session.SendPacket(new FailcPacket { Type = LoginFailType.WrongCaps }); return; } if (acc == null || acc.Password.ToUpper() != loginPacket.Password.ToUpper()) { Session.SendPacket(new FailcPacket { Type = LoginFailType.AccountOrPasswordWrong }); return; } if (!true)//TODO Banned { Session.SendPacket(new FailcPacket { Type = LoginFailType.Banned }); return; } if (!true)//TODO AlreadyConnected { Session.SendPacket(new FailcPacket { Type = LoginFailType.AlreadyConnected }); return; } List <WorldServer> servers = WebApiAccess.Instance.Get <List <WorldServer> >("api/channels"); if (servers.Any()) { List <NsTeSTSubPacket> subpacket = new List <NsTeSTSubPacket>(); int i = 1; string servergroup = string.Empty; int worldCount = 1; foreach (WorldServer server in servers.OrderBy(s => s.Name)) { if (server.Name != servergroup) { i = 1; servergroup = server.Name; worldCount++; } int currentlyConnectedAccounts = WebApiAccess.Instance.Get <IEnumerable <string> >($"api/connectedAccounts", server.WebApi).Count(); int channelcolor = (int)Math.Round((double)currentlyConnectedAccounts / server.ConnectedAccountsLimit * 20) + 1; subpacket.Add(new NsTeSTSubPacket() { Host = server.Host, Port = server.Port, Color = channelcolor, WorldCount = worldCount, WorldId = i, Name = server.Name }); i++; } int newSessionId = SessionFactory.Instance.GenerateSessionId(); subpacket.Add(new NsTeSTSubPacket() { Host = "-1", Port = null, Color = null, WorldCount = 10000, WorldId = 10000, Name = "1" }); //useless server to end the client reception Session.SendPacket(new NSTestPacket { AccountName = loginPacket.Name, SubPacket = subpacket, SessionId = newSessionId }); return; } Session.SendPacket(new FailcPacket { Type = LoginFailType.CantConnect }); } catch { Session.SendPacket(new FailcPacket { Type = LoginFailType.UnhandledError }); } }