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 LoadedBinks = []; private static List? 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? AllBinks() { return JsonSerializer.Deserialize>(SshConnection.RunCommand("town bink --dump")); } public static List? BinksBefore(long TimeStamp) { return JsonSerializer.Deserialize>(SshConnection.RunCommand($"town bink --dump-before {TimeStamp}")); } public static List? BinksAfter(long TimeStamp) { return JsonSerializer.Deserialize>(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(); } }