From 9012ec76b102dbb47dbaeebb1a7c40a7d843cce9 Mon Sep 17 00:00:00 2001 From: Xilosof Date: Tue, 13 Jul 2021 22:48:01 +0300 Subject: [PATCH 1/2] feat(AutoCleanForm): change deletion of msgs - made faster deletion of old messages; - added server error handling --- TelegramBotBase/Form/AutoCleanForm.cs | 46 ++++++++++++++++++--------- 1 file changed, 31 insertions(+), 15 deletions(-) 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(); } } } From 177c1989160f0cf9847d7f389283d1b1a7d34b05 Mon Sep 17 00:00:00 2001 From: Xilosof Date: Fri, 23 Jul 2021 16:47:42 +0300 Subject: [PATCH 2/2] Added event call --- TelegramBotBase/Form/AutoCleanForm.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TelegramBotBase/Form/AutoCleanForm.cs b/TelegramBotBase/Form/AutoCleanForm.cs index d61f72e..e2db50d 100644 --- a/TelegramBotBase/Form/AutoCleanForm.cs +++ b/TelegramBotBase/Form/AutoCleanForm.cs @@ -155,6 +155,8 @@ namespace TelegramBotBase.Form .Max(e =>(int?) ((ApiRequestException)e).Parameters.RetryAfter) ?? 0; retryAfterTask = Task.Delay(retryAfterSeconds * 1000); } + + deletedMessages.AsParallel().ForAll(i => Device.OnMessageDeleted(new MessageDeletedEventArgs(i))); oldMessages = oldMessages.Where(x => !deletedMessages.Contains(x)); if (retryAfterTask != null)