diff --git a/src/Nocr.TelegramListener.AppServices/Nocr.TelegramListener.AppServices.csproj.DotSettings b/src/Nocr.TelegramListener.AppServices/Nocr.TelegramListener.AppServices.csproj.DotSettings new file mode 100644 index 0000000..1e4f663 --- /dev/null +++ b/src/Nocr.TelegramListener.AppServices/Nocr.TelegramListener.AppServices.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/Nocr.TelegramListener.AppServices/ServiceCollectionExtensions.cs b/src/Nocr.TelegramListener.AppServices/ServiceCollectionExtensions.cs index 330e802..299398f 100644 --- a/src/Nocr.TelegramListener.AppServices/ServiceCollectionExtensions.cs +++ b/src/Nocr.TelegramListener.AppServices/ServiceCollectionExtensions.cs @@ -17,7 +17,8 @@ public static class ServiceCollectionExtensions services.AddHostedService(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/IEditMessageHandler.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/IEditMessageHandler.cs new file mode 100644 index 0000000..fe8b80a --- /dev/null +++ b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/IEditMessageHandler.cs @@ -0,0 +1,8 @@ +using TL; + +namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers; + +public interface IEditMessageHandler +{ + Task Handle(MessageBase messageBase); +} \ No newline at end of file diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/IMessageHandler.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/IMessageHandler.cs deleted file mode 100644 index bad3987..0000000 --- a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/IMessageHandler.cs +++ /dev/null @@ -1,8 +0,0 @@ -using TL; - -namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers; - -public interface IMessageHandler -{ - Task HandleMessage(MessageBase messageBase, bool edit = false); -} \ No newline at end of file diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/INewMessageHandler.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/INewMessageHandler.cs new file mode 100644 index 0000000..866ee09 --- /dev/null +++ b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/INewMessageHandler.cs @@ -0,0 +1,8 @@ +using TL; + +namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers; + +public interface INewMessageHandler +{ + Task Handle(MessageBase messageBase); +} \ No newline at end of file diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/EditMessageHandler.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/EditMessageHandler.cs new file mode 100644 index 0000000..21c7e5c --- /dev/null +++ b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/EditMessageHandler.cs @@ -0,0 +1,39 @@ +using Microsoft.Extensions.Logging; +using TL; + +namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers; + +public sealed class EditMessageHandler : IEditMessageHandler +{ + private readonly ILogger _logger; + private readonly TelegramRegistry _telegramRegistry; + + public EditMessageHandler(ILogger logger, + TelegramRegistry telegramRegistry) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _telegramRegistry = telegramRegistry ?? throw new ArgumentNullException(nameof(telegramRegistry)); + } + + public Task Handle(MessageBase messageBase) + { + _logger.LogDebug("Executing {Handler} for message {MessageId}", nameof(EditMessageHandler), messageBase.ID); + switch (messageBase) + { + case Message m: + _logger.LogInformation("{From} in {Chat} > {MessageText}", + m.from_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats) ?? m.post_author, + m.peer_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats), + m.message); + break; + case MessageService ms: + _logger.LogInformation("{From} in {Chat} > [{Action}]", + ms.from_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats), + ms.peer_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats), + ms.action.GetType().Name[13..]); + break; + } + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/NewMessageHandler.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/NewMessageHandler.cs new file mode 100644 index 0000000..735527d --- /dev/null +++ b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/NewMessageHandler.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.Logging; +using TL; + +namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers; + +public sealed class NewMessageHandler : INewMessageHandler +{ + private readonly ILogger _logger; + private readonly TelegramRegistry _telegramRegistry; + + public NewMessageHandler(ILogger logger, TelegramRegistry telegramRegistry) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _telegramRegistry = telegramRegistry ?? throw new ArgumentNullException(nameof(telegramRegistry)); + } + + public Task Handle(MessageBase messageBase) + { + _logger.LogDebug("Executing {Handler} for message {MessageId}", nameof(EditMessageHandler), messageBase.ID); + switch (messageBase) + { + case Message m: + _logger.LogInformation("{From} in {Chat} > {MessageText}", + m.from_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats) ?? m.post_author, + m.peer_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats), + m.message); + break; + case MessageService ms: + _logger.LogInformation("{From} in {Chat} > [{Action}]", + ms.from_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats), + ms.peer_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats), + ms.action.GetType().Name[13..]); + break; + } + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/UpdateHandler.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/UpdateHandler.cs similarity index 86% rename from src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/UpdateHandler.cs rename to src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/UpdateHandler.cs index 159eea2..33c122e 100644 --- a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/UpdateHandler.cs +++ b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/Implementation/UpdateHandler.cs @@ -6,14 +6,17 @@ public sealed class UpdateHandler : IUpdateHandler { private readonly ITelegramClientContainer _clientContainer; private readonly TelegramRegistry _telegramRegistry; - private readonly IMessageHandler _messageHandler; + private readonly INewMessageHandler _newMessageHandler; + private readonly IEditMessageHandler _editMessageHandler; public UpdateHandler(ITelegramClientContainer clientContainer, TelegramRegistry telegramRegistry, - IMessageHandler messageHandler) + INewMessageHandler newMessageHandler, + IEditMessageHandler editMessageHandler) { _clientContainer = clientContainer ?? throw new ArgumentNullException(nameof(clientContainer)); _telegramRegistry = telegramRegistry ?? throw new ArgumentNullException(nameof(telegramRegistry)); - _messageHandler = messageHandler ?? throw new ArgumentNullException(nameof(messageHandler)); + _newMessageHandler = newMessageHandler ?? throw new ArgumentNullException(nameof(newMessageHandler)); + _editMessageHandler = editMessageHandler ?? throw new ArgumentNullException(nameof(editMessageHandler)); } public async Task HandleUpdate(UpdatesBase updates, CancellationToken cancellationToken = default) @@ -35,10 +38,10 @@ public sealed class UpdateHandler : IUpdateHandler switch (update) { case UpdateNewMessage unm: - await _messageHandler.HandleMessage(unm.message); + await _newMessageHandler.Handle(unm.message); break; case UpdateEditMessage uem: - await _messageHandler.HandleMessage(uem.message, true); + await _editMessageHandler.Handle(uem.message); break; // Note: UpdateNewChannelMessage and UpdateEditChannelMessage are also handled by above cases case UpdateDeleteChannelMessages udcm: diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/MessageHandler.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/MessageHandler.cs deleted file mode 100644 index 7023b30..0000000 --- a/src/Nocr.TelegramListener.AppServices/UpdateListeners/Handlers/MessageHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using TL; - -namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers; - -public sealed class MessageHandler : IMessageHandler -{ - private readonly TelegramRegistry _telegramRegistry; - - public MessageHandler(TelegramRegistry telegramRegistry) - { - _telegramRegistry = telegramRegistry ?? throw new ArgumentNullException(nameof(telegramRegistry)); - } - - public Task HandleMessage(MessageBase messageBase, bool edit = false) - { - if (edit) Console.Write("(Edit): "); - switch (messageBase) - { - case Message m: - Console.WriteLine( - $"{m.from_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats) ?? m.post_author} in {m.peer_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats)}> {m.message}"); - break; - case MessageService ms: - Console.WriteLine( - $"{ms.from_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats)} in {ms.peer_id.Peer(_telegramRegistry.Users, _telegramRegistry.Chats)} [{ms.action.GetType().Name[13..]}]"); - break; - } - - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/src/Nocr.TelegramListener.AppServices/UpdateListeners/UpdateListenerBackgroundService.cs b/src/Nocr.TelegramListener.AppServices/UpdateListeners/UpdateListenerBackgroundService.cs index e3031b0..4a3af3a 100644 --- a/src/Nocr.TelegramListener.AppServices/UpdateListeners/UpdateListenerBackgroundService.cs +++ b/src/Nocr.TelegramListener.AppServices/UpdateListeners/UpdateListenerBackgroundService.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Nocr.TelegramListener.AppServices.UpdateListeners.Handlers; using TL; @@ -11,18 +12,23 @@ namespace Nocr.TelegramListener.AppServices.UpdateListeners; public sealed class UpdateListenerBackgroundService : BackgroundService { + private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; private readonly ITelegramClientContainer _telegramClientContainer; private readonly TelegramRegistry _telegramRegistry; private readonly WTelegramClientOptions _wTelegramClientOptions; - public UpdateListenerBackgroundService(IServiceProvider serviceProvider, + public UpdateListenerBackgroundService( + ILogger logger, + IServiceProvider serviceProvider, IOptions wTelegramClientOptions, ITelegramClientContainer telegramClientContainer, TelegramRegistry telegramRegistry) { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); - _telegramClientContainer = telegramClientContainer ?? throw new ArgumentNullException(nameof(telegramClientContainer)); + _telegramClientContainer = + telegramClientContainer ?? throw new ArgumentNullException(nameof(telegramClientContainer)); _telegramRegistry = telegramRegistry ?? throw new ArgumentNullException(nameof(telegramRegistry)); _wTelegramClientOptions = wTelegramClientOptions.Value ?? throw new ArgumentNullException(nameof(wTelegramClientOptions)); @@ -31,9 +37,7 @@ public sealed class UpdateListenerBackgroundService : BackgroundService protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - Console.WriteLine( - "The program will display updates received for the logged-in user. Press any key to terminate"); - WTelegram.Helpers.Log = (l, s) => System.Diagnostics.Debug.WriteLine(s); + Helpers.Log = (l, s) => System.Diagnostics.Debug.WriteLine(s); Client? client = null; while (!stoppingToken.IsCancellationRequested) { @@ -42,17 +46,18 @@ public sealed class UpdateListenerBackgroundService : BackgroundService _telegramRegistry.Clear(); _telegramClientContainer.Reset(); _telegramClientContainer.Initialize(); - + client = _telegramClientContainer.Client; client.OnUpdate += HandleUpdates; var my = await client.LoginUserIfNeeded(); _telegramRegistry.SetMy(my); - // Note: on login, Telegram may sends a bunch of updates/messages that happened in the past and were not acknowledged - Console.WriteLine( - $"We are logged-in as {_telegramRegistry.My.username ?? _telegramRegistry.My.first_name + " " + _telegramRegistry.My.last_name} (id {_telegramRegistry.My.id})"); - // We collect all infos about the users/chats so that updates can be printed with their names - var dialogs = await client.Messages_GetAllDialogs(); // dialogs = groups/channels/users + _logger.LogInformation("Telegram client is logged-in as {Username} (id {Id})", + _telegramRegistry.My.username ?? + _telegramRegistry.My.first_name + " " + _telegramRegistry.My.last_name, + _telegramRegistry.My.id); + + var dialogs = await client.Messages_GetAllDialogs(); dialogs.CollectUsersChats(_telegramRegistry.Users, _telegramRegistry.Chats); }