Fix rankcheck

This commit is contained in:
Daniel_I_Am 2020-08-30 23:04:44 +02:00
parent c660a0e970
commit f48fd77c77
No known key found for this signature in database
GPG Key ID: 80C428FCC9743E84
3 changed files with 123 additions and 259 deletions

View File

@ -10,6 +10,7 @@ using System.Text;
using ChaosBot.Discord.PreConditions;
using ChaosBot.Lodestone;
using ChaosBot.Models;
using ChaosBot.Repositories;
using Newtonsoft.Json;
namespace ChaosBot.Discord.Modules.Admin
@ -24,100 +25,50 @@ namespace ChaosBot.Discord.Modules.Admin
try
{
await Context.Channel.TriggerTypingAsync();
List<LodestoneRank> ranks = await GetRank();
var sb = new StringBuilder();
var embed = new EmbedBuilder();
embed.WithColor(new Color(255, 255, 0));
embed.Title = $"Pending Promotions";
sb.AppendLine();
sb.AppendLine();
List<LodestoneRankedUser> rankedUsers = await GetRanksFromEndpoint(Context.Guild.Id);
sb.AppendLine($"**Recruits Pending Promotion to Initiate**");
if(ranks.FindAll(x => x.IngameRole == ERole.Recruit).Any())
List<StringBuilder> embedContent = new List<StringBuilder>{new StringBuilder()};
if (rankedUsers.Count(u => u.ShouldBeRole != null) > 0)
{
foreach (var lsId in ranks.FindAll(x => x.IngameRole == ERole.Recruit))
foreach (LodestoneRankedUser rankedUser in rankedUsers)
{
if (DateTimeOffset.Now >= lsId.RecruitDate)
try
{
if(lsId.DiscordId != null)
sb.AppendLine(string.Format("{0}{1}", lsId.DisplayName, (lsId.DiscordId != null ? $", linked to <@{lsId.DiscordId}>)" : "")));
else
{
ulong lodeId = Convert.ToUInt64(lsId.LodestoneId);
using (ChaosbotContext dbContext = new ChaosbotContext())
{
IQueryable<LodestoneCharacter> ctxlsChars = dbContext.LodestoneCharacter;
List<LodestoneCharacter> lsChar = ctxlsChars
.Where(x => x.DiscordGuildId.Equals(Context.Guild.Id))
.Where(x => x.LodestoneId.Equals(lodeId)).ToList();
// Skip users that shouldn't be upgraded
if (rankedUser.ShouldBeRole == null) continue;
if (rankedUser.ShouldBeRole == rankedUser.IngameRole) continue;
if (embedContent.Last().Length >= 1800)
embedContent.Add(new StringBuilder());
if (lsChar.Any())
{
sb.AppendLine(string.Format("{0}{1}", lsId.DisplayName, $", linked to <@{lsChar.First().DiscordUserId.ToString()}>"));
}
else
{
sb.AppendLine(string.Format("{0}", lsId.DisplayName));
}
}
}
embedContent.Last().Append($"{rankedUser.IngameRole} {rankedUser.DisplayName}");
if (rankedUser.DiscordId != null)
embedContent.Last().Append($" [<@{rankedUser.DiscordId}>]");
embedContent.Last().AppendLine($" -> {rankedUser.ShouldBeRole}");
}
catch (Exception ex)
{
LoggingFacade.Exception(ex);
embedContent.Last().AppendLine($"Something went wrong checking {rankedUser.DisplayName}");
}
}
}
else
sb.AppendLine($"None at this time.");
sb.AppendLine();
sb.AppendLine($"**Initiates Pending Promotion to Member**");
if (ranks.FindAll(x => x.IngameRole == ERole.Initiate).Any())
{
foreach (var lsId in ranks.FindAll(x => x.IngameRole == ERole.Initiate))
{
if (DateTimeOffset.Now >= lsId.MemberDate)
{
if(lsId.DiscordId != null)
sb.AppendLine(string.Format("{0}{1}", lsId.DisplayName, (lsId.DiscordId != null ? $", linked to <@{lsId.DiscordId}>)" : "")));
else
{
ulong lodeId = Convert.ToUInt64(lsId.LodestoneId);
using (ChaosbotContext dbContext = new ChaosbotContext())
{
IQueryable<LodestoneCharacter> ctxlsChars = dbContext.LodestoneCharacter;
List<LodestoneCharacter> lsChar = ctxlsChars
.Where(x => x.DiscordGuildId.Equals(Context.Guild.Id))
.Where(x => x.LodestoneId.Equals(lodeId)).ToList();
if (lsChar.Any())
{
sb.AppendLine(string.Format("{0}{1}", lsId.DisplayName, $", linked to <@{lsChar.First().DiscordUserId.ToString()}>"));
}
else
{
sb.AppendLine(string.Format("{0}", lsId.DisplayName));
}
}
}
}
}
embedContent.Last().AppendLine("No new promotions found!");
}
else
sb.AppendLine($"None at this time.");
sb.AppendLine();
sb.AppendLine($"Report Generated by {Context.User.Mention} at {DateTime.Now.ToString("dddd, dd MMMM yyyy h:mm tt")}.");
/*
* Add the string to the Embed
*/
embed.Description = sb.ToString();
/*
* Reply with the Embed created above
*/
await ReplyAsync(null, false, embed.Build());
foreach (StringBuilder builder in embedContent)
{
EmbedBuilder embedBuilder = new EmbedBuilder();
embedBuilder.Title = "Pending Promotions";
embedBuilder.Description = builder.ToString();
await ReplyAsync(null, false, embedBuilder.Build());
}
}
catch (Exception ex)
{
@ -125,28 +76,28 @@ namespace ChaosBot.Discord.Modules.Admin
}
}
public async Task<List<LodestoneRank>> GetRank()
public async Task<List<LodestoneRankedUser>> GetRanksFromEndpoint(ulong discordGuildId)
{
string response = null;
try
{
using (var client = new HttpClient())
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
using HttpClient client = new HttpClient();
var result = await client.GetAsync("https://www.ffxivhelix.com/rapi/clogiclodestone/v1/users");
result.EnsureSuccessStatusCode();
response = await result.Content.ReadAsStringAsync();
}
HttpResponseMessage result =
await client.GetAsync(
ConfigurationRepository.GetValue<string>("Lodestone:RankCheck:Url", discordGuildId));
result.EnsureSuccessStatusCode();
response = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<LodestoneRankApi>(response).Data;
}
catch (Exception ex)
{
LoggingFacade.Exception(ex);
throw;
}
return JsonConvert.DeserializeObject<List<LodestoneRank>>(JsonConvert.SerializeObject(JsonConvert.DeserializeObject<LodestoneRankApi>(response).Data));
}
}
}

