PluralRichPresence/PluralRichPresnce/Program.cs

121 lines
4.5 KiB
C#

using PluralRichPresence.Avatar;
using PluralRichPresence.SimplyPlural;
using PluralRichPresence.Discord;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Net;
namespace PluralRichPresence
{
internal class Program
{
private static ManualResetEvent waitHandle = new ManualResetEvent(false);
private static IDiscordActivitySetter? discordSetter = null;
private static System? system;
private const string KEY_SIMPLY_PLURAL_TOKEN = "SIMPLY_PLURAL_TOKEN";
public static string FmtFronterNames(Member[] fronters)
{
List<string> names = new List<string>();
foreach(Member fronter in fronters)
names.Add(fronter.Name);
return String.Join(", ", names.ToArray());
}
public static string FmtFronterPronouns(Member[] fronters)
{
List<string> pronouns = new List<string>();
foreach (Member fronter in fronters)
pronouns.Add(fronter.Pronouns);
return String.Join(", ", pronouns.ToArray());
}
public static string FmtAvatar(Member[] fronters)
{
if (false && fronters.Length > 1 && OperatingSystem.IsWindowsVersionAtLeast(6, 1))
{
List<Image> images = new List<Image>();
foreach (Member fronter in fronters)
{
byte[]? avaData = fronter.DownloadAvatar();
if (avaData is not null)
using (MemoryStream ms = new MemoryStream(avaData))
images.Add(Image.FromStream(ms));
}
ImageSplitter splitter = new ImageSplitter(600, 600, images.ToArray());
using (Bitmap bmp = splitter.Draw())
{
using (MemoryStream pngData = new MemoryStream())
{
bmp.Save(pngData, ImageFormat.Png);
byte[] pngBytes = pngData.ToArray();
return "data:image/png;base64,"+Convert.ToBase64String(pngBytes);
}
}
}
else
{
string? avaUrl = fronters.First().AvatarURL;
return (avaUrl is null) ? String.Empty : avaUrl;
}
}
public static async Task UpdateFronterStatus()
{
// get fronting members
if (system is null) return;
Member[] frontingMembers = await system.GetCurrentFronterInfo();
if (frontingMembers.Length > 0)
{
Console.Write("\r" + FmtFronterNames(frontingMembers) + " is fronting!");
if (discordSetter is null) return;
discordSetter.SetFronter(new SystemMember(FmtFronterNames(frontingMembers),
FmtFronterPronouns(frontingMembers),
FmtAvatar(frontingMembers),
frontingMembers.OrderByDescending(o => o.FrontStartTime).First().FrontStartTime));
}
else
{
Console.Write("\r No one is fronting!");
if (discordSetter is null) return;
discordSetter.SetFronter(new SystemMember("No one is fronting.", "This doesn't make much sense?", null, null));
}
}
public static async Task Main(string[] args)
{
discordSetter = new DiscordClient(Config.GetEntry("DISCORD_TOKEN"));
//discordSetter = new DiscordRpc();
if (!Config.EntryExists(KEY_SIMPLY_PLURAL_TOKEN))
{
Console.Write("Enter Simply Plural API Key: ");
string? token = Console.ReadLine();
if (token is not null)
Config.SetEntry(KEY_SIMPLY_PLURAL_TOKEN, token);
}
Logger.Info("Connecting to Simply Plural ...");
try
{
system = new System(Config.GetEntry(KEY_SIMPLY_PLURAL_TOKEN));
system.FronterChanged += onFronterChanged;
await UpdateFronterStatus();
}
catch (HttpRequestException) { Logger.Error("Simply Plural API key is invalid!"); }
waitHandle.WaitOne();
}
private static void onFronterChanged(object? sender, EventArgs e)
{
_ = UpdateFronterStatus();
}
}
}