Esempio n. 1
0
        private static List <SniperInfo> GetSniperInfoFrom_pokewatchers(ISession session, List <PokemonId> pokemonIds)
        {
            var uri = $"http://pokewatchers.com/api.php?act=grab";

            ScanResult_pokewatchers scanResult_pokewatchers;

            try
            {
                var handler = new ClearanceHandler();

                // Create a HttpClient that uses the handler.
                var client = new HttpClient(handler);

                // Our new firewall requires a user agent, or you'll be blocked.
                client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/511.2 (KHTML, like Gecko) Chrome/15.0.041.151 Safari/555.2");

                string response = null;
                int    retries  = 0;
                bool   retry;

                // Retry up to 5 times, sleeping for 1s between retries.
                do
                {
                    // Use the HttpClient as usual. Any JS challenge will be solved automatically for you.
                    response = client.GetStringAsync(uri).Result;
                    if (response == "You can only request the API every 5 seconds.")
                    {
                        retry = true;
                        Thread.Sleep(1000);
                    }
                    else
                    {
                        retry = false;
                    }
                } while (retry && (retries++ < 5));

                if (response == null || response == "You can only request the API every 5 seconds.")
                {
                    response = "[]";
                }

                var fullresp = "{ \"pokemons\":" + response + "}".Replace("Mr_mime", "MrMime");;
                scanResult_pokewatchers = JsonConvert.DeserializeObject <ScanResult_pokewatchers>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = "(PokeWatchers.com) " + ex.Message
                });
                return(null);
            }
            if (scanResult_pokewatchers.pokemons != null)
            {
                foreach (var pokemon in scanResult_pokewatchers.pokemons)
                {
                    try
                    {
                        var SnipInfo = new SniperInfo();
                        SnipInfo.Id = pokemon.pokemon;
                        string[] coordsArray = pokemon.cords.Split(',');
                        SnipInfo.Latitude            = Convert.ToDouble(coordsArray[0], CultureInfo.InvariantCulture);
                        SnipInfo.Longitude           = Convert.ToDouble(coordsArray[1], CultureInfo.InvariantCulture);
                        SnipInfo.TimeStampAdded      = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeadded);
                        SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeend);
                        SnipeLocations.Add(SnipInfo);
                    }
                    catch
                    {
                    }
                }
                var locationsToSnipe = new List <SniperInfo>();
                var status           = "";
                foreach (var q in SnipeLocations)
                {
                    if (!session.LogicSettings.UseTransferIvForSnipe || (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) || (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage))
                    {
                        if (!LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)))
                        {
                            if (q.ExpirationTimestamp != default(DateTime) && q.ExpirationTimestamp > new DateTime(2016) && q.ExpirationTimestamp > DateTime.UtcNow.AddSeconds(20))
                            {
                                if (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))
                                {
                                    locationsToSnipe.Add(q);
                                    status = "Snipe! Let's Go!";
                                }
                                else
                                {
                                    status = "Not User Selected Pokemon";
                                }
                            }
                            else
                            {
                                status = "Expired";
                            }
                        }
                        else
                        {
                            status = "Already Visited";
                        }
                    }
                    else
                    {
                        status = "IV too low  or user choosed ignore unknown IV pokemon";
                    }
                    var message = "Pokewatcher:  Found a " + q.Id + " in " + q.Latitude.ToString("0.0000") + "," + q.Longitude.ToString("0.0000") + " Time Remain:" +
                                  (q.ExpirationTimestamp - DateTime.Now).TotalSeconds.ToString("0") + "s " +
                                  " Status: " + status;

                    System.Diagnostics.Debug.Print(message);
                    session.EventDispatcher.Send(new SnipeEvent {
                        Message = message
                    });
                }
                return(locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList());
            }
            else
            {
                return(null);
            }
        }
