kawwa/Bink.cs
2025-05-23 18:07:57 -05:00

99 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text.Json;
using System.Text.Json.Serialization;
using Avalonia.Threading;
namespace kawwa;
public class BinkPost
{
[JsonPropertyName("user")]
public required string User { get; set; }
[JsonPropertyName("body")]
public required string Body { get; set; }
[JsonPropertyName("time")]
public required long Time { get; set; }
public string TimeString { get; set; } = string.Empty;
}
public static class Bink
{
private static DispatcherTimer? timer = null;
public static readonly ObservableCollection<BinkPost> LoadedBinks = [];
private static List<BinkPost>? BinkData = null;
public static void Initialize()
{
if (timer == null)
StartTimer();
if (BinkData == null)
{
BinkData = AllBinks();
if (BinkData != null)
{
foreach (var bink in BinkData)
{
SetBinkDateString(bink);
LoadedBinks.Add(bink);
}
}
}
}
public static void PostBink(string message)
{
SshConnection.RunCommandWithInput("town bink --pipe", message);
}
public static List<BinkPost>? AllBinks()
{
return JsonSerializer.Deserialize<List<BinkPost>>(SshConnection.RunCommand("town bink --dump"));
}
public static List<BinkPost>? BinksBefore(long TimeStamp)
{
return JsonSerializer.Deserialize<List<BinkPost>>(SshConnection.RunCommand($"town bink --dump-before {TimeStamp}"));
}
public static List<BinkPost>? BinksAfter(long TimeStamp)
{
return JsonSerializer.Deserialize<List<BinkPost>>(SshConnection.RunCommand($"town bink --dump-after {TimeStamp}"));
}
public static void SetBinkDateString(BinkPost bink)
{
var date = DateTimeOffset.FromUnixTimeSeconds(bink.Time / 1000000000).DateTime.ToLocalTime();
bink.TimeString = date.ToString("HH:mm (dddd, MMMM dd, yyyy)");
}
public static void GetNewBinks()
{
var BinkList = BinksAfter(LoadedBinks[0].Time);
if (BinkList != null)
{
BinkList.Reverse();
foreach (var bink in BinkList)
{
SetBinkDateString(bink);
LoadedBinks.Insert(0, bink);
}
}
}
private static void StartTimer()
{
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(20);
timer.Tick += Timer_Tick;
timer.Start();
}
private static void Timer_Tick(object? sender, object? e)
{
GetNewBinks();
}
}