Exemplo n.º 1
0
        private void LoginSuccess(LoginSuccessMessage message)
        {
            LoginProtect.TimeStop();

            System.Windows.Application.Current.Dispatcher.BeginInvoke(
                new Action(
                    delegate
            {
                App.Current.MainWindow.Hide();
                MainWindow.ni.BalloonTipTitle = "ClassAssistance";
                MainWindow.ni.BalloonTipText  = "已将ClassAssistance最小化到托盘,程序将在后台运行";
                MainWindow.ni.BalloonTipIcon  = ToolTipIcon.Info;
                MainWindow.ni.ShowBalloonTip(30000);
                MainWindow.startTime = DateTime.Now.Ticks;
                MainWindow.price     = message.Price;
            }
                    )
                );
        }
        private async Task HandleLoginRequest(IClient client, Message message, CancellationToken cancellationToken)
        {
            var lrMessage = (LoginRequestMessage)message;
            var level     = (Level)null;

            const string ERROR_ACC_RESOLVE = "Problem resolving account. Clear application data and try again.";
            const string MARKET_URL        = "market://details?id=com.supercell.clashofclans";
            const int    MAJ_VER           = 8;
            const int    MIN_VER           = 709;

            // If the configuration says we're in maintenance we
            // tell the client the server is maintenance.
            if (_maintenance)
            {
                var lfMessage = new LoginFailedMessage
                {
                    Reason = LoginFailureReason.Maintenance,
                };
                client.SendMessage(lfMessage);
                return;
            }

            // Make sure the client is running on the version we want it to run.
            if (lrMessage.MajorVersion != MAJ_VER || lrMessage.MinorVersion != MIN_VER)
            {
                var lfMessage = new LoginFailedMessage
                {
                    Reason = LoginFailureReason.OutdatedVersion,
                };
                client.SendMessage(lfMessage);
            }
            // If the client master-hash is not the same as the server master-hash,
            // we ask the client to download the new assets.
            else if (lrMessage.MasterHash != Server.Assets.Fingerprint.MasterHash)
            {
                var lfMessage = new LoginFailedMessage
                {
                    Reason          = LoginFailureReason.OutdatedContent,
                    FingerprintJson = Server.Assets.Fingerprint.ToJson(),
                    MarketUrl       = MARKET_URL,
                    ContentUrl      = Server.Configuration.ContentUrl,
                };
                client.SendMessage(lfMessage);
            }
            else
            {
                try
                {
                    // Determine if the client is requesting a new Level
                    // to be associated with it.
                    if (lrMessage.UserId == 0)
                    {
                        // If somehow a client had a client ID of 0 but had a non null user token.
                        if (lrMessage.UserToken != null)
                        {
                            var lfMessage = new LoginFailedMessage
                            {
                                Message = ERROR_ACC_RESOLVE
                            };
                            client.SendMessage(lfMessage);
                            return;
                        }
                        // Otherwise the client had a client ID of 0 and a null user token.
                        // Meaning its a requesting a new account.
                        else
                        {
                            level = await Server.Levels.NewLevelAsync(cancellationToken);
                        }
                    }
                    else
                    {
                        // If somehow a client had a user ID but not a user token.
                        if (lrMessage.UserToken == null)
                        {
                            var lfMessage = new LoginFailedMessage
                            {
                                Message = ERROR_ACC_RESOLVE
                            };
                            client.SendMessage(lfMessage);
                            return;
                        }
                        else
                        {
                            level = await Server.Levels.GetLevelAsync(lrMessage.UserId, cancellationToken);

                            // If there is no level in the db with the same user id as specified, we create
                            // a level with the same user id and token as specified.
                            if (level == null)
                            {
                                level = await Server.Levels.NewLevelAsync(lrMessage.UserId, lrMessage.UserToken, cancellationToken);
                            }

                            if (level.Token != lrMessage.UserToken)
                            {
                                var lfMessage = new LoginFailedMessage
                                {
                                    Message = ERROR_ACC_RESOLVE
                                };
                                client.SendMessage(lfMessage);
                                return;
                            }
                        }
                    }
                }
                catch
                {
                    var lfMessage = new LoginFailedMessage
                    {
                        Message = ERROR_ACC_RESOLVE // Sorta lie since its not related to account resolving.
                    };
                    client.SendMessage(lfMessage);
                    throw;
                }

                // Client has been successfully logged in!
                client.Session.Login(level);

                const string ENV_PROD  = "prod";
                const string FB_APP_ID = "297484437009394";

                var lsMessage = new LoginSuccessMessage
                {
                    UserToken = level.Token,
                    UserId    = level.Avatar.Id,
                    HomeId    = level.Avatar.Id,

                    FacebookId   = null,
                    GameCenterId = null,

                    MajorVersion    = MAJ_VER,
                    MinorVersion    = MIN_VER,
                    RevisionVersion = 0,

                    ServerEnvironment = ENV_PROD,
                    LoginCount        = level.LoginCount,
                    PlayTime          = level.PlayTime,
                    FacebookAppId     = FB_APP_ID,
                    DateLastSave      = level.DateLastSave,
                    DateCreated       = level.DateCreated,

                    GooglePlusId = null,
                    CountryCode  = "EN" //TODO: Return Country code of IP.
                };

                var ohdMessage = level.OwnHomeData;

                client.SendMessage(lsMessage);
                client.SendMessage(ohdMessage);

                // If the Level forms part of a clan, we send the AllianceStream message of the alliance,
                // So that the client knows when stuff was sent.
                if (level.Avatar.Alliance != null)
                {
                    var asMessage = level.Avatar.Alliance.AllianceStream;
                    client.SendMessage(asMessage);
                }
            }
        }