Esempio n. 1
0
        /// <summary>
        /// Login with a stored <see cref="AccessToken" />.
        /// </summary>
        /// <param name="loginProvider">The OAuth provider you use to authenticate.</param>
        /// <param name="accessToken">The <see cref="AccessToken"/> you want to re-use.</param>
        /// <param name="coordinate">The initial coordinate you will spawn at after logging into PokémonGo.</param>
        /// <param name="deviceWrapper">The <see cref="DeviceWrapper"/> used by the <see cref="Session"/>, keep null if you want a randomly generated <see cref="DeviceWrapper"/>.</param>
        /// <param name = "playerLocale"></param>
        /// <returns></returns>
        public static Session GetSession(ILoginProvider loginProvider, AccessToken accessToken, GeoCoordinate coordinate, DeviceWrapper deviceWrapper = null, GetPlayerMessage.Types.PlayerLocale playerLocale = null)
        {
            DeviceWrapper device = deviceWrapper ?? DeviceInfoUtil.GetRandomDevice();

            GetPlayerMessage.Types.PlayerLocale locale = playerLocale ?? new GetPlayerMessage.Types.PlayerLocale {
                Country = "US", Language = "en", Timezone = "America/New_York"
            };
            string language = locale.Language + "-" + locale.Country;

            if (accessToken.IsExpired)
            {
                accessToken = loginProvider.GetAccessToken(device.UserAgent, language).Result;
                //throw new ArgumentException($"{nameof(accessToken)} is expired.");
            }

            var session = new Session(loginProvider, accessToken, coordinate, device, locale);

            session.Logger.Debug("Authenticated from cache.");
            if (loginProvider is PtcLoginProvider)
            {
                session.Logger.Debug("Authenticated through PTC.");
            }
            else
            {
                session.Logger.Debug("Authenticated through Google.");
            }
            return(session);
        }
Esempio n. 2
0
 internal Player(Session session, GeoCoordinate coordinate, GetPlayerMessage.Types.PlayerLocale playerLocale)
 {
     Coordinate               = coordinate;
     PlayerLocale             = playerLocale;
     Inventory                = new Inventory(session);
     session.InventoryUpdate += InventoryOnUpdate;
 }
Esempio n. 3
0
        public static Request GetPlayerMessageRequest(string country = "", string language = "", string zone = "")
        {
            var locale = new GetPlayerMessage.Types.PlayerLocale();

            locale.Country  = country;
            locale.Language = language;
            locale.Timezone = zone;
            var req = new Request
            {
                RequestType    = RequestType.GetPlayer,
                RequestMessage = new GetPlayerMessage {
                    PlayerLocale = locale
                }.ToByteString()
            };

            return(req);
        }
Esempio n. 4
0
        public void SetSettings(Manager manager)
        {
            Settings      = manager.UserSettings;
            ClientManager = manager;

            int osId = OsVersions[Settings.FirmwareType.Length].Length;
            var firmwareUserAgentPart = OsUserAgentParts[osId];
            var firmwareType          = OsVersions[osId];

            Proxy = new ProxyEx
            {
                Address  = Settings.ProxyIP,
                Port     = Settings.ProxyPort,
                Username = Settings.ProxyUsername,
                Password = Settings.ProxyPassword
            };

            ClientDeviceWrapper = new DeviceWrapper
            {
                UserAgent  = $"pokemongo/1 {firmwareUserAgentPart}",
                DeviceInfo = new DeviceInfo
                {
                    DeviceId              = Settings.DeviceId,
                    DeviceBrand           = Settings.DeviceBrand,
                    DeviceModelBoot       = Settings.DeviceModelBoot,
                    HardwareModel         = Settings.HardwareModel,
                    HardwareManufacturer  = Settings.HardwareManufacturer,
                    FirmwareBrand         = Settings.FirmwareBrand,
                    FirmwareType          = Settings.FirmwareType,
                    AndroidBoardName      = Settings.AndroidBoardName,
                    AndroidBootloader     = Settings.AndroidBootloader,
                    DeviceModel           = Settings.DeviceModel,
                    DeviceModelIdentifier = Settings.DeviceModelIdentifier,
                    FirmwareFingerprint   = Settings.FirmwareFingerprint,
                    FirmwareTags          = Settings.FirmwareTags
                },
                Proxy = Proxy.AsWebProxy()
            };

            PlayerLocale = new GetPlayerMessage.Types.PlayerLocale
            {
                Country  = Settings.Country,
                Language = Settings.Language,
                Timezone = Settings.TimeZone
            };
        }
