Merge pull request #8 from Xilosof/feat/QuickDeletionOfMsgs
Thanks for the added change. I will approve it now.
This commit is contained in:
commit
e88114049e
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user