Example #1
0
        public async Task <DiscordCommandResult> SlotsAsync(
            [Remainder][Range(3, 100, true, true)][Description("The item to display attachments for.")] string query)
        {
            var result = (await _tarkovSearch.SearchAsync($"name:{query}", DocType.Item, 1)).FirstOrDefault();

            if (result == null)
            {
                return(Reply("No items found for query!"));
            }

            var item = await _tarkov.GetItemAsync(result.Id, result.Kind);

            if (item is not IModifiableItem modifiableItem ||
                !modifiableItem.Slots.Any())
            {
                return(Reply("The base item provided is not modifiable!"));
            }

            var embed = new LocalEmbed()
            {
                Title        = $"{item.Name} ({item.ShortName})",
                Color        = item.Grid.Color,
                ThumbnailUrl = item.IconUrl,
                Description  = item.Description,
                Url          = item.WikiUrl
            };

            foreach (var slot in modifiableItem.Slots)
            {
                var items = new List <IItem>();

                foreach (var filter in slot.Value.Filter)
                {
                    var filterItems = await _tarkov.GetItemsAsync(filter.Key, filter.Value);

                    items.AddRange(filterItems);
                }

                var itemResult = items.Any() ? items.Humanize(x => $"`{x.ShortName}`") : "None";
                embed.AddField(slot.Key.Humanize(LetterCasing.Title), itemResult);
            }

            return(Reply(embed));
        }
Example #2
0
        public async Task <DiscordCommandResult> ModuleAsync(
            [Range(3, 32, true, true)][Description("The module to look for.")] string query,
            [Description("The level of the module to look for")] int level = 1)
        {
            var searchResult = await _tarkov.GetModulesAsync(2, query);

            // Workaround for some ambiguities
            var module = searchResult.OrderBy(x => x.Name.Length - query.Length).FirstOrDefault();

            if (module == null)
            {
                return(Reply("No module found for query!"));
            }

            if (level - 1 > module.Stages.Count)
            {
                return(Reply($"The specified module only has {module.Stages.Count} level(s)!"));
            }

            var stage = module.Stages[level - 1];

            var embed = new LocalEmbed()
            {
                Title       = module.Name,
                Description = stage.Description,
                Color       = new Disqord.Color(0x968867)
            };

            embed.AddField("Requires Power", module.RequiresPower ? "Yes" : "No", true);
            embed.AddField("Levels", $"{module.Stages.Count} (Showing {level})", true);
            var time = stage.ConstructionTime.TotalSeconds == 0 ? "Instant" : stage.ConstructionTime.Humanize(3);

            embed.AddField("Building Time", time, true);
            embed.WithFooter($"Modified {module.Modified.Humanize()}");

            if (stage.Materials.Any())
            {
                var materialRequirements = stage.Materials.GroupBy(x => x.Kind);
                var materials            = new Dictionary <IItem, int>();

                foreach (var requirement in materialRequirements)
                {
                    var items = await _tarkov.GetItemsAsync(requirement.Key, requirement.Select(x => x.Id));

                    foreach (var item in items)
                    {
                        materials.Add(item, requirement.FirstOrDefault(x => x.Id == item.Id).Count);
                    }
                }

                embed.AddField("Building Materials", materials.Humanize(x => $"{x.Value:N0}x {x.Key.Name}"), false);
            }

            if (stage.RequiredModules.Any())
            {
                var requiredModules = await _tarkov.GetModulesAsync(stage.RequiredModules.Select(x => x.Id));

                var modules = requiredModules
                              .ToDictionary(x => x, x => stage.RequiredModules.FirstOrDefault(y => y.Id == x.Id).Stage);

                embed.AddField("Required Modules", modules.Humanize(x => $"{x.Key.Name} L{x.Value + 1}"));
            }

            if (stage.Requirements.Any())
            {
                embed.AddField("Other Requirements", stage.Requirements.Humanize(x => $"{x.Name} L{x.Level}"));
            }

            var bonuses = "";

            var types = stage.Bonuses.Select(x => x.Type);

            if (stage.Bonuses.Any())
            {
                bonuses = bonuses.AddBonuses(module, level, stage.Bonuses);
            }

            var previousBonuses = module.Stages.Take(level - 1).SelectMany(x => x.Bonuses)
                                  .Where(x => !types.Contains(x.Type)).Distinct(new BonusTypeComparer());

            if (previousBonuses.Any())
            {
                bonuses += "**Previous Levels**\n";
                bonuses  = bonuses.AddBonuses(module, level, previousBonuses, true);
            }

            if (!string.IsNullOrEmpty(bonuses))
            {
                embed.AddField("Bonuses", bonuses);
            }

            return(Reply(embed));
        }