122 lines
4.5 KiB
C#
122 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)
|
|
{
|
|
Logger.Info("Connecting to Discord ...");
|
|
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();
|
|
}
|
|
}
|
|
}
|