Esempio n. 5
0
        public void SetSettings(Manager manager)
        {
            ClientManager = manager;

            Proxy = new ProxyEx
            {
                Address  = ClientManager.UserSettings.ProxyIP,
                Port     = ClientManager.UserSettings.ProxyPort,
                Username = ClientManager.UserSettings.ProxyUsername,
                Password = ClientManager.UserSettings.ProxyPassword
            };

            Dictionary <string, string> Header = new Dictionary <string, string>()
            {
                { "11.1.0", "CFNetwork/889.3 Darwin/17.2.0" },
                { "11.2.0", "CFNetwork/893.10 Darwin/17.3.0" },
                { "11.2.5", "CFNetwork/893.14.2 Darwin/17.4.0" }
            };

            ClientDeviceWrapper = new DeviceWrapper
            {
                UserAgent  = $"pokemongo/1 {Header[ClientManager.UserSettings.FirmwareType]}",
                DeviceInfo = new DeviceInfo
                {
                    DeviceId             = ClientManager.UserSettings.DeviceId,
                    DeviceBrand          = ClientManager.UserSettings.DeviceBrand,
                    DeviceModel          = ClientManager.UserSettings.DeviceModel,
                    DeviceModelBoot      = ClientManager.UserSettings.DeviceModelBoot,
                    HardwareManufacturer = ClientManager.UserSettings.HardwareManufacturer,
                    HardwareModel        = ClientManager.UserSettings.HardwareModel,
                    FirmwareBrand        = ClientManager.UserSettings.FirmwareBrand,
                    FirmwareType         = ClientManager.UserSettings.FirmwareType
                },
                Proxy = Proxy.AsWebProxy()
            };

            PlayerLocale = new GetPlayerMessage.Types.PlayerLocale
            {
                Country  = ClientManager.UserSettings.Country,
                Language = ClientManager.UserSettings.Language,
                Timezone = ClientManager.UserSettings.TimeZone
            };
        }
Esempio n. 6
0
        /// <summary>
        /// Login through OAuth with PTC / Google.
        /// </summary>
        /// <param name="loginProvider">The OAuth provider you use to authenticate.</param>
        /// <param name="initialLatitude">The initial latitude you will spawn at after logging into PokémonGo.</param>
        /// <param name="initialLongitude">The initial longitude you will spawn at after logging into PokémonGo.</param>
        /// <param name="deviceWrapper">The <see cref="DeviceWrapper"/> used by the <see cref="Session"/>, keep null if you want a randomly generated <see cref="DeviceWrapper"/>.</param>
        /// <param name = "playerLocale"></param>
        /// <returns></returns>
        public static async Task <Session> GetSession(ILoginProvider loginProvider, double initialLatitude, double initialLongitude, DeviceWrapper deviceWrapper = null, GetPlayerMessage.Types.PlayerLocale playerLocale = null)
        {
            DeviceWrapper device = deviceWrapper ?? DeviceInfoUtil.GetRandomDevice();

            GetPlayerMessage.Types.PlayerLocale locale = playerLocale ?? new GetPlayerMessage.Types.PlayerLocale {
                Country = "US", Language = "en", Timezone = "America/New_York"
            };
            string language = locale.Language + "-" + locale.Country;
            var    session  = new Session(loginProvider, await loginProvider.GetAccessToken(device.UserAgent, language), new GeoCoordinate(initialLatitude, initialLongitude), device, locale);

            if (loginProvider is PtcLoginProvider)
            {
                session.Logger.Debug("Authenticated through PTC.");
            }
            else
            {
                session.Logger.Debug("Authenticated through Google.");
            }
            return(session);
        }
Esempio n. 7
0
        public void SetSettings(Manager manager)
        {
            ClientManager = manager;

            int osId = OsVersions[ClientManager.UserSettings.DeviceInfo.FirmwareType.Length].Length;
            var firmwareUserAgentPart = OsUserAgentParts[osId];
            var firmwareType          = OsVersions[osId];

            Proxy = new ProxyEx
            {
                Address  = ClientManager.UserSettings.ProxyIP,
                Port     = ClientManager.UserSettings.ProxyPort,
                Username = ClientManager.UserSettings.ProxyUsername,
                Password = ClientManager.UserSettings.ProxyPassword
            };

            ClientDeviceWrapper = new DeviceWrapper
            {
                UserAgent  = $"pokemongo/1 {firmwareUserAgentPart}",
                DeviceInfo = new DeviceInfo
                {
                    DeviceId             = ClientManager.UserSettings.DeviceInfo.DeviceId,
                    DeviceBrand          = ClientManager.UserSettings.DeviceInfo.DeviceBrand,
                    DeviceModel          = ClientManager.UserSettings.DeviceInfo.DeviceModel,
                    DeviceModelBoot      = ClientManager.UserSettings.DeviceInfo.DeviceModelBoot,
                    HardwareManufacturer = ClientManager.UserSettings.DeviceInfo.HardwareManufacturer,
                    HardwareModel        = ClientManager.UserSettings.DeviceInfo.HardwareModel,
                    FirmwareBrand        = ClientManager.UserSettings.DeviceInfo.FirmwareBrand,
                    FirmwareType         = ClientManager.UserSettings.DeviceInfo.FirmwareType
                },
                Proxy = Proxy.AsWebProxy()
            };

            PlayerLocale = new GetPlayerMessage.Types.PlayerLocale
            {
                Country  = ClientManager.UserSettings.PlayerLocale.Country,
                Language = ClientManager.UserSettings.PlayerLocale.Language,
                Timezone = ClientManager.UserSettings.PlayerLocale.Timezone
            };
        }
