Telegram.Bot.SpaceApi/Backend/BotInstance.cs
2023-04-09 16:10:53 +02:00

79 lines
2.1 KiB
C#

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<BotInstance> 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;
}
}
}