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)); }
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)); }