Files

88 lines
2.9 KiB
C#
Raw Permalink 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;
2023-07-29 15:14:52 +03:00
namespace Kruzya.TelegramBot.RichSiteSummary.Service;
public class MessageSender : AbstractTimedHostedService
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
protected override TimeSpan TimerPeriod => TimeSpan.FromSeconds(1);
2020-03-02 00:00:52 +04:00
2023-07-29 15:14:52 +03:00
protected readonly ConcurrentQueue<UserMessage> Queue;
protected readonly ConcurrentQueue<UserUnsubscribe> UnsubscribeQueue;
2020-03-02 00:00:52 +04:00
2023-07-29 15:14:52 +03:00
public MessageSender(ILogger<MessageSender> logger, IBotInstance bot, ConcurrentQueue<UserMessage> userMessageQueue, ConcurrentQueue<UserUnsubscribe> userUnsubscribeQueue) : base(logger, bot)
{
UnsubscribeQueue = userUnsubscribeQueue;
Queue = userMessageQueue;
}
protected override async Task OnRun()
{
if (Queue.IsEmpty || !Queue.TryDequeue(out var message))
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
return;
2020-03-02 00:00:52 +04:00
}
2023-07-29 15:14:52 +03:00
_logger.LogDebug("Message for {ChatId} dequeued.", message.ChatId.Identifier);
try
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
if (string.IsNullOrWhiteSpace(message.ImageUrl))
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
await _bot.BotClient.SendTextMessageAsync(message.ChatId, message.Text, 0, message.ParseMode, null,
message.DisableWebPagePreview);
2020-03-02 00:00:52 +04:00
}
2023-07-29 15:14:52 +03:00
else
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
await _bot.BotClient.SendPhotoAsync(message.ChatId, new InputFileUrl(message.ImageUrl), 0, message.Text,
message.ParseMode, null, false, message.DisableWebPagePreview);
2020-03-02 00:00:52 +04:00
}
2023-07-29 15:14:52 +03:00
}
catch (ApiRequestException e)
{
_logger.LogDebug("Message for {ChatId} is failed: {error}.", message.ChatId.Identifier, e.Message);
if (!e.Message.Contains("bot was blocked by user"))
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
ReEnqueue(message, e, message.ChatId); // looks like a network issue
return;
2020-03-02 00:00:52 +04:00
}
2023-07-29 15:14:52 +03:00
// User added bot to blacklist.
// Unsubscribe him.
UnsubscribeQueue.Enqueue(new UserUnsubscribe
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
ChatId = message.ChatId
});
}
catch (Exception e)
{
_logger.LogDebug("Message for {ChatId} is failed: {error}.", message.ChatId.Identifier, e.Message);
ReEnqueue(message, e);
2020-03-02 00:00:52 +04:00
}
2023-07-29 15:14:52 +03:00
}
2020-03-02 00:00:52 +04:00
2023-07-29 15:14:52 +03:00
private void ReEnqueue(UserMessage message, Exception e = null, ChatId chatId = null)
{
if (e != null)
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
var eMessage = new StringBuilder();
eMessage.Append(e.Message);
if (chatId != null)
2020-03-02 00:00:52 +04:00
{
2023-07-29 15:14:52 +03:00
eMessage.Append($" ({chatId.Identifier})");
2020-03-02 00:00:52 +04:00
}
2023-07-29 15:14:52 +03:00
_logger.LogError(eMessage.ToString());
2020-03-02 00:00:52 +04:00
}
2023-07-29 15:14:52 +03:00
Queue.Enqueue(message);
2020-03-02 00:00:52 +04:00
}
}