using System.Diagnostics.CodeAnalysis; using Microsoft.EntityFrameworkCore; using Telegram.Bot.SpaceApi.Backend.Database; namespace Telegram.Bot.SpaceApi.Backend; using Database.Tables; public static class BotOrchestrator { private static readonly List Bots = new(); public static BotInstance? GetBot(Bot bot) => Bots.FirstOrDefault(p => p.Id == bot.Id); public static void AddBot(Bot bot) => Bots.Add(new BotInstance(bot)); public static void DelBot(Bot bot) => Bots.RemoveAll(p => p.Id == bot.Id); private static void Initialize() { var db = new DatabaseContext(); db.Bots.ForEachAsync(AddBot); } [SuppressMessage("ReSharper", "FunctionNeverReturns")] public static Task UpdateTask() { Initialize(); while (true) { Bots.ForEach(bot => Task.Run(bot.Update)); Thread.Sleep(60000); } } } public class BotInstance { public readonly int Id; public string? Error; public bool LastStatus; private readonly string _name; private readonly string _chat; private readonly SpaceApiClient? _api; private readonly TelegramBotClient? _bot; public BotInstance(Bot bot) { Id = bot.Id; _name = bot.Name; _chat = bot.Chat; try { _bot = new TelegramBotClient(bot.Token); _api = string.IsNullOrWhiteSpace(bot.ApiOverrideAddress) ? new SpaceApiClient(bot.ApiUrl) : new SpaceApiClient(bot.ApiUrl, bot.ApiOverrideAddress); LastStatus = _api.IsOpen(); } catch (Exception e) { Error = e.Message; } } public Task Update() { try { if (_api == null || _bot == null) return Task.CompletedTask; var status = _api.IsOpen(); if (status == LastStatus) return Task.CompletedTask; LastStatus = status; Console.WriteLine($"Updating {_name} status to {(status ? "open" : "closed")}..."); _bot.SendMessage(_chat, $"{_name} is {(status ? "open" : "closed")}."); Error = null; return Task.CompletedTask; } catch (Exception e) { Console.WriteLine($"Error updating {_name} status: {e.Message}"); Error = e.Message; return Task.CompletedTask; } } }