From d2d0cb9e038437218b2c5fb095e378915700064a Mon Sep 17 00:00:00 2001 From: Kwoth Date: Wed, 15 Sep 2021 23:18:08 +0200 Subject: [PATCH] - Possible fix for `.repeat` bug - Slight adjustment for repeater logic - Timer should no longer increase on some repeaters - Repeaters should no longer have periods when they're missing from the list --- CHANGELOG.md | 6 +++- .../Modules/Utility/RepeatCommands.cs | 4 ++- .../Utility/Services/RepeaterService.cs | 31 +++++++++++++------ .../Utility/Services/RunningRepeater.cs | 10 ++++++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0488f528b..350dc924d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,11 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog. ## Unreleased - +### Fixed +- Possible fix for `.repeat` bug + - Slight adjustment for repeater logic + - Timer should no longer increase on some repeaters + - Repeaters should no longer have periods when they're missing from the list ## [3.0.3] - 15.09.2021 diff --git a/src/NadekoBot/Modules/Utility/RepeatCommands.cs b/src/NadekoBot/Modules/Utility/RepeatCommands.cs index b7263ef7d..8d1589207 100644 --- a/src/NadekoBot/Modules/Utility/RepeatCommands.cs +++ b/src/NadekoBot/Modules/Utility/RepeatCommands.cs @@ -183,7 +183,9 @@ namespace NadekoBot.Modules.Utility private string GetRepeaterInfoString(RunningRepeater runner) { var intervalString = Format.Bold(runner.Repeater.Interval.ToPrettyStringHM()); - var executesIn = runner.NextTime - DateTime.UtcNow; + var executesIn = runner.NextTime < DateTime.UtcNow + ? TimeSpan.Zero + : runner.NextTime - DateTime.UtcNow; var executesInString = Format.Bold(executesIn.ToPrettyStringHM()); var message = Format.Sanitize(runner.Repeater.Message.TrimTo(50)); diff --git a/src/NadekoBot/Modules/Utility/Services/RepeaterService.cs b/src/NadekoBot/Modules/Utility/Services/RepeaterService.cs index a1e5e2965..33b776e74 100644 --- a/src/NadekoBot/Modules/Utility/Services/RepeaterService.cs +++ b/src/NadekoBot/Modules/Utility/Services/RepeaterService.cs @@ -76,7 +76,9 @@ where ((guildid >> 22) % {_creds.TotalShards}) == {_client.ShardId};") // because repeaters might've been modified meanwhile if (timeout > TimeSpan.Zero) { - await Task.Delay(timeout); + await Task.Delay(timeout > TimeSpan.FromMinutes(1) + ? TimeSpan.FromMinutes(1) + : timeout); continue; } @@ -84,16 +86,17 @@ where ((guildid >> 22) % {_creds.TotalShards}) == {_client.ShardId};") var now = DateTime.UtcNow + TimeSpan.FromSeconds(3); var toExecute = new List(); - while (true) + lock (_repeaterQueue) { - lock (_repeaterQueue) + var current = _repeaterQueue.First; + while (true) { - var current = _repeaterQueue.First; + if (current is null || current.Value.NextTime > now) break; toExecute.Add(current.Value); - _repeaterQueue.RemoveFirst(); + current = current.Next; } } @@ -121,14 +124,24 @@ where ((guildid >> 22) % {_creds.TotalShards}) == {_client.ShardId};") { if (rep.ErrorCount >= 10) { + RemoveFromQueue(rep.Repeater.Id); await RemoveRepeaterInternal(rep.Repeater); return; } - - rep.UpdateNextTime(); - AddToQueue(rep); + + UpdatePosition(rep); } - + + private void UpdatePosition(RunningRepeater rep) + { + lock (_queueLocker) + { + rep.UpdateNextTime(); + _repeaterQueue.Remove(rep); + AddToQueue(rep); + } + } + public async Task TriggerExternal(ulong guildId, int index) { using var uow = _db.GetDbContext(); diff --git a/src/NadekoBot/Modules/Utility/Services/RunningRepeater.cs b/src/NadekoBot/Modules/Utility/Services/RunningRepeater.cs index 9d7ebe946..2420efd9a 100644 --- a/src/NadekoBot/Modules/Utility/Services/RunningRepeater.cs +++ b/src/NadekoBot/Modules/Utility/Services/RunningRepeater.cs @@ -92,5 +92,15 @@ namespace NadekoBot.Modules.Utility.Services var initialIntervalMultiplier = 1 - (triggerCount - Math.Truncate(triggerCount)); return DateTime.UtcNow + (Repeater.Interval * initialIntervalMultiplier); } + + public override bool Equals(object? obj) + { + return obj is RunningRepeater rr && rr.Repeater.Id == this.Repeater.Id; + } + + public override int GetHashCode() + { + return this.Repeater.Id; + } } } \ No newline at end of file