public async Task Post([FromBody] PokemonWebHookMessage body)
        {
            if (!ModelState.IsValid)
            {
                return;
            }

            if (body.Type != WebHookMessageType.Pokemon)
            {
                return;
            }

            var encounter = new PokemonEncounter
            {
                EncounterId   = body.Message.EncounterId,
                DisappearTime = DateTimeOffset.FromUnixTimeSeconds((long)body.Message.DisappearTime),
                SpawnpointId  = body.Message.SpawnpointId,
                PokemonId     = body.Message.PokemonId,
                Latitude      = body.Message.Latitude,
                Longitude     = body.Message.Longitude,
                IsLured       = body.Message.IsLured
            };

            await _notifier.AddEncounterAsync(encounter);
        }
Exemplo n.º 2
0
        public IActionResult Encounter(PokemonSearch pokemonSearch)
        {
            Local  local  = Locals.FindOneByID(pokemonSearch.LocalID);
            Player player = Players.FindOneByID(pokemonSearch.PlayerID);

            if (local != null && player != null)
            {
                Encounter encounter = new Encounter();
                encounter.ID       = ++GameState.EncounterID;
                encounter.LocalID  = pokemonSearch.LocalID;
                encounter.PlayerID = pokemonSearch.PlayerID;

                PokemonEncountered pokemonEncountered = PokemonEncounter.FindPokemon(local);
                encounter.PokemonEncountered = pokemonEncountered;

                if (pokemonEncountered != null)
                {
                    encounter.PokemonAlreadyCaught = player.Pokedex.Pokemons.FirstOrDefault(pokedexPokemon => pokedexPokemon.PokemonID == pokemonEncountered.LocalPokemon.PokemonID && pokedexPokemon.Enabled) != null;
                    encounter.CanBattle            = player.CatchedAnyPokemon();
                }

                GameState.Encounters.Add(encounter);
                return(Ok(encounter));
            }

            return(BadRequest());
        }
Exemplo n.º 3
0
        public IActionResult Catch(int encounterId)
        {
            Encounter encounter = GameState.Encounters.FirstOrDefault(_encounter => _encounter.ID == encounterId);

            Local  local  = Locals.FindOneByID(encounter.LocalID);
            Player player = Players.FindOneByID(encounter.PlayerID);

            if (local != null && player != null)
            {
                bool caught = PokemonEncounter.TryCatch(encounter.PokemonEncountered);

                if (caught)
                {
                    PokedexPokemon pokemonCaught = player.Pokedex.Pokemons.FirstOrDefault(pokedexPokemon => pokedexPokemon.PokemonID == encounter.PokemonEncountered.LocalPokemon.PokemonID && pokedexPokemon.Enabled);

                    if (pokemonCaught == null)
                    {
                        pokemonCaught                 = new PokedexPokemon();
                        pokemonCaught.PokemonID       = encounter.PokemonEncountered.LocalPokemon.PokemonID;
                        pokemonCaught.EncountersCount = 1;
                        pokemonCaught.Level           = encounter.PokemonEncountered.Level;
                    }
                    else
                    {
                        pokemonCaught.Level           = encounter.PokemonEncountered.Level;
                        pokemonCaught.EncountersCount = pokemonCaught.EncountersCount + 1;
                    }

                    pokemonCaught.Catched = true;
                    pokemonCaught.Enabled = true;

                    if (!encounter.PokemonAlreadyCaught)
                    {
                        pokemonCaught = Pokedexes.AddPokemon(pokemonCaught, player.Pokedex);
                    }
                    else
                    {
                        pokemonCaught = Pokedexes.UpdatePokemon(pokemonCaught, player.Pokedex);
                    }

                    if (!player.CatchedAnyPokemon())
                    {
                        player.MainPokedexPokemonID = pokemonCaught.ID;
                        Players.Update(player);
                    }
                }

                dynamic response = new ExpandoObject();
                response.caught = caught;

                GameState.Encounters.Remove(encounter);

                return(Ok(response));
            }

            return(BadRequest());
        }
Exemplo n.º 4
0
 private static void AssertIgnored(IgnoredPokemonService target, PokemonEncounter encounter, bool ignored, string name, string label)
 {
     if (ignored)
     {
         Assert.True(target.IsIgnored(encounter), $"{name} should be ignored {label}.");
     }
     else
     {
         Assert.False(target.IsIgnored(encounter), $"{name} should not be ignored {label}.");
     }
 }
Exemplo n.º 5
0
        public bool IsIgnored(PokemonEncounter encounter)
        {
            var point   = new Point(encounter.Longitude, encounter.Latitude);
            var ignored = false;

            foreach (var area in _areas)
            {
                if (area.Polygon.ContainsPoint(point))
                {
                    ignored = area.IgnoredPokemon.Contains(encounter.PokemonId);
                }
            }

            return(ignored);
        }