Esempio n. 8
0
        private void SetSettings()
        {
            int osId = OsVersions[UserSettings.FirmwareType.Length].Length;
            var firmwareUserAgentPart = OsUserAgentParts[osId];
            var firmwareType          = OsVersions[osId];

            ClientDeviceWrapper = new DeviceWrapper
            {
                UserAgent  = $"pokemongo/1 {firmwareUserAgentPart}",
                DeviceInfo = new DeviceInfo
                {
                    DeviceId              = UserSettings.DeviceId,
                    DeviceBrand           = UserSettings.DeviceBrand,
                    DeviceModelBoot       = UserSettings.DeviceModelBoot,
                    HardwareModel         = UserSettings.HardwareModel,
                    HardwareManufacturer  = UserSettings.HardwareManufacturer,
                    FirmwareBrand         = UserSettings.FirmwareBrand,
                    FirmwareType          = UserSettings.FirmwareType,
                    AndroidBoardName      = UserSettings.AndroidBoardName,
                    AndroidBootloader     = UserSettings.AndroidBootloader,
                    DeviceModel           = UserSettings.DeviceModel,
                    DeviceModelIdentifier = UserSettings.DeviceModelIdentifier,
                    FirmwareFingerprint   = UserSettings.FirmwareFingerprint,
                    FirmwareTags          = UserSettings.FirmwareTags
                },
                //TODO: New in pogolib need port and user data!
                //ProxyAddress = UserSettings.ProxyIP
            };

            PlayerLocale = new GetPlayerMessage.Types.PlayerLocale
            {
                Country  = UserSettings.Country,
                Language = UserSettings.Language,
                Timezone = UserSettings.TimeZone
            };
        }
Esempio n. 9
0
        /// <summary>
        /// Login with a stored <see cref="AccessToken" />.
        /// </summary>
        /// <param name="loginProvider"></param>
        /// <param name="accessToken"></param>
        /// <param name="initialLatitude">The initial latitude you will spawn at after logging into PokémonGo.</param>
        /// <param name="initialLongitude">The initial longitude you will spawn at after logging into PokémonGo.</param>
        /// <param name="deviceWrapper">The <see cref="DeviceWrapper"/> used by the <see cref="Session"/>, keep null if you want a randomly generated <see cref="DeviceWrapper"/>.</param>
        /// <param name = "playerLocale"></param>
        /// <returns></returns>
        public static async Task <Session> GetSession(ILoginProvider loginProvider, AccessToken accessToken, double initialLatitude, double initialLongitude, DeviceWrapper deviceWrapper = null, GetPlayerMessage.Types.PlayerLocale playerLocale = null)
        {
            DeviceWrapper device = deviceWrapper ?? DeviceInfoUtil.GetRandomDevice();

            GetPlayerMessage.Types.PlayerLocale locale = playerLocale ?? new GetPlayerMessage.Types.PlayerLocale {
                Country = "US", Language = "en", Timezone = "America/New_York"
            };
            string language = locale.Language + "-" + locale.Country;

            if (accessToken == null || string.IsNullOrEmpty(accessToken.Token) || accessToken.IsExpired)
            {
                accessToken = await loginProvider.GetAccessToken(device.UserAgent, language);

                if (accessToken == null || string.IsNullOrEmpty(accessToken.Token) || accessToken.IsExpired)
                {
                    throw new SessionStateException($"{nameof(accessToken)} is expired.");
                }
            }

            var session = new Session(loginProvider, accessToken, new GeoCoordinate(initialLatitude, initialLongitude), device, locale);

            session.Logger.Debug("Authenticated from cache.");
            return(session);
        }
