コード例 #1
0
        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();
        }