| | | 1 | | using System.Text; |
| | | 2 | | using System.Text.Json; |
| | | 3 | | using static Chronicis.Api.Services.ExternalLinks.Open5eJsonHelpers; |
| | | 4 | | |
| | | 5 | | namespace Chronicis.Api.Services.ExternalLinks; |
| | | 6 | | |
| | | 7 | | public sealed class SpellCategoryStrategy : Open5eCategoryStrategyBase |
| | | 8 | | { |
| | 112 | 9 | | public override string CategoryKey => "spells"; |
| | 12 | 10 | | public override string Endpoint => "spells"; |
| | 41 | 11 | | public override string DisplayName => "Spell"; |
| | 3 | 12 | | public override string? Icon => "✨"; |
| | | 13 | | |
| | | 14 | | public override string BuildMarkdown(JsonElement root, string title) |
| | | 15 | | { |
| | 9 | 16 | | var sb = new StringBuilder(); |
| | 9 | 17 | | sb.AppendLine($"# {title}"); |
| | 9 | 18 | | sb.AppendLine(); |
| | | 19 | | |
| | 9 | 20 | | AppendLevelAndSchool(sb, root); |
| | 9 | 21 | | AppendCastingInfo(sb, root); |
| | 9 | 22 | | AppendComponents(sb, root); |
| | 9 | 23 | | sb.AppendLine(); |
| | 9 | 24 | | AppendDescription(sb, root); |
| | 9 | 25 | | AppendHigherLevels(sb, root); |
| | | 26 | | |
| | 9 | 27 | | return sb.ToString().Trim(); |
| | | 28 | | } |
| | | 29 | | |
| | | 30 | | public override string BuildSubtitle(JsonElement item) |
| | | 31 | | { |
| | 34 | 32 | | var parts = new List<string> { DisplayName }; |
| | | 33 | | |
| | 34 | 34 | | var level = GetInt(item, "level"); |
| | 34 | 35 | | var school = GetStringFromObject(item, "school", "name"); |
| | 34 | 36 | | if (level.HasValue) |
| | | 37 | | { |
| | 33 | 38 | | parts.Add(level == 0 ? "Cantrip" : $"Level {level}"); |
| | | 39 | | } |
| | 34 | 40 | | if (!string.IsNullOrEmpty(school)) |
| | | 41 | | { |
| | 32 | 42 | | parts.Add(school); |
| | | 43 | | } |
| | | 44 | | |
| | 34 | 45 | | return string.Join(" • ", parts); |
| | | 46 | | } |
| | | 47 | | |
| | | 48 | | private static void AppendLevelAndSchool(StringBuilder sb, JsonElement root) |
| | | 49 | | { |
| | 9 | 50 | | var level = GetInt(root, "level"); |
| | 9 | 51 | | var school = GetStringFromObject(root, "school", "name"); |
| | 9 | 52 | | var levelText = level == 0 ? "Cantrip" : $"Level {level}"; |
| | | 53 | | |
| | 9 | 54 | | sb.AppendLine(!string.IsNullOrEmpty(school) ? $"*{levelText} {school}*" : $"*{levelText}*"); |
| | 9 | 55 | | sb.AppendLine(); |
| | 9 | 56 | | } |
| | | 57 | | |
| | | 58 | | private static void AppendCastingInfo(StringBuilder sb, JsonElement root) |
| | | 59 | | { |
| | 9 | 60 | | var castingTime = GetString(root, "casting_time"); |
| | 9 | 61 | | var range = GetString(root, "range_text") ?? GetString(root, "range")?.ToString(); |
| | 9 | 62 | | var duration = GetString(root, "duration"); |
| | 9 | 63 | | var concentration = GetBool(root, "concentration"); |
| | 9 | 64 | | var ritual = GetBool(root, "ritual"); |
| | | 65 | | |
| | 9 | 66 | | sb.AppendLine("## Casting"); |
| | 9 | 67 | | if (!string.IsNullOrEmpty(castingTime)) |
| | 3 | 68 | | sb.AppendLine($"- **Casting Time:** {castingTime}{(ritual == true ? " (ritual)" : "")}"); |
| | 9 | 69 | | if (!string.IsNullOrEmpty(range)) |
| | 3 | 70 | | sb.AppendLine($"- **Range:** {range}"); |
| | 9 | 71 | | if (!string.IsNullOrEmpty(duration)) |
| | 3 | 72 | | sb.AppendLine($"- **Duration:** {(concentration == true ? "Concentration, " : "")}{duration}"); |
| | 9 | 73 | | } |
| | | 74 | | |
| | | 75 | | private static void AppendComponents(StringBuilder sb, JsonElement root) |
| | | 76 | | { |
| | 9 | 77 | | var verbal = GetBool(root, "verbal"); |
| | 9 | 78 | | var somatic = GetBool(root, "somatic"); |
| | 9 | 79 | | var material = GetBool(root, "material"); |
| | 9 | 80 | | var materialDesc = GetString(root, "material_specified"); |
| | | 81 | | |
| | 9 | 82 | | var components = new List<string>(); |
| | 9 | 83 | | if (verbal == true) |
| | 1 | 84 | | components.Add("V"); |
| | 9 | 85 | | if (somatic == true) |
| | 1 | 86 | | components.Add("S"); |
| | 9 | 87 | | if (material == true) |
| | 2 | 88 | | components.Add($"M{(!string.IsNullOrEmpty(materialDesc) ? $" ({materialDesc})" : "")}"); |
| | 9 | 89 | | if (components.Count > 0) |
| | 2 | 90 | | sb.AppendLine($"- **Components:** {string.Join(", ", components)}"); |
| | 9 | 91 | | } |
| | | 92 | | |
| | | 93 | | private static void AppendDescription(StringBuilder sb, JsonElement root) |
| | | 94 | | { |
| | 9 | 95 | | var desc = GetString(root, "desc"); |
| | 9 | 96 | | if (!string.IsNullOrEmpty(desc)) |
| | | 97 | | { |
| | 5 | 98 | | sb.AppendLine("## Description"); |
| | 5 | 99 | | sb.AppendLine(desc); |
| | 5 | 100 | | sb.AppendLine(); |
| | | 101 | | } |
| | 9 | 102 | | } |
| | | 103 | | |
| | | 104 | | private static void AppendHigherLevels(StringBuilder sb, JsonElement root) |
| | | 105 | | { |
| | 9 | 106 | | var higherLevel = GetString(root, "higher_level"); |
| | 9 | 107 | | if (!string.IsNullOrEmpty(higherLevel)) |
| | | 108 | | { |
| | 1 | 109 | | sb.AppendLine("## At Higher Levels"); |
| | 1 | 110 | | sb.AppendLine(higherLevel); |
| | | 111 | | } |
| | 9 | 112 | | } |
| | | 113 | | } |