Exemplo n.º 6
0
        private void ButtonCatch_Click(object sender, RoutedEventArgs e)
        {
            bool isCaught = PokemonEncounter.TryCatch(PokemonEncountered);

            if (!isCaught)
            {
                MessageBox.Show("The Pokémon broken free. Wild " + PokemonEncountered.LocalPokemon.Pokemon.Name + " ran from battle!", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
                BackToRegion(false);
                return;
            }

            MessageBox.Show(PokemonEncountered.LocalPokemon.Pokemon.Name + " was caught!", "Gotcha!", MessageBoxButton.OK);

            Caught caught = new Caught(PokemonEncountered);

            caught.Closed += Caught_Closed;
            caught.ShowDialog();
        }
        public async Task AddEncounterAsync(PokemonEncounter encounter)
        {
            await _checkRepublicService.SendHeartbeatAsync(CancellationToken.None);

            if (_ignoredPokemonService.IsIgnored(encounter))
            {
                return;
            }

            var disappearsIn = encounter.DisappearTime - DateTimeOffset.Now;

            if (disappearsIn < TimeSpan.FromMinutes(1))
            {
                _logger.LogInformation("Encounter {encounterId} is too soon and therefore ignored.", encounter.EncounterId, encounter.PokemonId);
                return;
            }

            var existing = _notificationContext.PokemonEncounters.FirstOrDefault(x =>
                                                                                 x.EncounterId == encounter.EncounterId &&
                                                                                 x.DisappearTime == encounter.DisappearTime);

            if (existing != null)
            {
                _logger.LogInformation("Duplicate encounter {encounterId} found before inserting.", encounter.EncounterId);
                return;
            }

            try
            {
                _notificationContext.PokemonEncounters.Add(encounter);
                await _notificationContext.SaveChangesAsync();
            }
            catch (DbUpdateException exception) when(IsDuplicateException(exception))
            {
                _logger.LogInformation("Duplicate encounter {encounterId} found after inserting.", encounter.EncounterId);
                return;
            }

            // Build the notification.
            var notification = await _notificationBuilder.BuildNotificationAsync(encounter);

            // Send the notification.
            await _notificationService.SendNotificationAsync(notification);
        }
Exemplo n.º 8
0
        public async Task <Notification> BuildNotificationAsync(PokemonEncounter encounter)
        {
            var nameRecord = await _pokedexContext
                             .PokemonSpeciesNames
                             .Where(x => x.PokemonSpecies.Id == encounter.PokemonId)
                             .Where(x => x.LocalLanguage.Identifier == "en")
                             .FirstAsync();

            var name = nameRecord.Name;

            var disappearsIn  = encounter.DisappearTime - DateTimeOffset.Now;
            var disappearTime = encounter.DisappearTime.ToLocalTime().ToString("h:mm tt");
            var minutes       = (int)disappearsIn.TotalMinutes;
            var text          = $"A wild {name} has appeared! It disappears at {disappearTime} ({minutes} minute{(minutes != 1 ? "s" : string.Empty)} from now).";

            var mapUrl = GetMapUrl(encounter.PokemonId, encounter.Latitude, encounter.Longitude);

            var notification = new Notification
            {
                Text = text
            };

            if (_options.Value.UseNotificationImage)
            {
                notification.Image = new ImageAttachment
                {
                    Url = mapUrl
                };
            }

            if (_options.Value.UseNotificationLocation)
            {
                notification.Location = new LocationAttachment
                {
                    Name      = $"Location of the {name}",
                    Latitude  = encounter.Latitude,
                    Longitude = encounter.Longitude
                };
            }

            return(notification);
        }
Exemplo n.º 9
0
        private void ButtonBattle_Click(object sender, RoutedEventArgs e)
        {
            PokedexPokemon pokedexPokemon = Session.Player.Pokedex.Pokemons.FirstOrDefault(pokemon => Session.Player.MainPokedexPokemonID == pokemon.ID);
            bool           win            = PokemonEncounter.Battle(pokedexPokemon, PokemonEncountered);

            try {
                if (win)
                {
                    pokedexPokemon.Level += 1;
                    MessageBox.Show(pokedexPokemon.Pokemon.Name + " grew to lvl " + pokedexPokemon.Level + "!", "Win", MessageBoxButton.OK);
                    Pokedexes.UpdatePokemon(pokedexPokemon, Session.Player.Pokedex);

                    Session.UpdatePlayer();
                }
                else
                {
                    MessageBox.Show(pokedexPokemon.Pokemon.Name + " was fainted.", "Lose", MessageBoxButton.OK, MessageBoxImage.Warning);
                }

                BackToRegion(false);
            } catch {
                MessageBox.Show("An error has occurred, please try again later.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
Exemplo n.º 10
0
        private void ButtonRow_Click(object sender, RoutedEventArgs e)
        {
            Local local         = ((LocalData)((Button)e.Source).DataContext).Local;
            int   randomTimeout = new Random().Next(5000);

            ToggleLoading();
            Timeout timeout = new Timeout(() => {
                Application.Current.Dispatcher.Invoke((Action) delegate {
                    PokemonEncountered pokemonEncountered = PokemonEncounter.FindPokemon(local);

                    if (pokemonEncountered == null)
                    {
                        MessageBox.Show("No pokémons were found! Please, try again!", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
                        ToggleLoading();
                        return;
                    }

                    Encounter encounter = new Encounter(pokemonEncountered);

                    encounter.Show();
                    Hide();
                });
            }, randomTimeout);
        }
Exemplo n.º 11
0
        public IActionResult Battle(int encounterId)
        {
            Encounter encounter = GameState.Encounters.FirstOrDefault(_encounter => _encounter.ID == encounterId);

            Local  local  = Locals.FindOneByID(encounter.LocalID);
            Player player = Players.FindOneByID(encounter.PlayerID);

            if (local != null && player != null)
            {
                dynamic response = new ExpandoObject();

                if (encounter.CanBattle)
                {
                    bool win = PokemonEncounter.Battle(player.MainPokedexPokemon, encounter.PokemonEncountered);

                    if (win)
                    {
                        player.MainPokedexPokemon.Level += 1;
                        Pokedexes.UpdatePokemon(player.MainPokedexPokemon, player.Pokedex);
                    }

                    response.win         = win;
                    response.mainPokemon = player.MainPokedexPokemon;

                    GameState.Encounters.Remove(encounter);

                    return(Ok(response));
                }
                else
                {
                    return(StatusCode(500));
                }
            }

            return(BadRequest());
        }