Deleting all messages in discord.js text channel

爷,独闯天下 提交于 2020-12-29 06:39:49

问题


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 written in that channel. Any clues?


回答1:


Try this

async () => {
  let fetched;
  do {
    fetched = await channel.fetchMessages({limit: 100});
    message.channel.bulkDelete(fetched);
  }
  while(fetched.size >= 2);
}



回答2:


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.




回答3:


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




回答4:


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()
}



回答5:


Here's @Kiyokodyele answer but with some changes.

(async () => {
  let deleted;
  do {
    deleted = await channel.bulkDelete(100);
  } while (deleted.size != 0);
})();



回答6:


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);


来源:https://stackoverflow.com/questions/48228702/deleting-all-messages-in-discord-js-text-channel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!