예제 #1
0
        public async Task <DiscordEmbed> BuildRaidMessage(RaidData raid, ulong userId)
        {
            var pkmn = _db.Pokemon[raid.PokemonId.ToString()];

            if (pkmn == null)
            {
                _logger.Error($"Failed to lookup Raid Pokemon '{raid.PokemonId}' in database.");
                return(null);
            }

            var user = await _client.GetMemberFromUserId(userId);

            if (user == null)
            {
                _logger.Error($"Failed to get discord member object from user id {userId}.");
                return(null);
            }

            //var loc = Utils.GetGoogleAddress(raid.Latitude, raid.Longitude, _config.GmapsKey);
            var loc = _geofenceSvc.GetGeofence(new Location(raid.Latitude, raid.Longitude));

            if (loc == null)
            {
                _logger.Error($"Failed to lookup city for coordinates {raid.Latitude},{raid.Longitude}, skipping...");
                return(null);
            }

            if (!_config.CityRoles.Exists(x => string.Compare(x, loc.Name, true) == 0))
            {
                File.AppendAllText("cities.txt", $"City: {loc.Name}\r\n");
            }

            if (!_client.HasRole(user, loc.Name))
            {
                _logger.Debug($"Skipping notification for user {user.DisplayName} ({user.Id}) for Pokemon {pkmn.Name} because they do not have the city role '{loc.Name}'.");
                return(null);
            }

            var eb = new DiscordEmbedBuilder
            {
                Title = loc == null || string.IsNullOrEmpty(loc.Name) ? "DIRECTIONS" : loc.Name,
                //Description = $"{pkmn.Name} raid available until {raid.EndTime.ToLongTimeString()}!",
                Url          = string.Format(Strings.GoogleMaps, raid.Latitude, raid.Longitude),
                ImageUrl     = string.Format(Strings.GoogleMapsStaticImage, raid.Latitude, raid.Longitude),
                ThumbnailUrl = string.Format(Strings.PokemonImage, raid.PokemonId, 0),
                Color        = DiscordHelpers.BuildRaidColor(Convert.ToInt32(raid.Level))
            };

            var fixedEndTime = DateTime.Parse(raid.EndTime.ToLongTimeString());
            var remaining    = GetTimeRemaining(fixedEndTime);

            eb.Description  = $"{pkmn.Name} Raid Ends: {raid.EndTime.ToLongTimeString()}\r\n\r\n";
            eb.Description += $"**Starts:** {raid.StartTime.ToLongTimeString()}\r\n";
            eb.Description += $"**Ends:** {raid.EndTime.ToLongTimeString()} ({remaining.ToReadableStringNoSeconds()} left)\r\n";

            var perfectRange = _db.GetPokemonCpRange(raid.PokemonId, 20);
            var boostedRange = _db.GetPokemonCpRange(raid.PokemonId, 25);

            eb.Description += $"**Perfect CP:** {perfectRange.Best} / :white_sun_rain_cloud: {boostedRange.Best}\r\n";

            if (pkmn.Types.Count > 0)
            {
                var types = new List <string>();
                pkmn.Types.ForEach(x =>
                {
                    if (Strings.TypeEmojis.ContainsKey(x.Type.ToLower()))
                    {
                        types.Add(Strings.TypeEmojis[x.Type.ToLower()] + " " + x.Type);
                    }
                });
                eb.Description += $"**Types:** {string.Join("/", types)}\r\n";
            }

            var fastMove = _db.Movesets.ContainsKey(raid.FastMove) ? _db.Movesets[raid.FastMove] : null;

            if (fastMove != null)
            {
                eb.Description += $"**Fast Move:** {Strings.TypeEmojis[fastMove.Type.ToLower()]} {fastMove.Name}\r\n";
            }

            var chargeMove = _db.Movesets.ContainsKey(raid.ChargeMove) ? _db.Movesets[raid.ChargeMove] : null;

            if (chargeMove != null)
            {
                eb.Description += $"**Charge Move:** {Strings.TypeEmojis[chargeMove.Type.ToLower()]} {chargeMove.Name}\r\n";
            }

            var strengths  = new List <string>();
            var weaknesses = new List <string>();

            foreach (var type in pkmn.Types)
            {
                foreach (var strength in PokemonExtensions.GetStrengths(type.Type))
                {
                    if (!strengths.Contains(strength))
                    {
                        strengths.Add(strength);
                    }
                }
                foreach (var weakness in PokemonExtensions.GetWeaknesses(type.Type))
                {
                    if (!weaknesses.Contains(weakness))
                    {
                        weaknesses.Add(weakness);
                    }
                }
            }

            if (strengths.Count > 0)
            {
                eb.Description += $"**Strong Against:** {string.Join(", ", strengths)}\r\n";
            }

            if (weaknesses.Count > 0)
            {
                eb.Description += $"**Weaknesses:** {string.Join(", ", weaknesses)}\r\n";
            }

            eb.Description += $"**Location:** {Math.Round(raid.Latitude, 5)},{Math.Round(raid.Longitude, 5)}";
            eb.ImageUrl     = string.Format(Strings.GoogleMapsStaticImage, raid.Latitude, raid.Longitude) + $"&key={_config.GmapsKey}";
            eb.Footer       = new DiscordEmbedBuilder.EmbedFooter
            {
                Text = $"versx | {DateTime.Now}"
            };
            var embed = eb.Build();

            return(embed);
        }
