public async Task DeleteOtherChannelMessages ( [Summary("The channel on which the the messages to delete are contained.")] ITextChannel textChannel, [Summary("The ID of the first message that will be deleted, **inclusive**.")] ulong firstMessageID, [Summary("The ID of the last message that will be deleted, **inclusive**.")] ulong lastMessageID ) { var contextChannel = Context.Channel; if (firstMessageID == 0 || lastMessageID == 0) { await contextChannel.SendMessageAsync("The provided message IDs are invalid."); return; } var originalProgressMessage = await contextChannel.SendMessageAsync($"Discovering messages to delete... 0 messages have been found so far."); var progressMessageTimestamp = originalProgressMessage.Timestamp; var persistentProgressMessage = new PersistentMessage(originalProgressMessage); var foundMessages = await textChannel.GetMessageRangeAsync(firstMessageID, lastMessageID, UpdateMessage); async Task UpdateMessage(int messages) { await persistentProgressMessage.SetContentAsync($"Discovering users to delete... {messages} messages have been found so far."); } // The progress message's timestamp is being used because it was used with Discord's clock // Avoiding clock difference issues var threshold = progressMessageTimestamp.UtcDateTime - TimeSpan.FromDays(14); foundMessages.Dissect(m => m.Timestamp.UtcDateTime < threshold, out var olderMessages, out var newerMessages); var newerMessageIDs = newerMessages.Select(m => m.Id).ToArray(); int currentlyDeletedMessages = 0; bool deletionComplete = false; await persistentProgressMessage.SetContentAsync($"{foundMessages.Count} messages are being deleted..."); await textChannel.DeleteMessagesAsync(newerMessageIDs); currentlyDeletedMessages += newerMessageIDs.Length; deletionComplete = foundMessages.Count == newerMessageIDs.Length; if (!deletionComplete) { var progressMessageUpdatingTask = UpdateProgressMessage(); foreach (var message in olderMessages) { await textChannel.DeleteMessageAsync(message); currentlyDeletedMessages++; } deletionComplete = true; await progressMessageUpdatingTask; async Task UpdateProgressMessage() { while (!deletionComplete) { var progressMessageContent = $"{foundMessages.Count} messages are being deleted... {currentlyDeletedMessages} messages have been deleted."; await persistentProgressMessage.SetContentAsync(progressMessageContent); await Task.Delay(1000); } } } await persistentProgressMessage.SetContentAsync($"{foundMessages.Count} messages have been deleted."); await Task.Delay(5000); await persistentProgressMessage.DeleteAsync(); }