Merge pull request #8 from Xilosof/feat/QuickDeletionOfMsgs

Thanks for the added change. I will approve it now.
This commit is contained in:
Florian Dahn 2021-07-25 02:10:30 +03:00 committed by GitHub
commit e88114049e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,8 +1,10 @@
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Types; using Telegram.Bot.Types;
using TelegramBotBase.Args; using TelegramBotBase.Args;
using TelegramBotBase.Attributes; using TelegramBotBase.Attributes;
@ -127,25 +129,41 @@ namespace TelegramBotBase.Form
/// <returns></returns> /// <returns></returns>
public async Task MessageCleanup() public async Task MessageCleanup()
{ {
while (this.OldMessages.Count > 0) var oldMessages = OldMessages.AsEnumerable();
while (oldMessages.Any())
{ {
var tasks = new List<Task>(); using var cts = new CancellationTokenSource();
var msgs = this.OldMessages.Take(Constants.Telegram.MessageDeletionsPerSecond); var deletedMessages = new ConcurrentBag<int>();
var parallelQuery = OldMessages.AsParallel()
foreach (var msg in msgs) .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)
await Task.WhenAll(tasks);
foreach(var m in msgs)
{ {
Device.OnMessageDeleted(new MessageDeletedEventArgs(m)); cts.Cancel();
}
this.OldMessages.RemoveRange(0, msgs.Count()); 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);
}
deletedMessages.AsParallel().ForAll(i => Device.OnMessageDeleted(new MessageDeletedEventArgs(i)));
oldMessages = oldMessages.Where(x => !deletedMessages.Contains(x));
if (retryAfterTask != null)
await retryAfterTask;
}
OldMessages.Clear();
} }
} }
} }