chaosbot/ChaosBot/Discord/Modules/LodestoneCommands.cs

217 lines
9.0 KiB
C#

using System;
using Discord;
using System.Text;
using Discord.Commands;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using ChaosBot.Lodestone;
using ChaosBot.Services;
using Microsoft.Extensions.Configuration;
using NLog;
namespace ChaosBot.Discord.Modules
{
public class LodestoneCommands : ModuleBase
{
private static readonly Logger _logger = Program._logger;
[Command("lodestone character")]
public async Task GetCharacterById(long id)
{
try
{
CharacterDetailed character = LodestoneManager.GetCharacter(id);
var embed = BuildEmbedFromCharacter(character);
/*
* Reply with the Embed created above
*/
await ReplyAsync(null, false, embed.Build());
}
catch (Exception ex)
{
_logger.Error($"InfoCommands.InfoCommand: Exception [{ex}] thrown, <[{ex.Message}]>.");
}
}
[Command("lodestone character")]
public async Task GetCharacter(string server, params string[] name)
{
try
{
CharacterDetailed character = LodestoneManager.GetCharacter(server, string.Join(" ", name));
var embed = BuildEmbedFromCharacter(character);
/*
* Reply with the Embed created above
*/
await ReplyAsync(null, false, embed.Build());
}
catch (Exception ex)
{
_logger.Error($"InfoCommands.InfoCommand: Exception [{ex}] thrown, <[{ex.Message}]>.");
}
}
[Command("lodestone freecompany")]
[Alias("lodestone fc")]
public async Task GetFreeCompanyById(string id)
{
try
{
FreeCompanyDetailed freeCompany = LodestoneManager.GetFreeCompanyById(id.ToString());
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<string>{"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();
/*
* Reply with the Embed created above
*/
await ReplyAsync(null, false, embed.Build());
}
catch (Exception ex)
{
_logger.Error($"InfoCommands.InfoCommand: Exception [{ex}] thrown, <[{ex.Message}]>.");
}
}
[Command("lodestone freecompany")]
[Alias("lodestone fc")]
public async Task GetFreeCompany(string server, string name)
{
try
{
FreeCompanyDetailed freeCompany = LodestoneManager.GetFreeCompany(server, name);
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<string>{"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();
/*
* 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 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<Tuple<string, ClassType, int>> classInfoList = new List<Tuple<string, ClassType, int>>();
foreach (CharacterClassJob characterClassJob in character.Character.ClassJobs.ToArray())
{
if (characterClassJob.Level == 0) continue;
Tuple<string, ClassType> classInfo =
LodestoneManager.Classes.GetValueOrDefault(characterClassJob.UnlockedState.Name);
classInfoList.Add(new Tuple<string, ClassType, int>(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<string, ClassType, int> 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;
}
}
}