From 9c7bd0d11c4497837a9ddf418267359375ee6a48 Mon Sep 17 00:00:00 2001 From: Sean Stoves Date: Wed, 5 Aug 2020 20:24:10 -0400 Subject: [PATCH] Adding LodeStone functions --- ChaosBot/Discord/Modules/User/Lodestone.cs | 167 +++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 ChaosBot/Discord/Modules/User/Lodestone.cs diff --git a/ChaosBot/Discord/Modules/User/Lodestone.cs b/ChaosBot/Discord/Modules/User/Lodestone.cs new file mode 100644 index 0000000..0fcc9a1 --- /dev/null +++ b/ChaosBot/Discord/Modules/User/Lodestone.cs @@ -0,0 +1,167 @@ +using System; +using Discord; +using System.Text; +using Discord.Commands; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using ChaosBot.Discord.PreConditions; +using ChaosBot.Lodestone; +using ChaosBot.Services; +using Discord.Net; +using NLog; + +namespace ChaosBot.Discord.Modules.User +{ + public class Lodestone : ModuleBase + { + private static readonly ILogger _logger = Program.Logger; + + [Command("lodestone")] + [Alias("ls")] + [CheckCommandPerm("User")] + public async Task LodestoneRun(string cmd, params String[] args) + { + try + { + if ((cmd.ToLower() == "fc") || (cmd.ToLower() == "freecompany")) + { + if(args.Length >= 1) + { + await GetFreeCompany(args[0], string.Join(" ", args.Skip(1))); + } + } + else + { + Console.WriteLine("Check me out"); + } + } + catch (Exception ex) + { + _logger.Error( + $"{MethodBase.GetCurrentMethod().ReflectedType.FullName}: Exception [{ex}] thrown, <[{ex.Message}]>."); + } + } + + public async Task GetFreeCompany(string value, [Remainder] string name) + { + FreeCompanyDetailed freeCompany; + try + { + await Context.Channel.TriggerTypingAsync(); + + if (name.Length == 0) + freeCompany = LodestoneManager.GetFreeCompanyById(value); + else + { + freeCompany = LodestoneManager.GetFreeCompany(value, name); + } + + var embed = BuildEmbedFromFreeCompany(freeCompany); + + /* + * Reply with the Embed created above + */ + await ReplyAsync(null, false, embed.Build()); + } + catch (Exception ex) + { + _logger.Error($"InfoCommands.InfoCommand: Exception [{ex}] thrown, <[{ex.Message}]>."); + } + } + + private static EmbedBuilder BuildEmbedFromFreeCompany(FreeCompanyDetailed freeCompany) + { + var sb = new StringBuilder(); + var embed = new EmbedBuilder(); + + embed.WithColor(new Color(255, 255, 0)); + embed.Title = $"Free Company Information"; + embed.Url = $"https://na.finalfantasyxiv.com/lodestone/freecompany/{freeCompany.FreeCompany.ID}/"; + embed.ImageUrl = freeCompany.FreeCompany.Crest.First(); + embed.Footer = new EmbedFooterBuilder().WithText($"Lodestone ID {freeCompany.FreeCompany.ID}"); + + sb.AppendLine( + $"{freeCompany.FreeCompany.Name} ({freeCompany.FreeCompany.Server}, rank {freeCompany.FreeCompany.Rank})"); + sb.AppendLine($"{freeCompany.FreeCompany.Slogan}"); + sb.AppendLine(); + sb.AppendLine($"{freeCompany.FreeCompany.ActiveMemberCount} active members."); + sb.AppendLine($"Company estate {freeCompany.FreeCompany.Estate.Plot}"); + sb.AppendLine($"Pledged to Grand Company {freeCompany.FreeCompany.GrandCompany}"); + sb.AppendLine(); + + var rankCounts = freeCompany.FreeCompanyMembers.GroupBy(m => m.Rank) + .Select(g => new {Rank = g.Key, Count = g.Count()}) + .OrderBy(x => x.Rank); + + foreach (string rank in new List {"Council", "Mentor", "Member", "Initiate"}) + { + var rankCount = rankCounts.First(e => e.Rank == rank); + sb.AppendLine($"{rankCount.Count} members are of rank {rankCount.Rank} "); + } + + /* + * Add the string to the Embed + */ + embed.Description = sb.ToString(); + return embed; + } + + private static EmbedBuilder BuildEmbedFromCharacter(CharacterDetailed character) + { + var sb = new StringBuilder(); + var embed = new EmbedBuilder(); + + embed.WithColor(new Color(255, 255, 0)); + embed.Title = $"Character Information"; + embed.Url = $"https://na.finalfantasyxiv.com/lodestone/character/{character.Character.ID}/"; + embed.ImageUrl = character.Character.Avatar; + embed.Footer = new EmbedFooterBuilder().WithText($"Lodestone ID {character.Character.ID}"); + + char genderIcon = character.Character.Gender == 1 ? '♂' : '♀'; + sb.AppendLine($"{character.Character.Name} {genderIcon} ({character.Character.Server})"); + sb.AppendLine($"Bio: {character.Character.Bio}"); + sb.AppendLine(); + sb.AppendLine( + $"Current Job: {LodestoneManager.Classes.GetValueOrDefault(character.Character.ActiveClassJob.UnlockedState.Name)?.Item1.ToString()} {character.Character.ActiveClassJob.Level}"); + sb.AppendLine(); + sb.AppendLine("All Jobs:"); + + sb.Append("```"); + List> classInfoList = new List>(); + foreach (CharacterClassJob characterClassJob in character.Character.ClassJobs.ToArray()) + { + if (characterClassJob.Level == 0) continue; + Tuple classInfo = + LodestoneManager.Classes.GetValueOrDefault(characterClassJob.UnlockedState.Name); + classInfoList.Add(new Tuple(classInfo.Item1, classInfo.Item2, characterClassJob.Level)); + } + + foreach (var classTypeList in classInfoList.GroupBy(ci => ci.Item2) + .Select(group => new {ClassType = @group.Key, classList = @group.ToArray()}).OrderBy(g => g.ClassType)) + { + sb.Append($"{classTypeList.ClassType.ToString()}:"); + + for (int i = 0; i < classTypeList.classList.Length; i++) + { + if ((i % 4) == 0) + sb.AppendLine(); + + Tuple classItem = classTypeList.classList[i]; + sb.Append(String.Format(" {0,3}: {1,2}", classItem.Item1, classItem.Item3)); + } + + sb.AppendLine("\n"); + } + + sb.Append("```"); + + /* + * Add the string to the Embed + */ + embed.Description = sb.ToString(); + return embed; + } + } +} \ No newline at end of file