diff --git a/Problems/Item.cs b/Problems/Item.cs index 49bd6ff..5a018a9 100644 --- a/Problems/Item.cs +++ b/Problems/Item.cs @@ -16,5 +16,6 @@ namespace ZaoBot.Problems public string label; public string name; public Status status; + public bool notified = false; } } diff --git a/Problems/StatusManager.cs b/Problems/StatusManager.cs index 67853a8..05f9f8f 100644 --- a/Problems/StatusManager.cs +++ b/Problems/StatusManager.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; using System.Text; +using System.Text.Json; using System.Timers; +using Telegram.Bot; +using ZaoBot.Config; namespace ZaoBot.Problems { @@ -10,15 +13,19 @@ namespace ZaoBot.Problems const int DEFAULT_INTERVAL = 2000; private OpenHab.OpenHabClient openhab; + private ITelegramBotClient bot; + private JsonDocument config; private Timer timer; private Dictionary statusItems = new Dictionary(); public IEnumerable StatusItems => statusItems.Values; - public StatusManager(OpenHab.OpenHabClient openhab) + public StatusManager(OpenHab.OpenHabClient openhab, ITelegramBotClient bot, IConfig config) { + this.bot = bot; this.openhab = openhab; + this.config = config.Data; UpdateStatus(); timer = new Timer(DEFAULT_INTERVAL); timer.Elapsed += OnTimer; @@ -39,28 +46,49 @@ namespace ZaoBot.Problems { if (!item.name.StartsWith("Problem_")) continue; Item statusItem = null; - if (statusItems.ContainsKey(item.name)) statusItem = statusItems[item.name]; - else + lock (statusItems) { - statusItem = new Item() + if (statusItems.ContainsKey(item.name)) statusItem = statusItems[item.name]; + else { - name = item.name, - label = item.label, - status = Status.UNKNOWN - }; - statusItems[item.name] = statusItem; + statusItem = new Item() + { + name = item.name, + label = item.label, + status = Status.UNKNOWN + }; + statusItems[item.name] = statusItem; + } } var state = await openhab.GetItemState(item.name); - if (state.state == "OFF") statusItem.status = Status.OK; - else if (state.state == "ON") statusItem.status = Status.PROBLEM; - else statusItem.status = Status.UNKNOWN; + lock (statusItems) + { + if (state.state == "OFF") statusItem.status = Status.OK; + else if (state.state == "ON") statusItem.status = Status.PROBLEM; + else statusItem.status = Status.UNKNOWN; + if (statusItem.status == Status.PROBLEM && statusItem.notified == false) + { + Notify(statusItem); + statusItem.notified = true; + } + } } - } catch (Exception ex) { Console.WriteLine("Exception on getting status: " + ex.ToString()); } } + + private async void Notify(Item item) + { + foreach (var element in config.RootElement.GetProperty("notify_user_ids").EnumerateArray()) + { + await bot.SendTextMessageAsync( + chatId: element.GetString(), + text: "Problem appeared: " + item.label + ); + } + } } } diff --git a/Program.cs b/Program.cs index 2677536..a1690a4 100644 --- a/Program.cs +++ b/Program.cs @@ -41,6 +41,7 @@ namespace ZaoBot var receiver = provider.GetRequiredService(); var notificationThread = new Thread(new ThreadStart(receiver.Run)); notificationThread.Start(); + var statusManager = provider.GetRequiredService(); while (true) { try