Add logging

This commit is contained in:
Sergey Nazarov 2024-03-20 21:00:29 +04:00
parent e9cf1bd814
commit ffad0d2add
10 changed files with 121 additions and 56 deletions

View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=updatelisteners_005Chandlers_005Cimplementation/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -17,7 +17,8 @@ public static class ServiceCollectionExtensions
services.AddHostedService<UpdateListenerBackgroundService>();
services.AddScoped<IUpdateHandler, UpdateHandler>();
services.AddScoped<IMessageHandler, MessageHandler>();
services.AddScoped<INewMessageHandler, NewMessageHandler>();
services.AddScoped<IEditMessageHandler, EditMessageHandler>();
services.AddSingleton<ITelegramClientContainer, TelegramClientContainer>();
services.AddSingleton<TelegramRegistry>();

View File

@ -0,0 +1,8 @@
using TL;
namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers;
public interface IEditMessageHandler
{
Task Handle(MessageBase messageBase);
}

View File

@ -1,8 +0,0 @@
using TL;
namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers;
public interface IMessageHandler
{
Task HandleMessage(MessageBase messageBase, bool edit = false);
}

View File

@ -0,0 +1,8 @@
using TL;
namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers;
public interface INewMessageHandler
{
Task Handle(MessageBase messageBase);
}

View File

@ -0,0 +1,39 @@
using Microsoft.Extensions.Logging;
using TL;
namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers;
public sealed class EditMessageHandler : IEditMessageHandler
{
private readonly ILogger<EditMessageHandler> _logger;
private readonly TelegramRegistry _telegramRegistry;
public EditMessageHandler(ILogger<EditMessageHandler> 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;
}
}

View File

@ -0,0 +1,38 @@
using Microsoft.Extensions.Logging;
using TL;
namespace Nocr.TelegramListener.AppServices.UpdateListeners.Handlers;
public sealed class NewMessageHandler : INewMessageHandler
{
private readonly ILogger<NewMessageHandler> _logger;
private readonly TelegramRegistry _telegramRegistry;
public NewMessageHandler(ILogger<NewMessageHandler> 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;
}
}

View File

@ -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:

View File

@ -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;
}
}

View File

@ -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<UpdateListenerBackgroundService> _logger;
private readonly IServiceProvider _serviceProvider;
private readonly ITelegramClientContainer _telegramClientContainer;
private readonly TelegramRegistry _telegramRegistry;
private readonly WTelegramClientOptions _wTelegramClientOptions;
public UpdateListenerBackgroundService(IServiceProvider serviceProvider,
public UpdateListenerBackgroundService(
ILogger<UpdateListenerBackgroundService> logger,
IServiceProvider serviceProvider,
IOptions<WTelegramClientOptions> 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);
}