diff --git a/Directory.Packages.props b/Directory.Packages.props index 583d489..8a90382 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -11,9 +11,9 @@ - - - + + + diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/BaseHandlers/StartHandlerBase.cs b/src/Nocr.TelegramClient.AppServices/Handlers/BaseHandlers/StartHandlerBase.cs index 5565123..4fff273 100644 --- a/src/Nocr.TelegramClient.AppServices/Handlers/BaseHandlers/StartHandlerBase.cs +++ b/src/Nocr.TelegramClient.AppServices/Handlers/BaseHandlers/StartHandlerBase.cs @@ -28,6 +28,12 @@ public abstract class StartHandlerBase public async Task Handle(Update update, CancellationToken cancellationToken = default) { + if (update.Message?.From is null || update.CallbackQuery?.Message is null) + { + _logger.LogError("Не удалось выделить пользовательский колбэк.\n{@Update}", update); + return; + } + long telegramId; switch (update.Type) { diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ActivateSubscription/ActivateSubscriptionHandler.cs b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ActivateSubscription/ActivateSubscriptionHandler.cs index 7c50975..24ebe31 100644 --- a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ActivateSubscription/ActivateSubscriptionHandler.cs +++ b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ActivateSubscription/ActivateSubscriptionHandler.cs @@ -14,6 +14,7 @@ namespace Nocr.TelegramClient.AppServices.Handlers.CallbackQueries.ActivateSubsc public class ActivateSubscriptionHandler : ViewSubscriptionHandlerBase, IMatchingUpdateHandler { + private readonly ILogger _logger; public ActivateSubscriptionHandler(ILogger logger, ILocalizer localizer, IMessageDispatcherQueue messageQueue, @@ -22,18 +23,25 @@ public class ActivateSubscriptionHandler : ViewSubscriptionHandlerBase, IMatchin ITextSubscriptionsController subscriptionsController) : base(logger, localizer, messageQueue, bot, usersService, subscriptionsController) { + _logger = logger; } public async Task Handle(Update update, CancellationToken cancellationToken = default) { + if (update.CallbackQuery is null) + { + _logger.LogError("Не удалось выделить пользовательский колбэк.\n{@Update}", update); + return; + } + var callbackData = NocrCallbackData.Parse(update.CallbackQuery.Data); var from = update.CallbackQuery.From.Id; if (callbackData.Args.Count != 1 || !long.TryParse(callbackData.Args.First(), out var subscriptionId)) { - Logger.LogWarning( - "Не удалось извлечь идентификатор подписки. CallbackData: {@CallbackData}, ChatId: {ChatId}, MessageId {MessageId}", - callbackData, from, update.CallbackQuery.Message.Chat.Id); + _logger.LogWarning( + "Не удалось извлечь идентификатор подписки. CallbackData: {@CallbackData}, ChatId: {ChatId}, MessageId {MessageId}.", + callbackData, from, update.CallbackQuery?.Message?.Chat.Id); SendErrorMessage(from); return; } @@ -44,11 +52,17 @@ public class ActivateSubscriptionHandler : ViewSubscriptionHandlerBase, IMatchin } catch (Exception ex) { - Logger.LogError(ex, "Не удалось деактивировать подписку"); + _logger.LogError(ex, "Не удалось деактивировать подписку."); SendErrorMessage(from); throw; } + if (update.CallbackQuery.Message is null) + { + _logger.LogError("Не удалось выделить идентификатор сообщения из пользовательского колбэка.\n{@CallbackQuery}", update.CallbackQuery); + return; + } + await EditSubscriptionMessage(from, update.CallbackQuery.Message.MessageId, subscriptionId, CancellationToken.None); } diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/AddSubscription/AddSubscriptionHandler.cs b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/AddSubscription/AddSubscriptionHandler.cs index 15c2d91..1463247 100644 --- a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/AddSubscription/AddSubscriptionHandler.cs +++ b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/AddSubscription/AddSubscriptionHandler.cs @@ -27,6 +27,12 @@ public sealed class AddSubscriptionHandler : IMatchingUpdateHandler { - + private readonly ILogger _logger; public DeactivateSubscriptionHandler(ILogger logger, ILocalizer localizer, IMessageDispatcherQueue messageQueue, - IBot bot, + IBot bot, IUsersService usersService, - ITextSubscriptionsController subscriptionsController) + ITextSubscriptionsController subscriptionsController) : base(logger, localizer, messageQueue, bot, usersService, subscriptionsController) { + _logger = logger; } public async Task Handle(Update update, CancellationToken cancellationToken = default) { + if (update.CallbackQuery?.Message is null) + { + _logger.LogError("Не удалось выделить пользовательский колбэк.\n{@Update}", update); + return; + } + var callbackData = NocrCallbackData.Parse(update.CallbackQuery.Data); var from = update.CallbackQuery.From.Id; if (callbackData.Args.Count != 1 || !long.TryParse(callbackData.Args.First(), out var subscriptionId)) { - Logger.LogWarning( + _logger.LogWarning( "Не удалось извлечь идентификатор подписки. CallbackData: {@CallbackData}, ChatId: {ChatId}, MessageId {MessageId}", callbackData, from, update.CallbackQuery.Message.Chat.Id); SendErrorMessage(from); @@ -46,7 +53,7 @@ public class DeactivateSubscriptionHandler : ViewSubscriptionHandlerBase, } catch (Exception ex) { - Logger.LogError(ex, "Не удалось деактивировать подписку"); + _logger.LogError(ex, "Не удалось деактивировать подписку"); SendErrorMessage(from); throw; } diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/DeleteSubscription/DeleteSubscriptionHandler.cs b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/DeleteSubscription/DeleteSubscriptionHandler.cs index 5ee82e2..a851fba 100644 --- a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/DeleteSubscription/DeleteSubscriptionHandler.cs +++ b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/DeleteSubscription/DeleteSubscriptionHandler.cs @@ -18,6 +18,7 @@ namespace Nocr.TelegramClient.AppServices.Handlers.CallbackQueries.DeleteSubscri public class DeleteSubscriptionHandler : ViewSubscriptionHandlerBase, IMatchingUpdateHandler { + private readonly ILogger _logger; public DeleteSubscriptionHandler(ILogger logger, ILocalizer localizer, IMessageDispatcherQueue messageQueue, @@ -26,16 +27,23 @@ public class DeleteSubscriptionHandler : ViewSubscriptionHandlerBase, ITextSubscriptionsController subscriptionsController) : base(logger, localizer, messageQueue, bot, usersService, subscriptionsController) { + _logger = logger; } public async Task Handle(Update update, CancellationToken cancellationToken = default) { + if (update.CallbackQuery?.Message is null) + { + _logger.LogError("Не удалось выделить пользовательский колбэк.\n{@Update}", update); + return; + } + var callbackData = NocrCallbackData.Parse(update.CallbackQuery.Data); var from = update.CallbackQuery.From.Id; if (callbackData.Args.Count != 1 || !long.TryParse(callbackData.Args.First(), out var subscriptionId)) { - Logger.LogWarning( + _logger.LogWarning( "Не удалось извлечь идентификатор подписки. CallbackData: {@CallbackData}, ChatId: {ChatId}, MessageId {MessageId}", callbackData, from, update.CallbackQuery.Message.Chat.Id); SendErrorMessage(from); @@ -48,7 +56,7 @@ public class DeleteSubscriptionHandler : ViewSubscriptionHandlerBase, } catch (Exception ex) { - Logger.LogError(ex, "Не удалось удалить подписку"); + _logger.LogError(ex, "Не удалось удалить подписку."); SendErrorMessage(from); throw; } diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/Feedback/FeedbackHandler.cs b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/Feedback/FeedbackHandler.cs index fe7a9ca..6fa93a7 100644 --- a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/Feedback/FeedbackHandler.cs +++ b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/Feedback/FeedbackHandler.cs @@ -24,6 +24,12 @@ public class FeedbackHandler : IMatchingUpdateHandler public Task Handle(Update update, CancellationToken cancellationToken = default) { + if (update.CallbackQuery?.Message is null) + { + _logger.LogError("Не удалось выделить идентификатор сообщения из пользовательского колбэка.\n{@CallbackQuery}", update.CallbackQuery); + return Task.CompletedTask; + } + // TODO: Check, that other messages sent to chat, no to one, who clicks var message = new TextMessage(update.CallbackQuery.Message.Chat.Id) { diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ViewSubscription/ViewSubscriptionHandler.cs b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ViewSubscription/ViewSubscriptionHandler.cs index 7ed5715..16a36b0 100644 --- a/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ViewSubscription/ViewSubscriptionHandler.cs +++ b/src/Nocr.TelegramClient.AppServices/Handlers/CallbackQueries/ViewSubscription/ViewSubscriptionHandler.cs @@ -13,6 +13,7 @@ namespace Nocr.TelegramClient.AppServices.Handlers.CallbackQueries.ViewSubscript public class ViewSubscriptionHandler : ViewSubscriptionHandlerBase, IMatchingUpdateHandler { + private readonly ILogger _logger; public ViewSubscriptionHandler(ILogger logger, ILocalizer localizer, IMessageDispatcherQueue messageQueue, @@ -21,10 +22,17 @@ public class ViewSubscriptionHandler : ViewSubscriptionHandlerBase, IMatchingUpd ITextSubscriptionsController subscriptionsController) : base(logger, localizer, messageQueue, bot, usersService, subscriptionsController) { + _logger = logger; } public async Task Handle(Update update, CancellationToken cancellationToken = default) { + if (update.CallbackQuery?.Message is null) + { + _logger.LogError("Не удалось выделить пользовательский колбэк.\n{@Update}", update); + return; + } + var callbackData = NocrCallbackData.Parse(update.CallbackQuery.Data); var from = update.CallbackQuery.From.Id; diff --git a/src/Nocr.TelegramClient.AppServices/Handlers/Messages/FeedbackMessage/FeedbackMessageHandler.cs b/src/Nocr.TelegramClient.AppServices/Handlers/Messages/FeedbackMessage/FeedbackMessageHandler.cs index 673834f..593cc1b 100644 --- a/src/Nocr.TelegramClient.AppServices/Handlers/Messages/FeedbackMessage/FeedbackMessageHandler.cs +++ b/src/Nocr.TelegramClient.AppServices/Handlers/Messages/FeedbackMessage/FeedbackMessageHandler.cs @@ -32,12 +32,18 @@ public sealed class FeedbackMessageHandler : IMatchingUpdateHandler _logger; + protected SubscribeHandlerBase(ILogger logger, ILocalizer localizer, IMessageDispatcherQueue messageQueue, IBot bot, IUsersService usersService, ITextSubscriptionsController subscriptionsController) : base(logger, localizer, messageQueue, bot, usersService, subscriptionsController) { + _logger = logger; } protected async Task Handle(Update update, Regex regex, TextSubscriptionRule rule, CancellationToken cancellationToken = default) { + if (update.Message?.Text is null || update.Message?.From is null) + { + _logger.LogError("Не удалось выделить пользовательское сообщение.\n{@Update}", update); + return; + } + var receiverId = update.Message.Chat.Id; var match = regex.Match(update.Message.Text); diff --git a/src/Nocr.TelegramClient.AppServices/Users/UsersService.cs b/src/Nocr.TelegramClient.AppServices/Users/UsersService.cs index 2480f6c..aa7c942 100644 --- a/src/Nocr.TelegramClient.AppServices/Users/UsersService.cs +++ b/src/Nocr.TelegramClient.AppServices/Users/UsersService.cs @@ -18,6 +18,7 @@ public sealed class UsersService : IUsersService { var user = await _usersController.GetByIdentity(UserIdentityType.TelegramId, telegramId.ToString(), cancellationToken); + if (user == null) { await _usersController.Create(new CreateUserRequest @@ -31,7 +32,7 @@ public sealed class UsersService : IUsersService cancellationToken); } - return user; + return user ?? throw new InvalidOperationException($"Failed to create or retrieve user with telegramId {telegramId}"); } public Task GetByIdentity(long telegramId, CancellationToken cancellationToken = default) diff --git a/src/Nocr.TelegramClient.Core/Options/RebusRabbitMqOptions.cs b/src/Nocr.TelegramClient.Core/Options/RebusRabbitMqOptions.cs index f303d40..3778b00 100644 --- a/src/Nocr.TelegramClient.Core/Options/RebusRabbitMqOptions.cs +++ b/src/Nocr.TelegramClient.Core/Options/RebusRabbitMqOptions.cs @@ -2,11 +2,11 @@ namespace Nocr.TelegramClient.Core.Options; public sealed class RebusRabbitMqOptions { - public string ConnectionString { get; set; } + public required string ConnectionString { get; set; } - public string InputQueueName { get; set; } + public required string InputQueueName { get; set; } - public string DirectExchangeName { get; set; } + public required string DirectExchangeName { get; set; } - public string TopicsExchangeName { get; set; } + public required string TopicsExchangeName { get; set; } } \ No newline at end of file diff --git a/src/Nocr.TelegramClient.Core/Options/RestEaseOptions.cs b/src/Nocr.TelegramClient.Core/Options/RestEaseOptions.cs index 9b8676e..290da06 100644 --- a/src/Nocr.TelegramClient.Core/Options/RestEaseOptions.cs +++ b/src/Nocr.TelegramClient.Core/Options/RestEaseOptions.cs @@ -2,5 +2,5 @@ namespace Nocr.TelegramClient.Core.Options; public class RestEaseOptions { - public string BasePath { get; set; } + public required string BasePath { get; set; } } \ No newline at end of file