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