Esempio n. 2
0
        public static async Task Start(Session session, CancellationToken cancellationToken)
        {
            while (true)
            {
                if (session.LogicSettings.UseSnipeOnlineLocationServer)
                {
                    try
                    {
                        using (var httpClient = new HttpClient())
                        {
                            httpClient.DefaultRequestHeaders.Accept.Add(
                                new MediaTypeWithQualityHeaderValue("application/json"));
                            var response =await
                                    httpClient.GetAsync("http://pokesnipers.com/api/v1/pokemon.json", cancellationToken);
                            response.EnsureSuccessStatusCode();
                            var json = await response.Content.ReadAsStringAsync();
                            dynamic pokesniper = JsonConvert.DeserializeObject(json);
                            JArray results = pokesniper.results;
                            SnipeLocations.Clear();
                            foreach (var result in results)
                            {
                                PokemonId id;
                                Enum.TryParse(result.Value<string>("name"), out id);
                                var a = new SniperInfo
                                {
                                    Id = id,
                                    Iv = 100,
                                    Latitude = Convert.ToDouble(result.Value<string>("coords").Split(',')[0]),
                                    Longitude = Convert.ToDouble(result.Value<string>("coords").Split(',')[1]),
                                    TimeStamp = DateTime.Now
                                };
                                SnipeLocations.Add(a);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        // ignored
                    }
                }
                else
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    try
                    {
                        var lClient = new TcpClient();
                        lClient.Connect(session.LogicSettings.SnipeLocationServer,
                            session.LogicSettings.SnipeLocationServerPort);

                        var sr = new StreamReader(lClient.GetStream());

                        while (lClient.Connected)
                        {
                            var line = sr.ReadLine();
                            if (line == null)
                                throw new Exception("Unable to ReadLine from sniper socket");

                            var info = JsonConvert.DeserializeObject<SniperInfo>(line);

                            if (SnipeLocations.Any(x =>
                                Math.Abs(x.Latitude - info.Latitude) < 0.0001 &&
                                Math.Abs(x.Longitude - info.Longitude) < 0.0001))
                                // we might have different precisions from other sources
                                continue;

                            SnipeLocations.RemoveAll(x => DateTime.Now > x.TimeStampAdded.AddMinutes(15));
                            SnipeLocations.Add(info);
                        }
                    }
                    catch (SocketException)
                    {
                        // this is spammed to often. Maybe add it to debug log later
                    }
                    catch (Exception ex)
                    {
                        // most likely System.IO.IOException
                        session.EventDispatcher.Send(new ErrorEvent {Message = ex.ToString()});
                    }
                }
                

                await Task.Delay(5000, cancellationToken);
            }
        }
Esempio n. 3
0
        private static List <SniperInfo> GetSniperInfoFrom_pokezz(ISession session, List <PokemonId> pokemonIds)
        {
            var options = new IO.Options();

            options.Transports = Quobject.Collections.Immutable.ImmutableList.Create <string>("websocket");

            var socket = IO.Socket("http://pokezz.com", options);

            var hasError = true;

            ManualResetEventSlim waitforbroadcast = new ManualResetEventSlim(false);

            List <PokemonLocation_pokezz> pokemons = new List <PokemonLocation_pokezz>();

            socket.On("a", (msg) =>
            {
                hasError = false;
                socket.Close();
                string[] pokemonDefinitions = ((String)msg).Split('~');
                foreach (var pokemonDefinition in pokemonDefinitions)
                {
                    try
                    {
                        string[] pokemonDefinitionElements   = pokemonDefinition.Split('|');
                        PokemonLocation_pokezz pokezzElement = new PokemonLocation_pokezz();
                        pokezzElement.name     = (PokemonId)Convert.ToInt32(pokemonDefinitionElements[0], CultureInfo.InvariantCulture);
                        pokezzElement.lat      = Convert.ToDouble(pokemonDefinitionElements[1], CultureInfo.InvariantCulture);
                        pokezzElement.lng      = Convert.ToDouble(pokemonDefinitionElements[2], CultureInfo.InvariantCulture);
                        pokezzElement.time     = Convert.ToDouble(pokemonDefinitionElements[3], CultureInfo.InvariantCulture);
                        pokezzElement.verified = (pokemonDefinitionElements[4] == "0") ? false : true;
                        pokezzElement.iv       = pokemonDefinitionElements[5];

                        pokemons.Add(pokezzElement);
                    }
                    catch (Exception)
                    {
                        // Just in case Pokezz changes their implementation, let's catch the error and set the error flag.
                        hasError = true;
                    }
                }

                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_ERROR, () =>
            {
                socket.Close();
                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_CONNECT_ERROR, () =>
            {
                socket.Close();
                waitforbroadcast.Set();
            });

            waitforbroadcast.Wait(5000); // Wait a maximum of 5 seconds for Pokezz to respond.
            socket.Close();
            if (!hasError)
            {
                foreach (var pokemon in pokemons)
                {
                    var SnipInfo = new SniperInfo();
                    SnipInfo.Id                  = pokemon.name;
                    SnipInfo.Latitude            = pokemon.lat;
                    SnipInfo.Longitude           = pokemon.lng;
                    SnipInfo.TimeStampAdded      = DateTime.Now;
                    SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(pokemon.time).ToLocalTime();
                    SnipInfo.IV                  = pokemon._iv;
                    if (pokemon.verified || !session.LogicSettings.GetOnlyVerifiedSniperInfoFromPokezz)
                    {
                        SnipeLocations.Add(SnipInfo);
                    }
                }

                var locationsToSnipe = SnipeLocations?.Where(q =>
                                                             (!session.LogicSettings.UseTransferIvForSnipe ||
                                                              (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                                                              (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                                                             !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)) &&
                                                             !(q.ExpirationTimestamp != default(DateTime) &&
                                                               q.ExpirationTimestamp > new DateTime(2016) &&
                                                               // make absolutely sure that the server sent a correct datetime
                                                               q.ExpirationTimestamp < DateTime.Now) &&
                                                             (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                                       new List <SniperInfo>();

                return(locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList());
            }
            else
            {
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = "(Pokezz.com) Connection Error"
                });
                return(null);
            }
        }
Esempio n. 4
0
        private static List <SniperInfo> GetSniperInfoFrom_pokesnipers(ISession session, List <PokemonId> pokemonIds)
        {
            var uri = $"http://pokesnipers.com/api/v1/pokemon.json";

            ScanResult_pokesnipers scanResult_pokesnipers;

            try
            {
                var handler = new ClearanceHandler();

                // Create a HttpClient that uses the handler.
                var client = new HttpClient(handler);

                // Use the HttpClient as usual. Any JS challenge will be solved automatically for you.
                var fullresp = client.GetStringAsync(uri).Result.Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime");

                scanResult_pokesnipers = JsonConvert.DeserializeObject <ScanResult_pokesnipers>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = "(PokeSnipers.com) " + ex.Message
                });
                return(null);
            }
            if (scanResult_pokesnipers.pokemons != null)
            {
                foreach (var pokemon in scanResult_pokesnipers.pokemons)
                {
                    try
                    {
                        var SnipInfo = new SniperInfo();
                        SnipInfo.Id = pokemon.name;
                        string[] coordsArray = pokemon.coords.Split(',');
                        SnipInfo.Latitude            = Convert.ToDouble(coordsArray[0], CultureInfo.InvariantCulture);
                        SnipInfo.Longitude           = Convert.ToDouble(coordsArray[1], CultureInfo.InvariantCulture);
                        SnipInfo.TimeStampAdded      = DateTime.Now;
                        SnipInfo.ExpirationTimestamp = Convert.ToDateTime(pokemon.until);
                        SnipInfo.IV = pokemon.iv;
                        SnipeLocations.Add(SnipInfo);
                    }
                    catch (Exception)
                    {
                        // ignored
                    }
                }
                var locationsToSnipe = new List <SniperInfo>();
                var status           = "";
                foreach (var q in SnipeLocations)
                {
                    if (!session.LogicSettings.UseTransferIvForSnipe || (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) || (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage))
                    {
                        if (!LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)))
                        {
                            if (q.ExpirationTimestamp != default(DateTime) && q.ExpirationTimestamp > new DateTime(2016) && q.ExpirationTimestamp > DateTime.Now.AddSeconds(20))
                            {
                                if (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))
                                {
                                    locationsToSnipe.Add(q);
                                    status = "Snipe! Let's Go!";
                                }
                                else
                                {
                                    status = "Not User Selected Pokemon";
                                }
                            }
                            else
                            {
                                status = "Expired";
                            }
                        }
                        else
                        {
                            status = "Already Visited";
                        }
                    }
                    else
                    {
                        status = "IV too low or user choosed ignore unknown IV pokemon";
                    }
                    var message = "Pokesniper: Found a " + q.Id + " in " + q.Latitude.ToString("0.0000") + "," + q.Longitude.ToString("0.0000") + " Time Remain:" +
                                  (q.ExpirationTimestamp - DateTime.Now).TotalSeconds.ToString("0") + "s " +
                                  " Status: " + status;

                    System.Diagnostics.Debug.Print(message);
                    session.EventDispatcher.Send(new SnipeEvent {
                        Message = message
                    });
                }
                return(locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList());
            }
            else
            {
                return(null);
            }
        }
