From 03b6f52488e487961756a0b4adc0992fb8598d87 Mon Sep 17 00:00:00 2001 From: Sergey Nazarov Date: Fri, 3 May 2024 07:55:30 +0000 Subject: [PATCH] Add telegram logging handler (#10) Reviewed-on: https://gitea.musk.fun/nocr/telegram-client/pulls/10 Co-authored-by: Sergey Nazarov Co-committed-by: Sergey Nazarov --- .../Handlers/UpdateTelegramLoggingHandler.cs | 91 +++++++++++++++++++ .../Options/AdministrationOptions.cs | 5 + .../ServiceCollectionExtensions.cs | 3 + .../TextSubscriptionMatchedHandler.cs | 2 +- .../appsettings.Development.json | 3 + .../appsettings.k8s.json | 3 + 6 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 src/Nocr.TelegramClient.AppServices/Handlers/UpdateTelegramLoggingHandler.cs diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/UpdateTelegramLoggingHandler.cs b/src/Nocr.TelegramClient.AppServices/Handlers/UpdateTelegramLoggingHandler.cs new file mode 100644 index 0000000..d5d3e65 --- /dev/null +++ b/src/Nocr.TelegramClient.AppServices/Handlers/UpdateTelegramLoggingHandler.cs @@ -0,0 +1,91 @@ +using Insight.TelegramBot.Handling.Handlers; +using Insight.TelegramBot.Models; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Nocr.TelegramClient.AppServices.Bots.MessageDispatcher; +using Nocr.TelegramClient.AppServices.Options; +using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; + +namespace Nocr.TelegramClient.AppServices.Handlers; + +public sealed class UpdateTelegramLoggingHandler : IUpdateHandler +{ + private readonly ILogger _logger; + private readonly IMessageDispatcherQueue _messageDispatcherQueue; + private readonly AdministrationOptions _options; + + public UpdateTelegramLoggingHandler(ILogger logger, + IMessageDispatcherQueue messageDispatcherQueue, + IOptionsSnapshot options) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _messageDispatcherQueue = + messageDispatcherQueue ?? throw new ArgumentNullException(nameof(messageDispatcherQueue)); + _options = options.Value ?? throw new ArgumentNullException(nameof(options)); + } + + public Task Handle(Update update, CancellationToken cancellationToken = default) + { + _logger.LogDebug("Received update:\n{@Update}", update); + + if (_options.EnableUpdateTelegramLogging) + { + var from = GetFrom(update); + if (from == null) + { + _logger.LogWarning("Failed to extract `from` from update:\n{@Update}", update); + return Task.CompletedTask; + } + + var text = GetText(update); + foreach (var updateReceiverId in _options.UpdateReceiverIds) + { + var message = new TextMessage(updateReceiverId) + { + Text = GetMessageText(from.Id, update.Type.ToString(), from.Username, text) + }; + + _messageDispatcherQueue.Enqueue(message); + } + } + + return Task.CompletedTask; + } + + private string? GetText(Update update) + { + switch (update.Type) + { + case UpdateType.Message: + return update.Message.Text; + case UpdateType.CallbackQuery: + return update.CallbackQuery.Data; + default: + return null; + } + } + + private User? GetFrom(Update update) + { + switch (update.Type) + { + case UpdateType.Message: + return update.Message.From; + case UpdateType.CallbackQuery: + return update.CallbackQuery.From; + default: + return null; + } + } + + private string GetMessageText(long fromId, string type, string? fromUsername = null, string? text = null) + { + if (!string.IsNullOrWhiteSpace(fromUsername)) + { + fromUsername = "@" + fromUsername; + } + + return $"#update\nПолучено обновление от {fromId} ({fromUsername})\nТип: {type}\nТекст/CallbackData: {text}"; + } +} \ No newline at end of file diff --git a/src/Nocr.TelegramClient.AppServices/Options/AdministrationOptions.cs b/src/Nocr.TelegramClient.AppServices/Options/AdministrationOptions.cs index cb08d5d..8508d34 100644 --- a/src/Nocr.TelegramClient.AppServices/Options/AdministrationOptions.cs +++ b/src/Nocr.TelegramClient.AppServices/Options/AdministrationOptions.cs @@ -11,4 +11,9 @@ public sealed class AdministrationOptions /// Список telegram идентификаторов для получения обновлений /// public long[] UpdateReceiverIds { get; set; } = Array.Empty(); + + /// + /// Пересылать ли тексты обновлений от пользователей в админ канал + /// + public bool EnableUpdateTelegramLogging { get; set; } } \ No newline at end of file diff --git a/src/Nocr.TelegramClient.AppServices/ServiceCollectionExtensions.cs b/src/Nocr.TelegramClient.AppServices/ServiceCollectionExtensions.cs index 774676a..11c02f1 100644 --- a/src/Nocr.TelegramClient.AppServices/ServiceCollectionExtensions.cs +++ b/src/Nocr.TelegramClient.AppServices/ServiceCollectionExtensions.cs @@ -1,7 +1,9 @@ +using Insight.TelegramBot.Handling.Handlers; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Nocr.TelegramClient.AppServices.Bots.MessageDispatcher; +using Nocr.TelegramClient.AppServices.Handlers; using Nocr.TelegramClient.AppServices.Handlers.Messages.FeedbackMessage; using Nocr.TelegramClient.AppServices.Options; using Nocr.TelegramClient.AppServices.TextSubscriptions.Handlers; @@ -25,6 +27,7 @@ public static class ServiceCollectionExtensions services.AddHttpClient(); services.Configure(configuration.GetSection(nameof(AdministrationOptions))); + services.AddScoped(); services.Configure(configuration.GetSection(nameof(UsersRestEaseOptions))); services.AddScoped(ctx => diff --git a/src/Nocr.TelegramClient.AppServices/TextSubscriptions/Handlers/TextSubscriptionMatchedHandler.cs b/src/Nocr.TelegramClient.AppServices/TextSubscriptions/Handlers/TextSubscriptionMatchedHandler.cs index 5aa4af1..fc45bef 100644 --- a/src/Nocr.TelegramClient.AppServices/TextSubscriptions/Handlers/TextSubscriptionMatchedHandler.cs +++ b/src/Nocr.TelegramClient.AppServices/TextSubscriptions/Handlers/TextSubscriptionMatchedHandler.cs @@ -11,7 +11,7 @@ using Telegram.Bot.Types.Enums; namespace Nocr.TelegramClient.AppServices.TextSubscriptions.Handlers; -public class TextSubscriptionMatchedHandler : IHandleMessages +public sealed class TextSubscriptionMatchedHandler : IHandleMessages { private readonly ILogger _logger; private readonly ILocalizer _localizer; diff --git a/src/Nocr.TelegramClient.Host/appsettings.Development.json b/src/Nocr.TelegramClient.Host/appsettings.Development.json index f354630..a9946fd 100644 --- a/src/Nocr.TelegramClient.Host/appsettings.Development.json +++ b/src/Nocr.TelegramClient.Host/appsettings.Development.json @@ -17,5 +17,8 @@ }, "TextMatcherRestEaseOptions": { "BasePath": "http://localhost:5001" + }, + "AdministrationOptions": { + "EnableUpdateTelegramLogging": true } } diff --git a/src/Nocr.TelegramClient.Host/appsettings.k8s.json b/src/Nocr.TelegramClient.Host/appsettings.k8s.json index 184cfb8..404dd02 100644 --- a/src/Nocr.TelegramClient.Host/appsettings.k8s.json +++ b/src/Nocr.TelegramClient.Host/appsettings.k8s.json @@ -33,5 +33,8 @@ }, "TelegramBotOptions": { "Token": "" + }, + "AdministrationOptions": { + "EnableUpdateTelegramLogging": true } } \ No newline at end of file