mirror of
https://github.com/Bubuni-Team/telegram-bot.git
synced 2026-07-31 00:29:24 +03:00
a4f05bacab
Message delayed deleter service deals with issue when you need to delete some message with delay without blocking the execution. This is replacement for dumb Task.Delay call. Use of it could be used before as exploit, to stop responding for a long time.
59 lines
1.9 KiB
C#
59 lines
1.9 KiB
C#
using System.Collections.Concurrent;
|
|
using BotFramework.Abstractions;
|
|
using Kruzya.TelegramBot.Core.Service;
|
|
using Microsoft.Extensions.Logging;
|
|
using Telegram.Bot;
|
|
using Telegram.Bot.Exceptions;
|
|
|
|
namespace West.TelegramBot.CodeWatcher;
|
|
|
|
public class DeleteService : AbstractTimedHostedService
|
|
{
|
|
private readonly ConcurrentBag<DeleteRequest> _deleteRequests;
|
|
protected override TimeSpan TimerPeriod => TimeSpan.FromSeconds(10);
|
|
|
|
public DeleteService(ILogger<DeleteService> logger, IBotInstance bot, ConcurrentBag<DeleteRequest> deleteRequests) : base(logger,
|
|
bot)
|
|
{
|
|
_deleteRequests = deleteRequests;
|
|
}
|
|
|
|
protected override async Task OnRun()
|
|
{
|
|
var now = DateTime.Now;
|
|
var skippedRequestList = new List<DeleteRequest>();
|
|
|
|
_logger.LogDebug("Spinning up the delete requests loop. Request count: {RequestCount}", _deleteRequests.Count);
|
|
for (var i = 0; i < _deleteRequests.Count; i++)
|
|
{
|
|
if (!_deleteRequests.TryTake(out var request))
|
|
{
|
|
_logger.LogDebug("Nothing to take, breaking...");
|
|
break;
|
|
}
|
|
|
|
if (request.DeleteAt < now)
|
|
{
|
|
try
|
|
{
|
|
await _bot.BotClient.DeleteMessageAsync(request.ChatId, request.MessageId);
|
|
}
|
|
catch (ApiRequestException e)
|
|
{
|
|
_logger.LogError("Error deleting message, code - {ErrorCode}, msg - {ErrorMessage}", e.ErrorCode,
|
|
e.Message);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_logger.LogDebug("Skipping {MessageId}", request.MessageId);
|
|
skippedRequestList.Add(request);
|
|
}
|
|
}
|
|
|
|
foreach (var request in skippedRequestList)
|
|
{
|
|
_deleteRequests.Add(request);
|
|
}
|
|
}
|
|
} |