Esempio n. 10
0
        public async Task <GetPlayerResponse> GetPlayer(bool addCommonRequests = true, bool addChallengeRequests = false)
        {
            var locale = new GetPlayerMessage.Types.PlayerLocale
            {
                Country  = LocaleInfo.Country,
                Language = LocaleInfo.Language,
                Timezone = LocaleInfo.TimeZone
            };

            var getPlayerRequest = new Request
            {
                RequestType    = RequestType.GetPlayer,
                RequestMessage = new GetPlayerMessage()
                {
                    PlayerLocale = locale
                }.ToByteString()
            };

            if (addCommonRequests)
            {
                var requestEnvelope = await GetRequestBuilder().GetRequestEnvelope(CommonRequest.FillRequest(getPlayerRequest, Client)).ConfigureAwait(false);

                Tuple <GetPlayerResponse, CheckChallengeResponse, GetHatchedEggsResponse, GetHoloInventoryResponse, CheckAwardedBadgesResponse, DownloadSettingsResponse, GetBuddyWalkedResponse> response =
                    await
                    PostProtoPayload
                    <Request, GetPlayerResponse, CheckChallengeResponse, GetHatchedEggsResponse, GetHoloInventoryResponse,
                     CheckAwardedBadgesResponse, DownloadSettingsResponse, GetBuddyWalkedResponse>(requestEnvelope).ConfigureAwait(false);

                GetPlayerResponse getPlayerResponse = response.Item1;
                CommonRequest.ProcessGetPlayerResponse(Client, getPlayerResponse);

                CheckChallengeResponse checkChallengeResponse = response.Item2;
                CommonRequest.ProcessCheckChallengeResponse(Client, checkChallengeResponse);

                GetHoloInventoryResponse getHoloInventoryResponse = response.Item4;
                CommonRequest.ProcessGetHoloInventoryResponse(Client, getHoloInventoryResponse);

                DownloadSettingsResponse downloadSettingsResponse = response.Item6;
                CommonRequest.ProcessDownloadSettingsResponse(Client, downloadSettingsResponse);

                return(response.Item1);
            }
            if (addChallengeRequests)
            {
                var challengeRequest = new Request
                {
                    RequestType    = RequestType.CheckChallenge,
                    RequestMessage = new CheckChallengeMessage().ToByteString()
                };
                var requestEnvelope = await GetRequestBuilder().GetRequestEnvelope(new Request[] { getPlayerRequest, challengeRequest }).ConfigureAwait(false);

                Tuple <GetPlayerResponse, CheckChallengeResponse> response = await PostProtoPayload <Request, GetPlayerResponse, CheckChallengeResponse>(requestEnvelope).ConfigureAwait(false);

                CommonRequest.ProcessGetPlayerResponse(Client, response.Item1);

                return(response.Item1);
            }
            else
            {
                var requestEnvelope = await GetRequestBuilder().GetRequestEnvelope(new Request[] { getPlayerRequest }).ConfigureAwait(false);

                GetPlayerResponse getPlayerResponse = await PostProtoPayload <Request, GetPlayerResponse>(requestEnvelope).ConfigureAwait(false);

                CommonRequest.ProcessGetPlayerResponse(Client, getPlayerResponse);

                return(getPlayerResponse);
            }
        }
Esempio n. 11
0
        /// <summary>
        /// Stores data like assets and item templates. Defaults to an in-memory cache, but can be implemented as writing to disk by the platform
        /// </summary>
        // public IDataCache DataCache { get; set; } = new MemoryDataCache();
        // public Templates Templates { get; private set; }

        internal Session(ILoginProvider loginProvider, AccessToken accessToken, GeoCoordinate geoCoordinate, DeviceWrapper deviceWrapper, GetPlayerMessage.Types.PlayerLocale playerLocale)
        {
            if (!ValidLoginProviders.Contains(loginProvider.ProviderId))
            {
                throw new ArgumentException("LoginProvider ID must be one of the following: " + string.Join(", ", ValidLoginProviders));
            }
            Logger = new Logger();

            State = SessionState.Stopped;

            Device = deviceWrapper;

            var handler = new HttpClientHandler
            {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
                UseProxy = Device.Proxy != null,
                Proxy    = Device.Proxy
            };

            HttpClient = new HttpClient(handler);
            HttpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(Constants.ApiUserAgent);
            HttpClient.DefaultRequestHeaders.ExpectContinue = false;

            AccessToken = accessToken;

            if (IsValidAccessToken())
            {
                OnAccessTokenUpdated();
            }
            else
            {
                throw new SessionStateException("INVALID AUTH TOKEN");
            }

            LoginProvider = loginProvider;
            Player        = new Player(this, geoCoordinate, playerLocale);
            Map           = new Map(this);
            Templates     = new Templates(this);
            RpcClient     = new RpcClient(this);

            if (Configuration.EnableHeartbeat)
            {
                Heartbeat = new HeartbeatDispatcher(this);
            }
        }