Exemplo n.º 1
0
        public void OnCertify(ILoginClient client, CertifyPacket certifyPacket)
        {
            if (certifyPacket.BuildVersion != _loginConfiguration.BuildVersion)
            {
                AuthenticationFailed(client, ErrorType.ILLEGAL_VER, "bad client build version");
                return;
            }

            DbUser user = _database.Users.FirstOrDefault(x => x.Username.Equals(certifyPacket.Username));
            AuthenticationResult authenticationResult = Authenticate(user, certifyPacket.Password);

            switch (authenticationResult)
            {
            case AuthenticationResult.BadUsername:
                AuthenticationFailed(client, ErrorType.FLYFF_ACCOUNT, "bad username");
                break;

            case AuthenticationResult.BadPassword:
                AuthenticationFailed(client, ErrorType.FLYFF_PASSWORD, "bad password");
                break;

            case AuthenticationResult.AccountSuspended:
                // TODO
                break;

            case AuthenticationResult.AccountTemporarySuspended:
                // TODO
                break;

            case AuthenticationResult.AccountDeleted:
                AuthenticationFailed(client, ErrorType.ILLEGAL_ACCESS, "logged in with deleted account");
                break;

            case AuthenticationResult.Success:
                if (_loginServer.IsClientConnected(certifyPacket.Username))
                {
                    AuthenticationFailed(client, ErrorType.DUPLICATE_ACCOUNT, "client already connected", disconnectClient: false);
                    return;
                }

                user.LastConnectionTime = DateTime.UtcNow;
                _database.Users.Update(user);
                _database.SaveChanges();

                _loginPacketFactory.SendServerList(client, certifyPacket.Username, _coreServer.GetConnectedClusters());
                client.SetClientUsername(certifyPacket.Username);
                _logger.LogInformation($"User '{client.Username}' logged succesfully from {client.Socket.RemoteEndPoint}.");
                break;

            default:
                break;
            }
        }