Esempio n. 5
0
        private static List <SniperInfo> GetSniperInfoFrom_pokesnipers(ISession session, List <PokemonId> pokemonIds)
        {
            var uri = $"http://pokesnipers.com/api/v1/pokemon.json";

            ScanResult_pokesnipers scanResult_pokesnipers;

            try
            {
                var handler = new ClearanceHandler();

                // Create a HttpClient that uses the handler.
                var client = new HttpClient(handler);

                // Use the HttpClient as usual. Any JS challenge will be solved automatically for you.
                var fullresp = client.GetStringAsync(uri).Result.Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime");

                scanResult_pokesnipers = JsonConvert.DeserializeObject <ScanResult_pokesnipers>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = ex.Message
                });
                scanResult_pokesnipers = new ScanResult_pokesnipers
                {
                    Status   = "fail",
                    pokemons = new List <PokemonLocation_pokesnipers>()
                };
                return(new List <SniperInfo>());
            }
            if (scanResult_pokesnipers.pokemons != null)
            {
                SnipeLocations.RemoveAll(x => DateTime.Now > x.TimeStampAdded.AddMinutes(15));

                foreach (var pokemon in scanResult_pokesnipers.pokemons)
                {
                    var SnipInfo = new SniperInfo();
                    SnipInfo.Id = pokemon.name;
                    if (null != pokemon.coords)
                    {
                        string[] coordsArray = pokemon.coords.Split(',');
                        SnipInfo.Latitude            = Convert.ToDouble(coordsArray[0]);
                        SnipInfo.Longitude           = Convert.ToDouble(coordsArray[1]);
                        SnipInfo.TimeStampAdded      = DateTime.Now;
                        SnipInfo.ExpirationTimestamp = Convert.ToDateTime(pokemon.until);
                        SnipInfo.IV = pokemon.iv;
                        SnipeLocations.Add(SnipInfo);
                    }
                }

                var locationsToSnipe = SnipeLocations?.Where(q =>
                                                             (!session.LogicSettings.UseTransferIvForSnipe ||
                                                              (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                                                              (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                                                             !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)) &&
                                                             !(q.ExpirationTimestamp != default(DateTime) &&
                                                               q.ExpirationTimestamp > new DateTime(2016) &&
                                                               // make absolutely sure that the server sent a correct datetime
                                                               q.ExpirationTimestamp < DateTime.Now) &&
                                                             (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                                       new List <SniperInfo>();
                return(locationsToSnipe);
            }
            return(new List <SniperInfo>());
        }
Esempio n. 6
0
        private static List <SniperInfo> GetSniperInfoFrom_pokezz(ISession session, ICollection <PokemonId> pokemonIds)
        {
            var options = new IO.Options
            {
                Transports = ImmutableList.Create("websocket")
            };

            var socket = IO.Socket("http://pokezz.com", options);

            var hasError = true;

            var waitforbroadcast = new ManualResetEventSlim(false);

            var pokemons = new List <PokemonLocationPokezz>();

            socket.On("a", msg =>
            {
                hasError = false;
                socket.Close();
                var pokemonDefinitions = ((string)msg).Split('~');
                foreach (var pokemonDefinition in pokemonDefinitions)
                {
                    try
                    {
                        var pokemonDefinitionElements = pokemonDefinition.Split('|');
                        var pokezzElement             = new PokemonLocationPokezz
                        {
                            name =
                                (PokemonId)Convert.ToInt32(pokemonDefinitionElements[0], CultureInfo.InvariantCulture),
                            lat      = Convert.ToDouble(pokemonDefinitionElements[1], CultureInfo.InvariantCulture),
                            lng      = Convert.ToDouble(pokemonDefinitionElements[2], CultureInfo.InvariantCulture),
                            time     = Convert.ToDouble(pokemonDefinitionElements[3], CultureInfo.InvariantCulture),
                            verified = pokemonDefinitionElements[4] != "0",
                            iv       = pokemonDefinitionElements[5]
                        };

                        pokemons.Add(pokezzElement);
                    }
                    catch (Exception)
                    {
                        // Just in case Pokezz changes their implementation, let's catch the error and set the error flag.
                        hasError = true;
                    }
                }

                waitforbroadcast.Set();
            });

            socket.On(Socket.EVENT_ERROR, () =>
            {
                socket.Close();
                waitforbroadcast.Set();
            });

            socket.On(Socket.EVENT_CONNECT_ERROR, () =>
            {
                socket.Close();
                waitforbroadcast.Set();
            });

            waitforbroadcast.Wait(5000); // Wait a maximum of 5 seconds for Pokezz to respond.
            socket.Close();

            if (hasError)
            {
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = "(Pokezz.com) Connection Error"
                });
                return(null);
            }

            foreach (var pokemon in pokemons)
            {
                var snipInfo = new SniperInfo
                {
                    Id                  = pokemon.name,
                    Latitude            = pokemon.lat,
                    Longitude           = pokemon.lng,
                    TimeStampAdded      = DateTime.Now,
                    ExpirationTimestamp =
                        new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(pokemon.time).ToLocalTime(),
                    IV = pokemon._iv
                };
                if (pokemon.verified || !session.LogicSettings.GetOnlyVerifiedSniperInfoFromPokezz)
                {
                    SnipeLocations.Add(snipInfo);
                }
            }

            var locationsToSnipe = new List <SniperInfo>();

            foreach (var q in SnipeLocations)
            {
                string status;
                if (!session.LogicSettings.UseTransferIvForSnipe ||
                    (q.IV < 1 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                    (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage))
                {
                    if (!LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)))
                    {
                        if (q.ExpirationTimestamp != default(DateTime) && q.ExpirationTimestamp > new DateTime(2016) &&
                            q.ExpirationTimestamp > DateTime.Now.AddSeconds(20))
                        {
                            if (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))
                            {
                                locationsToSnipe.Add(q);
                                status = "Snipe! Let's Go!";
                            }
                            else
                            {
                                status = "Not User Selected Pokemon";
                            }
                        }
                        else
                        {
                            status = "Expired";
                        }
                    }
                    else
                    {
                        status = "Already Visited";
                    }
                }
                else
                {
                    status = "IV too low or user choosed ignore unknown IV pokemon";
                }
                var message = "Pokezz: Found a " + q.Id + " in " + q.Latitude.ToString("0.0000") + "," +
                              q.Longitude.ToString("0.0000") + " Time Remain:" +
                              (q.ExpirationTimestamp - DateTime.Now).TotalSeconds.ToString("0") + "s " +
                              " Status: " + status;

                Debug.Print(message);
                //session.EventDispatcher.Send(new SnipeEvent {Message = message});
            }
            return(locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList());
        }