예제 #2
0
        public async Task Execute(DiscordMessage message, Command command)
        {
            if (!command.HasArgs)
            {
                return;
            }
            if (command.Args.Count != 1)
            {
                return;
            }

            var         cmd  = command.Args[0];
            PokemonInfo pkmn = null;

            if (!int.TryParse(cmd, out int pokeId))
            {
                foreach (var poke in _db.Pokemon)
                {
                    if (poke.Value.Name.ToLower().Contains(cmd))
                    {
                        pokeId = Convert.ToInt32(poke.Key);
                        pkmn   = poke.Value;
                        break;
                    }
                }
            }
            else
            {
                if (!_db.Pokemon.ContainsKey(pokeId.ToString()))
                {
                    await message.RespondAsync($"{message.Author.Mention}, failed to lookup Pokemon with id {pokeId}.");

                    return;
                }

                pkmn = _db.Pokemon[pokeId.ToString()];
            }

            if (pkmn == null)
            {
                await message.RespondAsync($"{message.Author.Mention}, failed to lookup Pokemon '{cmd}'.");

                return;
            }

            var types      = pkmn.Types.Count > 1 ? pkmn.Types[0].Type + "/" + pkmn.Types[1].Type : pkmn.Types[0].Type;
            var evolutions = (pkmn.Evolutions == null || pkmn.Evolutions.Count == 0 ? string.Empty : string.Join(", ", pkmn.Evolutions));

            var text = string.Empty;

            //var eb = new DiscordEmbedBuilder
            //{
            //    Author = new DiscordEmbedBuilder.EmbedAuthor
            //    {
            //        Name = $"{pkmn.Name} (Id: {pokeId}, Gen: {pkmn.BaseStats.Generation}{(pkmn.BaseStats.Legendary ? " Legendary" : "")})"
            //    }
            //};
            //eb.AddField(pkmn.Name, $"ID: {pokeId}, Gen: {pkmn.BaseStats.Generation}{(pkmn.BaseStats.Legendary ? " Legendary" : "")}", true);
            text += $"**{pkmn.Name}** (Id: {pokeId}, Gen {pkmn.BaseStats.Generation}{(pkmn.BaseStats.Legendary ? " Legendary" : "")})\r\n";

            if (Convert.ToUInt32(pokeId).IsValidRaidBoss(_config.RaidBosses))
            {
                var perfectRange = _db.GetPokemonCpRange(pokeId, 20);
                var boostedRange = _db.GetPokemonCpRange(pokeId, 25);
                text += $"**Perfect CP:** {perfectRange.Best.ToString("N0")} / :white_sun_rain_cloud: {boostedRange.Best.ToString("N0")}\r\n";
            }

            //eb.AddField("Base Stats:", $"Atk: {pkmn.BaseStats.Attack}, Def: {pkmn.BaseStats.Defense}, Sta: {pkmn.BaseStats.Stamina}", true);
            text += $"**Base Stats:** Atk: {pkmn.BaseStats.Attack}, Def: {pkmn.BaseStats.Defense}, Sta: {pkmn.BaseStats.Stamina}\r\n";
            if (!string.IsNullOrEmpty(pkmn.Rarity))
            {
                //eb.AddField("Rarity:", pkmn.Rarity, true);
                text += $"**Rarity:** {pkmn.Rarity}\r\n";
            }
            if (!string.IsNullOrEmpty(pkmn.SpawnRate))
            {
                //eb.AddField("Spawn Rate:", pkmn.SpawnRate, true);
                text += $"**Spawn Rate:** {pkmn.SpawnRate}\r\n";
            }
            //eb.AddField("Gender Ratio:", $"{Math.Round(pkmn.GenderRatio.Male * 100, 2)}% Male/{Math.Round(pkmn.GenderRatio.Female * 100, 2)}% Female", true);
            text += $"**Gender Ratio:** {Math.Round(pkmn.GenderRatio.Male * 100, 2)}% Male/{Math.Round(pkmn.GenderRatio.Female * 100, 2)}% Female\r\n";
            if (!string.IsNullOrEmpty(evolutions))
            {
                //eb.AddField("Evolutions:", evolutions, true);
                text += $"**Evolutions:** {evolutions}\r\n";
            }
            //eb.AddField("Type:", types, true);
            text += $"**Types:** {types}\r\n";

            var strengths  = new List <string>();
            var weaknesses = new List <string>();

            foreach (var type in types.Split('/'))
            {
                foreach (var strength in PokemonExtensions.GetStrengths(type))
                {
                    if (!strengths.Contains(strength.ToLower()))
                    {
                        strengths.Add(strength.ToLower());
                    }
                }
                foreach (var weakness in PokemonExtensions.GetWeaknesses(type))
                {
                    if (!weaknesses.Contains(weakness.ToLower()))
                    {
                        weaknesses.Add(weakness.ToLower());
                    }
                }
            }

            if (strengths.Count > 0)
            {
                text += $"**Strong Against:** :types_{string.Join(": :types_", strengths)}:\r\n";
                //eb.AddField("Strong Against:", ":types_" + string.Join(": :types_", strengths) + ":");
            }

            if (weaknesses.Count > 0)
            {
                //eb.AddField("Weaknesses:", ":types_" + string.Join(": :types_", weaknesses) + ":");
                text += $"**Weaknesses:** :types_{string.Join(": :types_", weaknesses)}:\r\n";
            }

            //eb.ImageUrl = string.Format(Strings.PokemonImage, pokeId, 0);
            //var embed = eb.Build();

            //await message.RespondAsync(test, false, embed);
            await message.RespondAsync(text);
        }