Ejemplo n.º 1
0
        /// <summary>
        ///     Handles the default heartbeat responses.
        /// </summary>
        /// <param name="requestEnvelope"></param>
        /// <param name="returns">The payload of the <see cref="ResponseEnvelope" />.</param>
        private void HandleDefaultResponses(RequestEnvelope requestEnvelope, IList <ByteString> returns)
        {
            var responseIndexes = new Dictionary <int, RequestType>();

            for (var i = 0; i < requestEnvelope.Requests.Count; i++)
            {
                var request = requestEnvelope.Requests[i];
                if (_defaultRequests.Contains(request.RequestType))
                {
                    responseIndexes.Add(i, request.RequestType);
                }
            }

            foreach (var responseIndex in responseIndexes)
            {
                var bytes = returns[responseIndex.Key];

                switch (responseIndex.Value)
                {
                case RequestType.GetHatchedEggs:     // Get_Hatched_Eggs
                    var hatchedEggs = GetHatchedEggsResponse.Parser.ParseFrom(bytes);
                    if (hatchedEggs.Success && hatchedEggs.PokemonId.Count > 0)
                    {
                        HatchedEggsReceived?.Invoke(this, hatchedEggs);
                    }
                    break;

                case RequestType.GetInventory:     // Get_Inventory
                    var inventory = GetInventoryResponse.Parser.ParseFrom(bytes);
                    if (inventory.Success)
                    {
                        if (inventory.InventoryDelta.NewTimestampMs >=
                            _session.Player.Inventory.LastInventoryTimestampMs)
                        {
                            _session.Player.Inventory.LastInventoryTimestampMs =
                                inventory.InventoryDelta.NewTimestampMs;
                            if (inventory.InventoryDelta != null &&
                                inventory.InventoryDelta.InventoryItems.Count > 0)
                            {
                                _session.Player.Inventory.UpdateInventoryItems(inventory.InventoryDelta);
                            }
                        }
                    }
                    break;

                case RequestType.CheckAwardedBadges:     // Check_Awarded_Badges
                    var awardedBadges = CheckAwardedBadgesResponse.Parser.ParseFrom(bytes);
                    if (awardedBadges.Success && awardedBadges.AwardedBadges.Count > 0)
                    {
                        CheckAwardedBadgesReceived?.Invoke(this, awardedBadges);
                    }
                    break;

                case RequestType.DownloadSettings:     // Download_Settings
                    var downloadSettings = DownloadSettingsResponse.Parser.ParseFrom(bytes);
                    if (string.IsNullOrEmpty(downloadSettings.Error))
                    {
                        if (downloadSettings.Settings == null)
                        {
                            continue;
                        }
                        if (_session.GlobalSettings == null || _session.GlobalSettingsHash != downloadSettings.Hash)
                        {
                            _session.GlobalSettingsHash = downloadSettings.Hash;
                            _session.GlobalSettings     = downloadSettings.Settings;
                        }
                        else
                        {
                            _session.GlobalSettings = downloadSettings.Settings;
                        }
                    }
                    else
                    {
                        Logger.Debug($"DownloadSettingsResponse.Error: '{downloadSettings.Error}'");
                    }
                    break;

                // TODO: Let the developer know about this somehow.
                case RequestType.CheckChallenge:
                    var checkChallenge = CheckChallengeResponse.Parser.ParseFrom(bytes);
                    if (checkChallenge.ShowChallenge)
                    {
                        Logger.Warn($"Received Captcha on {_session.AccessToken.Username}");
                        Logger.Warn(JsonConvert.SerializeObject(checkChallenge, Formatting.Indented));
                        CheckChallengeReceived?.Invoke(this, checkChallenge);
                    }
                    break;
                }
            }
        }
 /// <summary>
 /// Provides a safe way to invoke the <see cref="CheckChallengeReceived" /> event.
 /// </summary>
 /// <param name="value"></param>
 public void RaiseCheckChallengeReceived(CheckChallengeResponse value) => CheckChallengeReceived?.Invoke(this, value);