Esempio n. 7
0
        private static List<SniperInfo> GetSniperInfoFrom_pokewatchers(ISession session, List<PokemonId> pokemonIds)
        {

            var uri = $"http://pokewatchers.com/api.php?act=grab";

            ScanResult_pokewatchers scanResult_pokewatchers;
            try
            {
                var handler = new ClearanceHandler();

                // Create a HttpClient that uses the handler.
                var client = new HttpClient(handler);

                // Use the HttpClient as usual. Any JS challenge will be solved automatically for you.
                var fullresp = "{ \"pokemons\":" + client.GetStringAsync(uri).Result.Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime") +"}";

                scanResult_pokewatchers = JsonConvert.DeserializeObject<ScanResult_pokewatchers>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent { Message = "(PokeWatchers.com) " + ex.Message });
                return null;
            }
            if (scanResult_pokewatchers.pokemons != null)
            {
                foreach (var pokemon in scanResult_pokewatchers.pokemons)
                {
                    try
                    {
                        var SnipInfo = new SniperInfo();
                        SnipInfo.Id = pokemon.pokemon;
                        string[] coordsArray = pokemon.cords.Split(',');
                        SnipInfo.Latitude = Convert.ToDouble(coordsArray[0], CultureInfo.InvariantCulture);
                        SnipInfo.Longitude = Convert.ToDouble(coordsArray[1], CultureInfo.InvariantCulture);
                        SnipInfo.TimeStampAdded = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeadded);
                        SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeend);
                        SnipeLocations.Add(SnipInfo);
                    }
                    catch
                    {
                    }
                }
                var locationsToSnipe = SnipeLocations?.Where(q =>
                    (!session.LogicSettings.UseTransferIvForSnipe ||
                    (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                    (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                    !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude))
                    && !(q.ExpirationTimestamp != default(DateTime) &&
                    q.ExpirationTimestamp > new DateTime(2016) &&
                    // make absolutely sure that the server sent a correct datetime
                    q.ExpirationTimestamp < DateTime.Now) &&
                    (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                    new List<SniperInfo>();

                return locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList();
            }
            else
                return null;
        }
Esempio n. 8
0
        private static List <SniperInfo> GetSniperInfoFrom_pokezz(ISession session, List <PokemonId> pokemonIds)
        {
            var uri = $"http://pokezz.com/pokemons.json";

            ScanResult_pokezz scanResult_pokezz;

            try
            {
                var request = WebRequest.CreateHttp(uri);
                request.Accept    = "application/json";
                request.UserAgent =
                    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36\r\n";
                request.Method           = "GET";
                request.Timeout          = 15000;
                request.ReadWriteTimeout = 32000;

                var resp     = request.GetResponse();
                var reader   = new StreamReader(resp.GetResponseStream());
                var fullresp = "{\"pokemons\": " + reader.ReadToEnd().Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime") + "}";

                scanResult_pokezz = JsonConvert.DeserializeObject <ScanResult_pokezz>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = ex.Message
                });
                scanResult_pokezz = new ScanResult_pokezz
                {
                    Status   = "fail",
                    pokemons = new List <PokemonLocation_pokezz>()
                };
                return(new List <SniperInfo>());
            }
            if (scanResult_pokezz.pokemons != null)
            {
                SnipeLocations.RemoveAll(x => DateTime.Now > x.TimeStampAdded.AddMinutes(15));

                foreach (var pokemon in scanResult_pokezz.pokemons)
                {
                    var SnipInfo = new SniperInfo();
                    SnipInfo.Id                  = pokemon.name;
                    SnipInfo.Latitude            = pokemon.lat;
                    SnipInfo.Longitude           = pokemon.lng;
                    SnipInfo.TimeStampAdded      = DateTime.Now;
                    SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(Math.Round(pokemon.time / 1000d)).ToLocalTime();
                    SnipInfo.IV                  = pokemon._iv;
                    if (pokemon.verified || !session.LogicSettings.GetOnlyVerifiedSniperInfoFromPokezz)
                    {
                        SnipeLocations.Add(SnipInfo);
                    }
                }

                var locationsToSnipe = SnipeLocations?.Where(q =>
                                                             (!session.LogicSettings.UseTransferIvForSnipe ||
                                                              (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                                                              (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                                                             !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)) &&
                                                             !(q.ExpirationTimestamp != default(DateTime) &&
                                                               q.ExpirationTimestamp > new DateTime(2016) &&
                                                               // make absolutely sure that the server sent a correct datetime
                                                               q.ExpirationTimestamp < DateTime.Now) &&
                                                             (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                                       new List <SniperInfo>();
                return(locationsToSnipe);
            }
            return(new List <SniperInfo>());
        }
Esempio n. 9
0
        private static List <SniperInfo> GetSniperInfoFrom_pokewatchers(ISession session, List <PokemonId> pokemonIds)
        {
            var uri = $"http://pokewatchers.com/api.php?act=grab";

            ScanResult_pokewatchers scanResult_pokewatchers;

            try
            {
                var handler = new ClearanceHandler();

                // Create a HttpClient that uses the handler.
                var client = new HttpClient(handler);

                // Use the HttpClient as usual. Any JS challenge will be solved automatically for you.
                var fullresp = "{ \"pokemons\":" + client.GetStringAsync(uri).Result.Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime") + "}";

                scanResult_pokewatchers = JsonConvert.DeserializeObject <ScanResult_pokewatchers>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = "(PokeWatchers.com) " + ex.Message
                });
                return(null);
            }
            if (scanResult_pokewatchers.pokemons != null)
            {
                foreach (var pokemon in scanResult_pokewatchers.pokemons)
                {
                    try
                    {
                        var SnipInfo = new SniperInfo();
                        SnipInfo.Id = pokemon.pokemon;
                        string[] coordsArray = pokemon.cords.Split(',');
                        SnipInfo.Latitude            = Convert.ToDouble(coordsArray[0], CultureInfo.InvariantCulture);
                        SnipInfo.Longitude           = Convert.ToDouble(coordsArray[1], CultureInfo.InvariantCulture);
                        SnipInfo.TimeStampAdded      = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeadded);
                        SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeend);
                        SnipeLocations.Add(SnipInfo);
                    }
                    catch
                    {
                    }
                }
                var locationsToSnipe = SnipeLocations?.Where(q =>
                                                             (!session.LogicSettings.UseTransferIvForSnipe ||
                                                              (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                                                              (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                                                             !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)) &&
                                                             !(q.ExpirationTimestamp != default(DateTime) &&
                                                               q.ExpirationTimestamp > new DateTime(2016) &&
                                                               // make absolutely sure that the server sent a correct datetime
                                                               q.ExpirationTimestamp < DateTime.Now) &&
                                                             (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                                       new List <SniperInfo>();

                return(locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList());
            }
            else
            {
                return(null);
            }
        }
Esempio n. 10
0
        private static List<SniperInfo> GetSniperInfoFrom_pokezz(ISession session, List<PokemonId> pokemonIds)
        {
            var options = new IO.Options();
            options.Transports = Quobject.Collections.Immutable.ImmutableList.Create<string>("websocket");

            var socket = IO.Socket("http://pokezz.com", options);

            var hasError = false;

            ManualResetEventSlim waitforbroadcast = new ManualResetEventSlim(false);

            List<PokemonLocation_pokezz> pokemons = new List<PokemonLocation_pokezz>();

            socket.On("pokemons", (msg) =>
            {
                socket.Close();
                JArray data = JArray.FromObject(msg);

                foreach (var pokeToken in data.Children())
                {
                    var Token = pokeToken.ToString().Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime");
                    pokemons.Add(JToken.Parse(Token).ToObject<PokemonLocation_pokezz>());
                }

                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_ERROR, () =>
            {
                socket.Close();
                hasError = true;
                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_CONNECT_ERROR, () =>
            {
                socket.Close();
                hasError = true;
                waitforbroadcast.Set();
            });

            waitforbroadcast.Wait();
            if (!hasError)
            {
                foreach (var pokemon in pokemons)
                {
                    var SnipInfo = new SniperInfo();
                    SnipInfo.Id = pokemon.name;
                    SnipInfo.Latitude = pokemon.lat;
                    SnipInfo.Longitude = pokemon.lng;
                    SnipInfo.TimeStampAdded = DateTime.Now;
                    SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(Math.Round(pokemon.time / 1000d)).ToLocalTime();
                    SnipInfo.IV = pokemon._iv;
                    if (pokemon.verified || !session.LogicSettings.GetOnlyVerifiedSniperInfoFromPokezz)
                        SnipeLocations.Add(SnipInfo);
                }

                var locationsToSnipe = SnipeLocations?.Where(q =>
                    (!session.LogicSettings.UseTransferIvForSnipe ||
                    (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                    (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                    !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude))
                    && !(q.ExpirationTimestamp != default(DateTime) &&
                    q.ExpirationTimestamp > new DateTime(2016) &&
                    // make absolutely sure that the server sent a correct datetime
                    q.ExpirationTimestamp < DateTime.Now) &&
                    (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                    new List<SniperInfo>();

                return locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList();
            }
            else
            {
                session.EventDispatcher.Send(new ErrorEvent {Message = "(Pokezz.com) Connection Error"});
                return null;
            }
        }
Esempio n. 11
0
        private static List <SniperInfo> GetSniperInfoFrom_pokezz(ISession session, List <PokemonId> pokemonIds)
        {
            var options = new IO.Options();

            options.Transports = Quobject.Collections.Immutable.ImmutableList.Create <string>("websocket");

            var socket = IO.Socket("http://pokezz.com", options);

            var hasError = false;

            ManualResetEventSlim waitforbroadcast = new ManualResetEventSlim(false);

            List <PokemonLocation_pokezz> pokemons = new List <PokemonLocation_pokezz>();

            socket.On("pokemons", (msg) =>
            {
                socket.Close();
                JArray data = JArray.FromObject(msg);

                foreach (var pokeToken in data.Children())
                {
                    var Token = pokeToken.ToString().Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime");
                    pokemons.Add(JToken.Parse(Token).ToObject <PokemonLocation_pokezz>());
                }

                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_ERROR, () =>
            {
                socket.Close();
                hasError = true;
                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_CONNECT_ERROR, () =>
            {
                socket.Close();
                hasError = true;
                waitforbroadcast.Set();
            });

            waitforbroadcast.Wait();
            if (!hasError)
            {
                foreach (var pokemon in pokemons)
                {
                    var SnipInfo = new SniperInfo();
                    SnipInfo.Id                  = pokemon.name;
                    SnipInfo.Latitude            = pokemon.lat;
                    SnipInfo.Longitude           = pokemon.lng;
                    SnipInfo.TimeStampAdded      = DateTime.Now;
                    SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(Math.Round(pokemon.time / 1000d)).ToLocalTime();
                    SnipInfo.IV                  = pokemon._iv;
                    if (pokemon.verified || !session.LogicSettings.GetOnlyVerifiedSniperInfoFromPokezz)
                    {
                        SnipeLocations.Add(SnipInfo);
                    }
                }

                var locationsToSnipe = SnipeLocations?.Where(q =>
                                                             (!session.LogicSettings.UseTransferIvForSnipe ||
                                                              (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                                                              (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                                                             !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude)) &&
                                                             !(q.ExpirationTimestamp != default(DateTime) &&
                                                               q.ExpirationTimestamp > new DateTime(2016) &&
                                                               // make absolutely sure that the server sent a correct datetime
                                                               q.ExpirationTimestamp < DateTime.Now) &&
                                                             (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                                       new List <SniperInfo>();

                return(locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList());
            }
            else
            {
                session.EventDispatcher.Send(new ErrorEvent {
                    Message = "(Pokezz.com) Connection Error"
                });
                return(null);
            }
        }
Esempio n. 12
0
        private static List<SniperInfo> GetSniperInfoFrom_pokezz(ISession session, List<PokemonId> pokemonIds)
        {

            var uri = $"http://pokezz.com/pokemons.json";

            ScanResult_pokezz scanResult_pokezz;
            try
            {
                var request = WebRequest.CreateHttp(uri);
                request.Accept = "application/json";
                request.UserAgent =
                    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36\r\n";
                request.Method = "GET";
                request.Timeout = 15000;
                request.ReadWriteTimeout = 32000;

                var resp = request.GetResponse();
                var reader = new StreamReader(resp.GetResponseStream());
                var fullresp = "{\"pokemons\": " + reader.ReadToEnd().Replace(" M", "Male").Replace(" F", "Female").Replace("Farfetch'd", "Farfetchd").Replace("Mr.Maleime", "MrMime") +"}";
    
                scanResult_pokezz = JsonConvert.DeserializeObject<ScanResult_pokezz>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent { Message = ex.Message });
                scanResult_pokezz = new ScanResult_pokezz
                {
                    Status = "fail",
                    pokemons = new List<PokemonLocation_pokezz>()
                };
                return new List<SniperInfo>();
            }
            if (scanResult_pokezz.pokemons != null)
            {

                SnipeLocations.RemoveAll(x => DateTime.Now > x.TimeStampAdded.AddMinutes(15));

                foreach (var pokemon in scanResult_pokezz.pokemons)
                {
                    var SnipInfo = new SniperInfo();
                    SnipInfo.Id = pokemon.name;
                    SnipInfo.Latitude = pokemon.lat;
                    SnipInfo.Longitude = pokemon.lng;
                    SnipInfo.TimeStampAdded = DateTime.Now;
                    SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(Math.Round(pokemon.time / 1000d)).ToLocalTime();
                    SnipInfo.IV = pokemon._iv;
                    if (pokemon.verified || !session.LogicSettings.GetOnlyVerifiedSniperInfoFromPokezz)
                    {
                        SnipeLocations.Add(SnipInfo);
                    }
                }

                var locationsToSnipe = SnipeLocations?.Where(q =>
                (!session.LogicSettings.UseTransferIvForSnipe ||
                 (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                 (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude))
                && !(q.ExpirationTimestamp != default(DateTime) &&
                     q.ExpirationTimestamp > new DateTime(2016) &&
                     // make absolutely sure that the server sent a correct datetime
                     q.ExpirationTimestamp < DateTime.Now) &&
                (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                                   new List<SniperInfo>();
                return locationsToSnipe;
            }
            return new List<SniperInfo>();
        }
Esempio n. 13
0
        public static async Task Start(Session session, CancellationToken cancellationToken)
        {
            while (true)
            {
                if (session.LogicSettings.UseSnipeOnlineLocationServer)
                {
                    try
                    {
                        using (var httpClient = new HttpClient())
                        {
                            httpClient.DefaultRequestHeaders.Accept.Add(
                                new MediaTypeWithQualityHeaderValue("application/json"));
                            var response = await
                                           httpClient.GetAsync("http://pokesnipers.com/api/v1/pokemon.json", cancellationToken);

                            response.EnsureSuccessStatusCode();
                            var json = await response.Content.ReadAsStringAsync();

                            dynamic pokesniper = JsonConvert.DeserializeObject(json);
                            JArray  results    = pokesniper.results;
                            SnipeLocations.Clear();
                            foreach (var result in results)
                            {
                                PokemonId id;
                                Enum.TryParse(result.Value <string>("name"), out id);
                                var a = new SniperInfo
                                {
                                    Id        = id,
                                    Iv        = 100,
                                    Latitude  = Convert.ToDouble(result.Value <string>("coords").Split(',')[0]),
                                    Longitude = Convert.ToDouble(result.Value <string>("coords").Split(',')[1]),
                                    TimeStamp = DateTime.Now
                                };
                                SnipeLocations.Add(a);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        // ignored
                    }
                }
                else
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    try
                    {
                        var lClient = new TcpClient();
                        lClient.Connect(session.LogicSettings.SnipeLocationServer,
                                        session.LogicSettings.SnipeLocationServerPort);

                        var sr = new StreamReader(lClient.GetStream());

                        while (lClient.Connected)
                        {
                            var line = sr.ReadLine();
                            if (line == null)
                            {
                                throw new Exception("Unable to ReadLine from sniper socket");
                            }

                            var info = JsonConvert.DeserializeObject <SniperInfo>(line);

                            if (SnipeLocations.Any(x =>
                                                   Math.Abs(x.Latitude - info.Latitude) < 0.0001 &&
                                                   Math.Abs(x.Longitude - info.Longitude) < 0.0001))
                            {
                                // we might have different precisions from other sources
                                continue;
                            }

                            SnipeLocations.RemoveAll(x => DateTime.Now > x.TimeStampAdded.AddMinutes(15));
                            SnipeLocations.Add(info);
                        }
                    }
                    catch (SocketException)
                    {
                        // this is spammed to often. Maybe add it to debug log later
                    }
                    catch (Exception ex)
                    {
                        // most likely System.IO.IOException
                        session.EventDispatcher.Send(new ErrorEvent {
                            Message = ex.ToString()
                        });
                    }
                }


                await Task.Delay(5000, cancellationToken);
            }
        }
Esempio n. 14
0
        private static List<SniperInfo> GetSniperInfoFrom_pokewatchers(ISession session, List<PokemonId> pokemonIds)
        {

            var uri = $"http://pokewatchers.com/api.php?act=grab";

            ScanResult_pokewatchers scanResult_pokewatchers;
            try
            {
                var handler = new ClearanceHandler();

                // Create a HttpClient that uses the handler.
                var client = new HttpClient(handler);
                
                // Our new firewall requires a user agent, or you'll be blocked.
                client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/511.2 (KHTML, like Gecko) Chrome/15.0.041.151 Safari/555.2");

                string response = null;
                int retries = 0;
                bool retry;

                // Retry up to 5 times, sleeping for 1s between retries.
                do
                {
                    // Use the HttpClient as usual. Any JS challenge will be solved automatically for you.
                    response = client.GetStringAsync(uri).Result;
                    if (response == "You can only request the API every 5 seconds.")
                    {
                        retry = true;
                        Thread.Sleep(1000);
                    }
                    else
                    {
                        retry = false;
                    }
                } while (retry && (retries++ < 5));
                
                if (response == null || response == "You can only request the API every 5 seconds.")
                {
                    response = "[]";
                }
                
                var fullresp = "{ \"pokemons\":" + response + "}".Replace("Mr_mime", "MrMime"); ;
                scanResult_pokewatchers = JsonConvert.DeserializeObject<ScanResult_pokewatchers>(fullresp);
            }
            catch (Exception ex)
            {
                // most likely System.IO.IOException
                session.EventDispatcher.Send(new ErrorEvent { Message = "(PokeWatchers.com) " + ex.Message });
                return null;
            }
            if (scanResult_pokewatchers.pokemons != null)
            {
                foreach (var pokemon in scanResult_pokewatchers.pokemons)
                {
                    try
                    {
                        var SnipInfo = new SniperInfo();
                        SnipInfo.Id = pokemon.pokemon;
                        string[] coordsArray = pokemon.cords.Split(',');
                        SnipInfo.Latitude = Convert.ToDouble(coordsArray[0], CultureInfo.InvariantCulture);
                        SnipInfo.Longitude = Convert.ToDouble(coordsArray[1], CultureInfo.InvariantCulture);
                        SnipInfo.TimeStampAdded = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeadded);
                        SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(pokemon.timeend);
                        SnipeLocations.Add(SnipInfo);
                    }
                    catch
                    {
                    }
                }
                var locationsToSnipe = SnipeLocations?.Where(q =>
                    (!session.LogicSettings.UseTransferIvForSnipe ||
                    (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                    (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                    !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude))
                    && !(q.ExpirationTimestamp != default(DateTime) &&
                    q.ExpirationTimestamp > new DateTime(2016) &&
                    // make absolutely sure that the server sent a correct datetime
                    q.ExpirationTimestamp < DateTime.Now) &&
                    (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                    new List<SniperInfo>();

                return locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList();
            }
            else
                return null;
        }
Esempio n. 15
0
        private static List<SniperInfo> GetSniperInfoFrom_pokezz(ISession session, List<PokemonId> pokemonIds)
        {
            var options = new IO.Options();
            options.Transports = Quobject.Collections.Immutable.ImmutableList.Create<string>("websocket");

            var socket = IO.Socket("http://pokezz.com", options);

            var hasError = true;

            ManualResetEventSlim waitforbroadcast = new ManualResetEventSlim(false);

            List<PokemonLocation_pokezz> pokemons = new List<PokemonLocation_pokezz>();

            socket.On("a", (msg) =>
            {
                hasError = false;
                socket.Close();
                string[] pokemonDefinitions = ((String)msg).Split('~');
                foreach (var pokemonDefinition in pokemonDefinitions)
                {
                    try
                    {
                        string[] pokemonDefinitionElements = pokemonDefinition.Split('|');
                        PokemonLocation_pokezz pokezzElement = new PokemonLocation_pokezz();
                        pokezzElement.name = (PokemonId)Convert.ToInt32(pokemonDefinitionElements[0], CultureInfo.InvariantCulture);
                        pokezzElement.lat = Convert.ToDouble(pokemonDefinitionElements[1], CultureInfo.InvariantCulture);
                        pokezzElement.lng = Convert.ToDouble(pokemonDefinitionElements[2], CultureInfo.InvariantCulture);
                        pokezzElement.time = Convert.ToDouble(pokemonDefinitionElements[3], CultureInfo.InvariantCulture);
                        pokezzElement.verified = (pokemonDefinitionElements[4] == "0") ? false : true;
                        pokezzElement.iv = pokemonDefinitionElements[5];

                        pokemons.Add(pokezzElement);
                    }
                    catch(Exception)
                    {
                        // Just in case Pokezz changes their implementation, let's catch the error and set the error flag.
                        hasError = true;
                    }
                }
                
                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_ERROR, () =>
            {
                socket.Close();
                waitforbroadcast.Set();
            });

            socket.On(Quobject.SocketIoClientDotNet.Client.Socket.EVENT_CONNECT_ERROR, () =>
            {
                socket.Close();
                waitforbroadcast.Set();
            });

            waitforbroadcast.Wait(5000); // Wait a maximum of 5 seconds for Pokezz to respond.
            socket.Close();
            if (!hasError)
            {
                foreach (var pokemon in pokemons)
                {
                    var SnipInfo = new SniperInfo();
                    SnipInfo.Id = pokemon.name;
                    SnipInfo.Latitude = pokemon.lat;
                    SnipInfo.Longitude = pokemon.lng;
                    SnipInfo.TimeStampAdded = DateTime.Now;
                    SnipInfo.ExpirationTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(pokemon.time).ToLocalTime();
                    SnipInfo.IV = pokemon._iv;
                    if (pokemon.verified || !session.LogicSettings.GetOnlyVerifiedSniperInfoFromPokezz)
                        SnipeLocations.Add(SnipInfo);
                }

                var locationsToSnipe = SnipeLocations?.Where(q =>
                    (!session.LogicSettings.UseTransferIvForSnipe ||
                    (q.IV == 0 && !session.LogicSettings.SnipeIgnoreUnknownIv) ||
                    (q.IV >= session.Inventory.GetPokemonTransferFilter(q.Id).KeepMinIvPercentage)) &&
                    !LocsVisited.Contains(new PokemonLocation(q.Latitude, q.Longitude))
                    && !(q.ExpirationTimestamp != default(DateTime) &&
                    q.ExpirationTimestamp > new DateTime(2016) &&
                    // make absolutely sure that the server sent a correct datetime
                    q.ExpirationTimestamp < DateTime.Now) &&
                    (q.Id == PokemonId.Missingno || pokemonIds.Contains(q.Id))).ToList() ??
                    new List<SniperInfo>();

                return locationsToSnipe.OrderBy(q => q.ExpirationTimestamp).ToList();
            }
            else
            {
                session.EventDispatcher.Send(new ErrorEvent {Message = "(Pokezz.com) Connection Error"});
                return null;
            }
        }