diff --git a/TelegramBotBase/Form/AutoCleanForm.cs b/TelegramBotBase/Form/AutoCleanForm.cs
index 4a7c6c5..d61f72e 100644
--- a/TelegramBotBase/Form/AutoCleanForm.cs
+++ b/TelegramBotBase/Form/AutoCleanForm.cs
@@ -1,8 +1,10 @@
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
+using System.Threading;
using System.Threading.Tasks;
+using Telegram.Bot.Exceptions;
using Telegram.Bot.Types;
using TelegramBotBase.Args;
using TelegramBotBase.Attributes;
@@ -127,25 +129,39 @@ namespace TelegramBotBase.Form
///
public async Task MessageCleanup()
{
- while (this.OldMessages.Count > 0)
+ var oldMessages = OldMessages.AsEnumerable();
+
+ while (oldMessages.Any())
{
- var tasks = new List();
- var msgs = this.OldMessages.Take(Constants.Telegram.MessageDeletionsPerSecond);
-
- foreach (var msg in msgs)
+ using var cts = new CancellationTokenSource();
+ var deletedMessages = new ConcurrentBag();
+ var parallelQuery = OldMessages.AsParallel()
+ .WithCancellation(cts.Token);
+ Task retryAfterTask = null;
+ try
{
- tasks.Add(this.Device.DeleteMessage(msg));
+ parallelQuery.ForAll(i =>
+ {
+ Device.DeleteMessage(i).GetAwaiter().GetResult();
+ deletedMessages.Add(i);
+ });
+ }
+ catch (AggregateException ex)
+ {
+ cts.Cancel();
+
+ var retryAfterSeconds = ex.InnerExceptions
+ .Where(e => e is ApiRequestException apiEx && apiEx.ErrorCode == 429)
+ .Max(e =>(int?) ((ApiRequestException)e).Parameters.RetryAfter) ?? 0;
+ retryAfterTask = Task.Delay(retryAfterSeconds * 1000);
}
- await Task.WhenAll(tasks);
+ oldMessages = oldMessages.Where(x => !deletedMessages.Contains(x));
+ if (retryAfterTask != null)
+ await retryAfterTask;
+ }
- foreach(var m in msgs)
- {
- Device.OnMessageDeleted(new MessageDeletedEventArgs(m));
- }
-
- this.OldMessages.RemoveRange(0, msgs.Count());
- }
+ OldMessages.Clear();
}
}
}