From dec353e57f41b9543d2d88908ae75b87ab01135c Mon Sep 17 00:00:00 2001 From: NovusTheory <3434404+NovusTheory@users.noreply.github.com> Date: Fri, 17 May 2019 17:49:36 -0500 Subject: [PATCH] feature: messages bulk deleted event (from previous PR #1120) (#1236) * Reimplement messags bulk deleted event RogueException/Discord.Net#1120 * Update remark * Backwards compatability with config option --- .../BaseSocketClient.Events.cs | 33 +++++++++++++++++++ .../DiscordShardedClient.cs | 1 + .../DiscordSocketClient.cs | 10 +++++- .../DiscordSocketConfig.cs | 5 +++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 4f94f702d..f9a17ca2d 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace Discord.WebSocket @@ -128,6 +129,38 @@ namespace Discord.WebSocket remove { _messageDeletedEvent.Remove(value); } } internal readonly AsyncEvent, ISocketMessageChannel, Task>> _messageDeletedEvent = new AsyncEvent, ISocketMessageChannel, Task>>(); + /// Fired when multiple messages are bulk deleted. + /// + /// + /// The event will not be fired for individual messages contained in this event. + /// + /// + /// This event is fired when multiple messages are bulk deleted. The event handler must return a + /// and accept an and + /// as its parameters. + /// + /// + /// + /// It is not possible to retrieve the message via + /// ; the message cannot be retrieved by Discord + /// after the message has been deleted. + /// + /// If caching is enabled via , the + /// entity will contain the deleted message; otherwise, in event + /// that the message cannot be retrieved, the snowflake ID of the message is preserved in the + /// . + /// + /// + /// The source channel of the removed message will be passed into the + /// parameter. + /// + /// + public event Func>, ISocketMessageChannel, Task> MessagesBulkDeleted + { + add { _messagesBulkDeletedEvent.Add(value); } + remove { _messagesBulkDeletedEvent.Remove(value); } + } + internal readonly AsyncEvent>, ISocketMessageChannel, Task>> _messagesBulkDeletedEvent = new AsyncEvent>, ISocketMessageChannel, Task>>(); /// Fired when a message is updated. /// /// diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 03969f535..fe8d899b3 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -302,6 +302,7 @@ namespace Discord.WebSocket client.MessageReceived += (msg) => _messageReceivedEvent.InvokeAsync(msg); client.MessageDeleted += (cache, channel) => _messageDeletedEvent.InvokeAsync(cache, channel); + client.MessagesBulkDeleted += (cache, channel) => _messagesBulkDeletedEvent.InvokeAsync(cache, channel); client.MessageUpdated += (oldMsg, newMsg, channel) => _messageUpdatedEvent.InvokeAsync(oldMsg, newMsg, channel); client.ReactionAdded += (cache, channel, reaction) => _reactionAddedEvent.InvokeAsync(cache, channel, reaction); client.ReactionRemoved += (cache, channel, reaction) => _reactionRemovedEvent.InvokeAsync(cache, channel, reaction); diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 1b94ab1dc..b5f951608 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -66,6 +66,7 @@ namespace Discord.WebSocket internal WebSocketProvider WebSocketProvider { get; private set; } internal bool AlwaysDownloadUsers { get; private set; } internal int? HandlerTimeout { get; private set; } + internal bool UseMessagesBulkDeletedOnly { get; private set; } internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; /// @@ -128,6 +129,7 @@ namespace Discord.WebSocket WebSocketProvider = config.WebSocketProvider; AlwaysDownloadUsers = config.AlwaysDownloadUsers; HandlerTimeout = config.HandlerTimeout; + UseMessagesBulkDeletedOnly = config.UseMessagesBulkDeletedOnly; State = new ClientState(0, 0); Rest = new DiscordSocketRestClient(config, ApiClient); _heartbeatTimes = new ConcurrentQueue(); @@ -1365,13 +1367,19 @@ namespace Discord.WebSocket return; } + var cacheableList = ImmutableArray>.Empty; foreach (ulong id in data.Ids) { var msg = SocketChannelHelper.RemoveMessage(channel, this, id); bool isCached = msg != null; var cacheable = new Cacheable(msg, id, isCached, async () => await channel.GetMessageAsync(id).ConfigureAwait(false)); - await TimedInvokeAsync(_messageDeletedEvent, nameof(MessageDeleted), cacheable, channel).ConfigureAwait(false); + cacheableList = cacheableList.Add(cacheable); + + if (!UseMessagesBulkDeletedOnly) + await TimedInvokeAsync(_messageDeletedEvent, nameof(MessageDeleted), cacheable, channel).ConfigureAwait(false); } + + await TimedInvokeAsync(_messagesBulkDeletedEvent, nameof(MessagesBulkDeleted), cacheableList, channel).ConfigureAwait(false); } else { diff --git a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs index 8571cd5c9..369964b74 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketConfig.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketConfig.cs @@ -106,6 +106,11 @@ namespace Discord.WebSocket /// public int? HandlerTimeout { get; set; } = 3000; + /// + /// Gets or sets whether or not is fired for each message on bulk delete. + /// + public bool UseMessagesBulkDeletedOnly { get; set; } = false; + /// /// Initializes a default configuration. ///