Files
telegram-bot/modules/RichSiteSummary/Service/MessageSender.cs
T

89 lines
3.1 KiB
C#
Raw Normal View History

2020-03-02 00:00:52 +04:00
using System;
using System.Collections.Concurrent;
using System.Text;
using System.Threading.Tasks;
2021-12-25 16:41:17 +02:00
using BotFramework.Abstractions;
2020-03-02 00:00:52 +04:00
using Kruzya.TelegramBot.Core.Service;
using Microsoft.Extensions.Logging;
2021-12-25 16:41:17 +02:00
using Telegram.Bot;
2020-03-02 00:00:52 +04:00
using Telegram.Bot.Exceptions;
using Telegram.Bot.Types;
namespace Kruzya.TelegramBot.RichSiteSummary.Service
{
public class MessageSender : AbstractTimedHostedService
{
protected override TimeSpan TimerPeriod => TimeSpan.FromSeconds(1);
2022-04-21 14:33:01 +03:00
protected readonly ConcurrentQueue<UserMessage> Queue;
protected readonly ConcurrentQueue<UserUnsubscribe> UnsubscribeQueue;
2020-03-02 00:00:52 +04:00
2021-12-25 16:41:17 +02:00
public MessageSender(ILogger<MessageSender> logger, IBotInstance bot, ConcurrentQueue<UserMessage> userMessageQueue, ConcurrentQueue<UserUnsubscribe> userUnsubscribeQueue) : base(logger, bot)
2020-03-02 00:00:52 +04:00
{
2022-04-21 14:33:01 +03:00
UnsubscribeQueue = userUnsubscribeQueue;
Queue = userMessageQueue;
2020-03-02 00:00:52 +04:00
}
protected override async Task OnRun()
{
2022-04-21 14:33:01 +03:00
if (Queue.IsEmpty || !Queue.TryDequeue(out var message))
2020-03-02 00:00:52 +04:00
{
return;
}
2022-04-21 14:33:01 +03:00
_logger.LogDebug("Message for {ChatId} dequeued.", message.ChatId.Identifier);
2020-03-02 00:00:52 +04:00
try
{
2021-10-21 01:56:46 +04:00
if (string.IsNullOrWhiteSpace(message.ImageUrl))
2022-04-21 14:33:01 +03:00
{
2023-01-02 19:01:03 +02:00
await _bot.BotClient.SendTextMessageAsync(message.ChatId, message.Text, 0, message.ParseMode, null,
2021-10-21 01:56:46 +04:00
message.DisableWebPagePreview);
2022-04-21 14:33:01 +03:00
}
2021-10-21 01:56:46 +04:00
else
2022-04-21 14:33:01 +03:00
{
2023-01-02 19:01:03 +02:00
await _bot.BotClient.SendPhotoAsync(message.ChatId, new InputFileUrl(message.ImageUrl), 0, message.Text,
2023-01-03 12:28:42 +02:00
message.ParseMode, null, false, message.DisableWebPagePreview);
2022-04-21 14:33:01 +03:00
}
2020-03-02 00:00:52 +04:00
}
catch (ApiRequestException e)
{
2022-04-21 14:33:01 +03:00
_logger.LogDebug("Message for {ChatId} is failed: {error}.", message.ChatId.Identifier, e.Message);
2020-03-02 00:00:52 +04:00
if (!e.Message.Contains("bot was blocked by user"))
{
ReEnqueue(message, e, message.ChatId); // looks like a network issue
return;
}
// User added bot to blacklist.
// Unsubscribe him.
2022-04-21 14:33:01 +03:00
UnsubscribeQueue.Enqueue(new UserUnsubscribe
2020-03-02 00:00:52 +04:00
{
ChatId = message.ChatId
});
}
catch (Exception e)
{
2022-04-21 14:33:01 +03:00
_logger.LogDebug("Message for {ChatId} is failed: {error}.", message.ChatId.Identifier, e.Message);
2020-03-02 00:00:52 +04:00
ReEnqueue(message, e);
}
}
private void ReEnqueue(UserMessage message, Exception e = null, ChatId chatId = null)
{
if (e != null)
{
var eMessage = new StringBuilder();
eMessage.Append(e.Message);
if (chatId != null)
{
eMessage.Append($" ({chatId.Identifier})");
}
_logger.LogError(eMessage.ToString());
}
2022-04-21 14:33:01 +03:00
Queue.Enqueue(message);
2020-03-02 00:00:52 +04:00
}
}
}