Deleting all messages in discord.js text channel

后端 未结 7 1595
梦如初夏
梦如初夏 2021-02-09 18:09

Ok, so I searched for a while, but I couldn\'t find any information on how to delete all messages in a discord channel. And by all messages I mean every single message ever writ

相关标签:
7条回答
  • 2021-02-09 18:43

    Another approach could be cloning the channel and deleting the one with the messages you want deleted:

    // Clears all messages from a channel by cloning channel and deleting old channel
    async function clearAllMessagesByCloning(channel) {
        // Clone channel
        const newChannel = await channel.clone()
        console.log(newChannel.id) // Do with this new channel ID what you want
    
        // Delete old channel
        channel.delete()
    }
    

    I prefer this method rather than the ones listed on this thread because it most likely takes less time to process and (I'm guessing) puts the Discord API under less stress. Also, channel.bulkDelete() is only able to delete messages that are newer than two weeks, which means you won't be able to delete every channel message in case your channel has messages that are older than two weeks.

    The possible downside is the channel changing id. In case you rely on storing ids in a database or such, don't forget to update those documents with the id of the newly cloned channel!

    0 讨论(0)
  • 2021-02-09 18:48

    Here's my improved version that is quicker and lets you know when its done in the console but you'll have to run it for each username that you used in a channel (if you changed your username at some point):

    // Turn on Developer Mode under User Settings > Appearance > Developer Mode (at the bottom)
    // Then open the channel you wish to delete all of the messages (could be a DM) and click the three dots on the far right.
    // Click "Copy ID" and paste that instead of LAST_MESSAGE_ID.
    // Copy / paste the below script into the JavaScript console.
    
    var before = 'LAST_MESSAGE_ID';
    var your_username = ''; //your username
    var your_discriminator = ''; //that 4 digit code e.g. username#1234
    var foundMessages = false;
    clearMessages = function(){
        const authToken = document.body.appendChild(document.createElement`iframe`).contentWindow.localStorage.token.replace(/"/g, "");
        const channel = window.location.href.split('/').pop();
        const baseURL = `https://discordapp.com/api/channels/${channel}/messages`;
        const headers = {"Authorization": authToken };
    
        let clock = 0;
        let interval = 500;
    
        function delay(duration) {
              return new Promise((resolve, reject) => {
                  setTimeout(() => resolve(), duration);
              });
        }
    
        fetch(baseURL + '?before=' + before + '&limit=100', {headers})
        .then(resp => resp.json())
        .then(messages => {
            return Promise.all(messages.map((message) => {
                before = message.id;
                foundMessages = true;
    
                if (
                    message.author.username == your_username
                    && message.author.discriminator == your_discriminator
                ) {
                    return delay(clock += interval).then(() => fetch(`${baseURL}/${message.id}`, {headers, method: 'DELETE'}));
                }
            }));
        }).then(() => {
    
            if (foundMessages) {
                foundMessages = false;
                clearMessages();
            } else {
                console.log('DONE CHECKING CHANNEL!!!')
            }
    
        });
    }
    clearMessages();
    

    The previous script I found for deleting your own messages without a bot...

    // Turn on Developer Mode under User Settings > Appearance > Developer Mode (at the bottom)
    // Then open the channel you wish to delete all of the messages (could be a DM) and click the three dots on the far right.
    // Click "Copy ID" and paste that instead of LAST_MESSAGE_ID.
    // Copy / paste the below script into the JavaScript console.
    // If you're in a DM you will receive a 403 error for every message the other user sent (you don't have permission to delete their messages).
    
    var before = 'LAST_MESSAGE_ID';
    clearMessages = function(){
        const authToken = document.body.appendChild(document.createElement`iframe`).contentWindow.localStorage.token.replace(/"/g, "");
        const channel = window.location.href.split('/').pop();
        const baseURL = `https://discordapp.com/api/channels/${channel}/messages`;
        const headers = {"Authorization": authToken };
    
        let clock = 0;
        let interval = 500;
    
        function delay(duration) {
            return new Promise((resolve, reject) => {
                setTimeout(() => resolve(), duration);
            });
        }
    
        fetch(baseURL + '?before=' + before + '&limit=100', {headers})
            .then(resp => resp.json())
            .then(messages => {
            return Promise.all(messages.map((message) => {
                before = message.id;
                return delay(clock += interval).then(() => fetch(`${baseURL}/${message.id}`, {headers, method: 'DELETE'}));
            }));
        }).then(() => clearMessages());
    }
    clearMessages();
    

    Reference: https://gist.github.com/IMcPwn/0c838a6248772c6fea1339ddad503cce

    0 讨论(0)
  • 2021-02-09 18:49

    This will work so long your bot has appropriate permissions.

    module.exports = {
        name: "clear",
        description: "Clear messages from the channel.",
        args: true,
        usage: "<number greater than 0, less than 100>",
        execute(message, args) {
            const amount = parseInt(args[0]) + 1;
    
            if (isNaN(amount)) {
                return message.reply("that doesn't seem to be a valid number.");
            } else if (amount <= 1 || amount > 100) {
                return message.reply("you need to input a number between 1 and 99.");
            }
    
            message.channel.bulkDelete(amount, true).catch((err) => {
                console.error(err);
                message.channel.send(
                    "there was an error trying to prune messages in this channel!"
                );
            });
        },
    };
    

    In case you didn't read the DiscordJS docs, you should have an index.js file that looks a little something like this:

    const Discord = require("discord.js");
    const { prefix, token } = require("./config.json");
    
    const client = new Discord.Client();
    client.commands = new Discord.Collection();
    const commandFiles = fs
        .readdirSync("./commands")
        .filter((file) => file.endsWith(".js"));
    
    for (const file of commandFiles) {
        const command = require(`./commands/${file}`);
        client.commands.set(command.name, command);
    }
    
    //client portion:
    
    client.once("ready", () => {
        console.log("Ready!");
    });
    
    client.on("message", (message) => {
        if (!message.content.startsWith(prefix) || message.author.bot) return;
    
        const args = message.content.slice(prefix.length).split(/ +/);
        const commandName = args.shift().toLowerCase();
    
        if (!client.commands.has(commandName)) return;
        const command = client.commands.get(commandName);
    
        if (command.args && !args.length) {
            let reply = `You didn't provide any arguments, ${message.author}!`;
    
            if (command.usage) {
                reply += `\nThe proper usage would be: \`${prefix}${command.name} ${command.usage}\``;
            }
    
            return message.channel.send(reply);
        }
    
        try {
            command.execute(message, args);
        } catch (error) {
            console.error(error);
            message.reply("there was an error trying to execute that command!");
        }
    });
    
    client.login(token);
    
    0 讨论(0)
  • 2021-02-09 19:05

    Try this

    async () => {
      let fetched;
      do {
        fetched = await channel.fetchMessages({limit: 100});
        message.channel.bulkDelete(fetched);
      }
      while(fetched.size >= 2);
    }
    
    0 讨论(0)
  • 2021-02-09 19:05

    Discord does not allow bots to delete more than 100 messages, so you can't delete every message in a channel. You can delete less then 100 messages, using BulkDelete.

    Example:

    const Discord = require("discord.js");
    const client = new Discord.Client();
    const prefix = "!";
    
    client.on("ready" () => {
        console.log("Successfully logged into client.");
    });
    
    client.on("message", msg => {
        if (msg.content.toLowerCase().startsWith(prefix + "clearchat")) {
            async function clear() {
                msg.delete();
                const fetched = await msg.channel.fetchMessages({limit: 99});
                msg.channel.bulkDelete(fetched);
            }
            clear();
        }
    });
    
    client.login("BOT_TOKEN");
    

    Note, it has to be in a async function for the await to work.

    0 讨论(0)
  • 2021-02-09 19:06

    This will work on discord.js version 12.2.0 Just put this inside your client on message event and type the command: !nuke-this-channel Every message on channel will get wiped then, a kim jong un meme will be posted.

    if (msg.content.toLowerCase() == '!nuke-this-channel') {
        async function wipe() {
            var msg_size = 100;
            while (msg_size == 100) {
                await msg.channel.bulkDelete(100)
            .then(messages => msg_size = messages.size)
            .catch(console.error);
            }
            msg.channel.send(`<@${msg.author.id}>\n> ${msg.content}`, { files: ['http://www.quickmeme.com/img/cf/cfe8938e72eb94d41bbbe99acad77a50cb08a95e164c2b7163d50877e0f86441.jpg'] })
        }
        wipe()
    }
    
    0 讨论(0)
提交回复
热议问题