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 _deleteRequests; protected override TimeSpan TimerPeriod => TimeSpan.FromSeconds(10); public DeleteService(ILogger logger, IBotInstance bot, ConcurrentBag deleteRequests) : base(logger, bot) { _deleteRequests = deleteRequests; } protected override async Task OnRun() { var now = DateTime.Now; var skippedRequestList = new List(); _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); } } }