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