Пример #1
0
        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();
            }
        }
Пример #2
0
        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
                });
            }
        }