Add fancy printing to lodestone output

This commit is contained in:
Daniel_I_Am 2020-06-04 22:26:42 +02:00
parent b4617838dd
commit 1f41e7cf46
No known key found for this signature in database
GPG Key ID: 80C428FCC9743E84
5 changed files with 173 additions and 20 deletions

View File

@ -23,16 +23,29 @@ namespace ChaosBot.Discord.Modules
{
try
{
Character character = LodestoneManager.GetCharacter(id);
CharacterDetailed character = LodestoneManager.GetCharacter(id);
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.ID}/";
embed.ImageUrl = character.Avatar;
sb.AppendLine($"{character.Name} ({character.Server})");
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: {character.Character.ActiveClassJob.Name} (level {character.Character.ActiveClassJob.Level})");
sb.AppendLine();
sb.AppendLine("All Jobs:");
foreach (CharacterClassJob characterClassJob in character.Character.ClassJobs.ToArray())
{
if (characterClassJob.Level == 0) continue;
sb.AppendLine($"{characterClassJob.Name} (level {characterClassJob.Level})");
}
/*
* Add the string to the Embed
@ -64,6 +77,7 @@ namespace ChaosBot.Discord.Modules
embed.Title = $"Character Information";
embed.Url = $"https://na.finalfantasyxiv.com/lodestone/character/{character.ID}/";
embed.ImageUrl = character.Avatar;
embed.Footer = new EmbedFooterBuilder().WithText($"Lodestone ID {character.ID}");
sb.AppendLine($"{character.Name} ({character.Server})");
/*
@ -84,20 +98,37 @@ namespace ChaosBot.Discord.Modules
[Command("lodestone freecompany")]
[Alias("lodestone fc")]
public async Task GetFreeCompanyById(long id)
public async Task GetFreeCompanyById(string id)
{
try
{
FreeCompany freeCompany = LodestoneManager.GetFreeCompanyById(id.ToString());
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.ID}/";
embed.ImageUrl = freeCompany.Crest.First();
sb.AppendLine($"{freeCompany.Name} ({freeCompany.Server})");
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
@ -130,6 +161,8 @@ namespace ChaosBot.Discord.Modules
embed.Title = $"Free Company Information";
embed.Url = $"https://na.finalfantasyxiv.com/lodestone/freecompany/{freeCompany.ID}/";
embed.ImageUrl = freeCompany.Crest.First();
embed.Footer = new EmbedFooterBuilder().WithText($"Lodestone ID {freeCompany.ID}");
sb.AppendLine($"{freeCompany.Name} ({freeCompany.Server})");
/*

View File

@ -5,10 +5,10 @@ namespace ChaosBot.Lodestone
public string Avatar;
public int FeastMatches;
public long ID;
public string Lang;
public string? Lang;
public string Name;
// public ? Rank;
// public ? RankIcon;
public string? Rank;
public string? RankIcon;
public string Server;
}
}

View File

@ -0,0 +1,59 @@
using System.Collections.Generic;
namespace ChaosBot.Lodestone
{
public class CharacterDetailed
{
public CharacterDetails Character;
}
public class CharacterDetails
{
public CharacterClassJob ActiveClassJob;
public string Avatar;
public string Bio;
public List<CharacterClassJob> ClassJobs;
public string DC;
public string FreeCompanyId;
public int Gender;
public CharacterGrandCompany GrandCompany;
public int GuardianDeity;
public long ID;
public string? Lang;
public string Name;
public string Nameday;
public long ParseDate;
public string Portrait;
public int Race;
public string Server;
public int Title;
public bool TitleTop;
public int Town;
public int Tribe;
}
public class CharacterClassJob
{
public int ClassID;
public long ExpLevel;
public long ExpLevelMax;
public long ExpLevelTogo;
public bool IsSpecialised;
public int JobID;
public int Level;
public string Name;
public CharacterClassJobUnlockedState UnlockedState;
}
public class CharacterGrandCompany
{
public int NameID;
public int RankID;
}
public class CharacterClassJobUnlockedState
{
public int? ID;
public string Name;
}
}

View File

@ -0,0 +1,56 @@
using System.Collections.Generic;
namespace ChaosBot.Lodestone
{
public class FreeCompanyDetailed
{
public FreeCompanyDetails FreeCompany;
public List<FreeCompanyCharacter> FreeCompanyMembers;
}
public class FreeCompanyDetails
{
public string Active;
public int ActiveMemberCount;
public List<string> Crest;
public string DC;
public FreeCompanyEstate Estate;
public long Formed;
public string GrandCompany;
public string ID;
public string Name;
public long ParseDate;
public int Rank;
public FreeCompanyRanking Ranking;
public string Recruitment;
public List<FreeCompanyReputation> Reputation;
public string Server;
public string Slogan;
public string Tag;
}
public class FreeCompanyCharacter : Character
{
}
public class FreeCompanyEstate
{
public string Greeting;
public string Name;
public string Plot;
}
public class FreeCompanyRanking
{
public int Monthly;
public int Weekly;
}
public class FreeCompanyReputation
{
public string Name;
public int Progress;
public string Rank;
}
}

View File

@ -9,9 +9,9 @@ namespace ChaosBot.Services
{
private static readonly Dictionary<Endpoints, string> EndpointPaths = new Dictionary<Endpoints, string>
{
{Endpoints.CHARACTER_SEARCH_BY_ID, "character/%s"},
{Endpoints.CHARACTER_SEARCH_BY_ID, "character/{0}"},
{Endpoints.CHARACTER_SEARCH, "character/search"},
{Endpoints.FREECOMPANY_SEARCH_BY_ID, "freecompany/%s"},
{Endpoints.FREECOMPANY_SEARCH_BY_ID, "freecompany/{0}"},
{Endpoints.FREECOMPANY_SEARCH, "freecompany/search"},
};
@ -29,10 +29,12 @@ namespace ChaosBot.Services
return characterWrapper.Results.First();
}
public static Character GetCharacter(long id)
public static CharacterDetailed GetCharacter(long id)
{
PaginationWrapper<Character> characterWrapper = LodestoneHttpProxy.Fetch<PaginationWrapper<Character>>(GetEndpointPaths(Endpoints.CHARACTER_SEARCH_BY_ID, id.ToString()));
return characterWrapper.Results.First();
Dictionary<string, string> parameters = new Dictionary<string, string>
{{"data", "CJ"}};
CharacterDetailed character = LodestoneHttpProxy.Fetch<CharacterDetailed>(GetEndpointPaths(Endpoints.CHARACTER_SEARCH_BY_ID, id.ToString()), parameters);
return character;
}
public static FreeCompany GetFreeCompany(string server, string name)
@ -44,9 +46,12 @@ namespace ChaosBot.Services
return freeCompanyWrapper.Results.First();
}
public static FreeCompany GetFreeCompanyById(string id) {
PaginationWrapper<FreeCompany> freeCompanyWrapper = LodestoneHttpProxy.Fetch<PaginationWrapper<FreeCompany>>(GetEndpointPaths(Endpoints.FREECOMPANY_SEARCH_BY_ID, id));
return freeCompanyWrapper.Results.First();}
public static FreeCompanyDetailed GetFreeCompanyById(string id) {
Dictionary<string, string> parameters = new Dictionary<string, string>
{{"data", "FCM"}};
FreeCompanyDetailed freeCompany = LodestoneHttpProxy.Fetch<FreeCompanyDetailed>(GetEndpointPaths(Endpoints.FREECOMPANY_SEARCH_BY_ID, id), parameters);
return freeCompany;
}
}
public enum Endpoints