From 970f4ba59fd38af3654bf48c4e4cb17ddda7828c Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Thu, 18 Aug 2022 09:55:31 -0400 Subject: [PATCH] Add laundry notifications to Telegram --- DeviceStatus/Service/LaundryMonitor.cs | 40 +++++++++++++++++++ DeviceStatus/Service/MessageHandler.cs | 18 +++++---- DeviceStatus/Service/Program.cs | 3 ++ DeviceStatus/Service/Service.csproj | 1 + .../Service/appsettings.Development.json | 4 ++ DeviceStatus/Service/appsettings.json | 4 ++ DeviceStatus/Service/deploy/manifest.yaml | 10 +++++ 7 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 DeviceStatus/Service/LaundryMonitor.cs diff --git a/DeviceStatus/Service/LaundryMonitor.cs b/DeviceStatus/Service/LaundryMonitor.cs new file mode 100644 index 0000000..6badf90 --- /dev/null +++ b/DeviceStatus/Service/LaundryMonitor.cs @@ -0,0 +1,40 @@ +using RestSharp; + +namespace Service; + +public class LaundryMonitor +{ + private readonly RestClient _restClient = new(); + + private readonly string _botToken; + private readonly string _chatId; + + public LaundryMonitor(IConfiguration configuration) + { + _botToken = configuration["Telegram:BotToken"]; + _chatId = configuration["Telegram:ChatId"]; + } + + public async Task HandleDeviceMessage(Device device) + { + try + { + if (device.Name is not ("washer" or "dryer")) + return; + + var status = device.Status ? "ON" : "OFF"; + + var message = $"The {device.Name} is now {status}."; + + var encodedMessage = Uri.EscapeDataString(message); + + var restRequest = new RestRequest($"https://api.telegram.org/bot{_botToken}/sendMessage?chat_id={_chatId}&text={encodedMessage}"); + + await _restClient.GetAsync(restRequest); + } + catch (Exception exception) + { + Console.WriteLine(exception); + } + } +} \ No newline at end of file diff --git a/DeviceStatus/Service/MessageHandler.cs b/DeviceStatus/Service/MessageHandler.cs index 20d443c..ad70618 100644 --- a/DeviceStatus/Service/MessageHandler.cs +++ b/DeviceStatus/Service/MessageHandler.cs @@ -1,8 +1,7 @@ -using System.Text.Json; -using System.Text.Json.Serialization; -using Microsoft.AspNetCore.SignalR.Client; +using Microsoft.AspNetCore.SignalR.Client; using MQTTnet; using MQTTnet.Server; +using System.Text.Json; namespace Service; @@ -13,11 +12,13 @@ public class MessageHandler : IHostedService private readonly IConfiguration _configuration; private readonly DeviceRepository _deviceRepository; + private readonly LaundryMonitor _laundryMonitor; - public MessageHandler(IConfiguration configuration, DeviceRepository deviceRepository) + public MessageHandler(IConfiguration configuration, DeviceRepository deviceRepository, LaundryMonitor laundryMonitor) { _configuration = configuration; _deviceRepository = deviceRepository; + _laundryMonitor = laundryMonitor; } public async Task StartAsync(CancellationToken cancellationToken) @@ -37,10 +38,13 @@ public class MessageHandler : IHostedService private async Task OnInterceptingPublishAsync(InterceptingPublishEventArgs arg) { + WriteLog($"{arg.ApplicationMessage.Topic}: {arg.ApplicationMessage.ConvertPayloadToString()}"); + _deviceRepository.HandleDeviceMessage(arg.ApplicationMessage.Topic, arg.ApplicationMessage.ConvertPayloadToString()); - Console.WriteLine(arg.ApplicationMessage.Topic); - Console.WriteLine(arg.ApplicationMessage.ConvertPayloadToString()); + var device = _deviceRepository[arg.ApplicationMessage.Topic]; + + await _laundryMonitor.HandleDeviceMessage(device); if (_hubConnection == null) return; @@ -50,7 +54,7 @@ public class MessageHandler : IHostedService if (_hubConnection.State == HubConnectionState.Disconnected) _hubConnection.StartAsync().Wait(); - var json = JsonSerializer.Serialize(_deviceRepository[arg.ApplicationMessage.Topic]); + var json = JsonSerializer.Serialize(device); await _hubConnection.InvokeAsync("SendLatestStatus", json); } diff --git a/DeviceStatus/Service/Program.cs b/DeviceStatus/Service/Program.cs index 4e6f879..7615777 100644 --- a/DeviceStatus/Service/Program.cs +++ b/DeviceStatus/Service/Program.cs @@ -2,6 +2,8 @@ using Service; var builder = WebApplication.CreateBuilder(args); +builder.Host.ConfigureAppConfiguration((_, config) => config.AddEnvironmentVariables()); + builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); @@ -10,6 +12,7 @@ builder.Services.AddSwaggerGen(); builder.Services.AddHostedService(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); var app = builder.Build(); diff --git a/DeviceStatus/Service/Service.csproj b/DeviceStatus/Service/Service.csproj index 7d00d75..f60989e 100644 --- a/DeviceStatus/Service/Service.csproj +++ b/DeviceStatus/Service/Service.csproj @@ -12,6 +12,7 @@ + diff --git a/DeviceStatus/Service/appsettings.Development.json b/DeviceStatus/Service/appsettings.Development.json index 5be2108..0235418 100644 --- a/DeviceStatus/Service/appsettings.Development.json +++ b/DeviceStatus/Service/appsettings.Development.json @@ -7,5 +7,9 @@ }, "Hub": { "DeviceStatus": "http://localhost:5000/device-status" + }, + "Telegram": { + "BotToken": "", + "ChatId": "" } } diff --git a/DeviceStatus/Service/appsettings.json b/DeviceStatus/Service/appsettings.json index 3ba4f12..42f5cc5 100644 --- a/DeviceStatus/Service/appsettings.json +++ b/DeviceStatus/Service/appsettings.json @@ -8,5 +8,9 @@ "AllowedHosts": "*", "Hub": { "DeviceStatus": "http://hub-server/device-status" + }, + "Telegram": { + "BotToken": "", + "ChatId": "" } } diff --git a/DeviceStatus/Service/deploy/manifest.yaml b/DeviceStatus/Service/deploy/manifest.yaml index c153148..87d67cb 100644 --- a/DeviceStatus/Service/deploy/manifest.yaml +++ b/DeviceStatus/Service/deploy/manifest.yaml @@ -27,6 +27,16 @@ spec: env: - name: Hub__DeviceStatus value: http://hub-service/device-status + - name: Telegram__BotToken + valueFrom: + secretKeyRef: + name: telegram + key: bot-token + - name: Telegram__ChatId + valueFrom: + secretKeyRef: + name: telegram + key: chat-id restartPolicy: Always terminationGracePeriodSeconds: 30 dnsPolicy: ClusterFirst