From 607f478b9a979b98b020ff8964982bed3c75e22e Mon Sep 17 00:00:00 2001 From: Christopher F Date: Thu, 23 Feb 2017 17:39:10 -0500 Subject: [PATCH 1/3] Check that messages older than two weeks are not passed to bulk delete This resolves #477 --- src/Discord.Net.Core/Utils/DateTimeUtils.cs | 2 ++ src/Discord.Net.Core/Utils/Preconditions.cs | 8 ++++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 1 + 3 files changed, 11 insertions(+) diff --git a/src/Discord.Net.Core/Utils/DateTimeUtils.cs b/src/Discord.Net.Core/Utils/DateTimeUtils.cs index b36d329d1..fc9ef4b7b 100644 --- a/src/Discord.Net.Core/Utils/DateTimeUtils.cs +++ b/src/Discord.Net.Core/Utils/DateTimeUtils.cs @@ -12,6 +12,8 @@ namespace Discord public static DateTimeOffset FromSnowflake(ulong value) => FromUnixMilliseconds((long)((value >> 22) + 1420070400000UL)); + public static ulong ToSnowflake(DateTimeOffset value) + => (ulong)(ToUnixMilliseconds(value) - 1420070400000L) << 22; public static DateTimeOffset FromTicks(long ticks) => new DateTimeOffset(ticks, TimeSpan.Zero); diff --git a/src/Discord.Net.Core/Utils/Preconditions.cs b/src/Discord.Net.Core/Utils/Preconditions.cs index 14a730b7e..c246538d8 100644 --- a/src/Discord.Net.Core/Utils/Preconditions.cs +++ b/src/Discord.Net.Core/Utils/Preconditions.cs @@ -181,5 +181,13 @@ namespace Discord if (msg == null) return new ArgumentException($"Value must be less than {value}", name); else return new ArgumentException(msg, name); } + + // Bulk Delete + public static void NoMessageOlderThanTwoWeeks(ulong[] collection, string name) + { + var minimum = DateTimeUtils.ToSnowflake(DateTimeOffset.Now.Subtract(TimeSpan.FromDays(14))); + for (var i = 0; i < collection.Length; i++) + if (collection[i] <= minimum) throw new ArgumentOutOfRangeException(name, "Messages must be younger than two weeks to delete."); + } } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 065a25b55..0700b69ea 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -484,6 +484,7 @@ namespace Discord.API Preconditions.NotNull(args, nameof(args)); Preconditions.NotNull(args.MessageIds, nameof(args.MessageIds)); Preconditions.AtMost(args.MessageIds.Length, 100, nameof(args.MessageIds.Length)); + Preconditions.NoMessageOlderThanTwoWeeks(args.MessageIds, nameof(args.MessageIds)); options = RequestOptions.CreateOrClone(options); switch (args.MessageIds.Length) From 4a18b321eaabf65a3c0e6ae90b67274ff46f6ba7 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 25 Feb 2017 16:31:46 -0500 Subject: [PATCH 2/3] Change the minimum allowed message to 13d23h59m Connection/API lag could cause messages right on the edge of 14 weeks to fail on Discord's end when they pass our checks. --- src/Discord.Net.Core/Utils/Preconditions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Utils/Preconditions.cs b/src/Discord.Net.Core/Utils/Preconditions.cs index c246538d8..5c5cba7e6 100644 --- a/src/Discord.Net.Core/Utils/Preconditions.cs +++ b/src/Discord.Net.Core/Utils/Preconditions.cs @@ -185,7 +185,7 @@ namespace Discord // Bulk Delete public static void NoMessageOlderThanTwoWeeks(ulong[] collection, string name) { - var minimum = DateTimeUtils.ToSnowflake(DateTimeOffset.Now.Subtract(TimeSpan.FromDays(14))); + var minimum = DateTimeUtils.ToSnowflake(DateTimeOffset.Now.Subtract(TimeSpan.FromMilliseconds(1209540000))); for (var i = 0; i < collection.Length; i++) if (collection[i] <= minimum) throw new ArgumentOutOfRangeException(name, "Messages must be younger than two weeks to delete."); } From 66b7e0e7f03ed40cbd42f432edba03601bb786da Mon Sep 17 00:00:00 2001 From: Christopher F Date: Wed, 1 Mar 2017 17:16:06 -0500 Subject: [PATCH 3/3] Rename precondition to 'YoungerThanTwoWeeks' --- src/Discord.Net.Core/Utils/Preconditions.cs | 2 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Core/Utils/Preconditions.cs b/src/Discord.Net.Core/Utils/Preconditions.cs index 5c5cba7e6..65af6e49b 100644 --- a/src/Discord.Net.Core/Utils/Preconditions.cs +++ b/src/Discord.Net.Core/Utils/Preconditions.cs @@ -183,7 +183,7 @@ namespace Discord } // Bulk Delete - public static void NoMessageOlderThanTwoWeeks(ulong[] collection, string name) + public static void YoungerThanTwoWeeks(ulong[] collection, string name) { var minimum = DateTimeUtils.ToSnowflake(DateTimeOffset.Now.Subtract(TimeSpan.FromMilliseconds(1209540000))); for (var i = 0; i < collection.Length; i++) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 0700b69ea..9e9ac4611 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -484,7 +484,7 @@ namespace Discord.API Preconditions.NotNull(args, nameof(args)); Preconditions.NotNull(args.MessageIds, nameof(args.MessageIds)); Preconditions.AtMost(args.MessageIds.Length, 100, nameof(args.MessageIds.Length)); - Preconditions.NoMessageOlderThanTwoWeeks(args.MessageIds, nameof(args.MessageIds)); + Preconditions.YoungerThanTwoWeeks(args.MessageIds, nameof(args.MessageIds)); options = RequestOptions.CreateOrClone(options); switch (args.MessageIds.Length)