View File

@ -1,166 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace ChaosBot.Lodestone
{
public partial class LodestoneRankApi
{
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("error")]
public object Error { get; set; }
[JsonProperty("data")]
public List<LodestoneRank> Data { get; set; }
}
public partial class LodestoneRank
{
[JsonProperty("lodestoneId")]
[JsonConverter(typeof(ParseStringConverter))]
public long LodestoneId { get; set; }
[JsonProperty("ingameRole")]
public ERole IngameRole { get; set; }
[JsonProperty("firstSeen")]
public DateTimeOffset FirstSeen { get; set; }
[JsonProperty("RecruitDate")]
public DateTimeOffset RecruitDate { get; set; }
[JsonProperty("MemberDate")]
public DateTimeOffset MemberDate { get; set; }
[JsonProperty("displayName")]
public string DisplayName { get; set; }
[JsonProperty("shouldBeRole")]
public ERole? ShouldBeRole { get; set; }
[JsonProperty("discordId")]
public string DiscordId { get; set; }
}
public enum ERole { Council, Initiate, Member, Inactive, Mentor, Recruit };
public partial class LodestoneRankApi
{
public static LodestoneRankApi FromJson(string json) => JsonConvert.DeserializeObject<LodestoneRankApi>(json, ChaosBot.Lodestone.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this LodestoneRankApi self) => JsonConvert.SerializeObject(self, ChaosBot.Lodestone.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
ERoleConverter.Singleton,
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
internal class ERoleConverter : JsonConverter
{
public override bool CanConvert(Type t) => t == typeof(ERole) || t == typeof(ERole?);
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
var value = serializer.Deserialize<string>(reader);
switch (value)
{
case "Council":
return ERole.Council;
case "Initiate":
return ERole.Initiate;
case "Member":
return ERole.Member;
case "Inactive":
return ERole.Inactive;
case "Mentor":
return ERole.Mentor;
case "Recruit":
return ERole.Recruit;
}
throw new Exception("Cannot unmarshal type ERole");
}
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
{
if (untypedValue == null)
{
serializer.Serialize(writer, null);
return;
}
var value = (ERole)untypedValue;
switch (value)
{
case ERole.Council:
serializer.Serialize(writer, "Council");
return;
case ERole.Initiate:
serializer.Serialize(writer, "Initiate");
return;
case ERole.Member:
serializer.Serialize(writer, "Member");
return;
case ERole.Inactive:
serializer.Serialize(writer, "Inactive");
return;
case ERole.Mentor:
serializer.Serialize(writer, "Mentor");
return;
case ERole.Recruit:
serializer.Serialize(writer, "Recruit");
return;
}
throw new Exception("Cannot marshal type ERole");
}
public static readonly ERoleConverter Singleton = new ERoleConverter();
}
internal class ParseStringConverter : JsonConverter
{
public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
var value = serializer.Deserialize<string>(reader);
long l;
if (Int64.TryParse(value, out l))
{
return l;
}
throw new Exception("Cannot unmarshal type long");
}
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
{
if (untypedValue == null)
{
serializer.Serialize(writer, null);
return;
}
var value = (long)untypedValue;
serializer.Serialize(writer, value.ToString());
return;
}
public static readonly ParseStringConverter Singleton = new ParseStringConverter();
}
}

View File

@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace ChaosBot.Lodestone
{
public class LodestoneRankApi
{
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("error")]
public object Error { get; set; }
[JsonProperty("data")]
public List<LodestoneRankedUser> Data { get; set; }
}
public class LodestoneRankedUser
{
[JsonProperty("lodestoneId")]
[JsonConverter(typeof(ParseStringToLongConverter))]
public long LodestoneId { get; set; }
[JsonProperty("ingameRole")]
public string IngameRole { get; set; }
[JsonProperty("firstSeen")]
public DateTimeOffset FirstSeen { get; set; }
[JsonProperty("RecruitDate")]
public DateTimeOffset RecruitDate { get; set; }
[JsonProperty("MemberDate")]
public DateTimeOffset MemberDate { get; set; }
[JsonProperty("displayName")]
public string DisplayName { get; set; }
[JsonProperty("shouldBeRole")]
public string ShouldBeRole { get; set; } //TODO: Check if this still needs to be nullable
[JsonProperty("discordId")]
public string DiscordId { get; set; }
}
internal class ParseStringToLongConverter : JsonConverter
{
public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
var value = serializer.Deserialize<string>(reader);
long l;
if (Int64.TryParse(value, out l))
{
return l;
}
throw new Exception("Cannot unmarshal type long");
}
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
{
if (untypedValue == null)
{
serializer.Serialize(writer, null);
return;
}
var value = (long)untypedValue;
serializer.Serialize(writer, value.ToString());
return;
}
public static readonly ParseStringToLongConverter Singleton = new ParseStringToLongConverter();
}
}