Установка тайм-аута для удаления сообщения, встроенного в discord.js

avatar
PrezOfTheUnitedIdiots
8 августа 2021 в 23:26
1354
2
0

У меня есть базовая система продажи билетов для канала предложений.

В идеале, когда пользователь делает .exesuggest <whatever suggestion they want> (.exe — это префикс бота), я хочу, чтобы бот ответил, что билет был отправлен персоналу, я хочу, чтобы бот удалил сообщение пользователя и удалил его собственное сообщение через 5 секунд. При этом бот отправит сообщение с автором предложения и самим предложением в канал персонала.

На данный момент все работает, за исключением того, что бот удаляет свое сообщение через 5 секунд.

Вот мой код:

const Discord = require("discord.js")

const channelId = '873769980729106442'
const check = '✅'
let registered = false

const registerEvent = client => {
    if (registered) {
        return
    }

    registered = true

    client.on('messageReactionAdd', (reaction, user) => {
        if (user.bot) {
            return
        }

        const { message } = reaction
        if (message.channel.id === channelId) {
            message.delete()
        }
    })
}

module.exports = {
    commands: ['ticket', 'suggest', 'suggestion'],
    minArgs: 1,
    expectedArgs: '<message>',
    callback: (userMessage, arguments, text, client) => {
        const { guild, member } = userMessage

        registerEvent(client)

        const channel = guild.channels.cache.get(channelId)
        const newTicketEmbed = new Discord.MessageEmbed()
        .setAuthor(userMessage.author.username)
        .setTitle('Created a new ticket.')
        .setDescription(`"${text}"`)
        .setFooter(`Click the ${check} icon to delete this message.`)
        channel.send(newTicketEmbed).then(ticketMessage => {
            ticketMessage.react(check)

            const replyEmbed = new Discord.MessageEmbed()
            .setDescription(`<@${member.id}> Your ticket has been created! Expect a reply soon!`)
            userMessage.channel.send(replyEmbed)
        })
    }
}

У меня есть работающий обработчик базы команд в другом файле, благодаря которому команда работает.

Мне просто нужно точно знать, как сделать так, чтобы ответ этого бота в replyEmbed удалялся через 5 секунд.

Источник
PLASMA chicken
9 августа 2021 в 10:46
2

Отвечает ли это на ваш вопрос? Ошибка удаления сообщения Discord с тайм-аутом

Ответы (2)

avatar
MrMythical
8 августа 2021 в 23:57
-1

Message.delete имеет аргумент options, который является объектом, и вы можете установить там время ожидания (в v13 этого нет!):

userMessage.delete({timeout: 5000}) //deletes after 5000 ms

v13 должен использовать setTimeout, так как функция была удалена

setTimeout(() => userMessage.delete(), 5000) //deletes after 5000 ms
PrezOfTheUnitedIdiots
9 августа 2021 в 01:02
0

Я знал, что у меня должен быть пользователь setTimeout, но когда я использую setTimeout для userMessage, он применяет функцию к сообщению пользователя, например. .exeticket <ticketname> вместо ответа бота на то, что я закодировал в const replyEmbed = new Discord.MessageEmbed() .setDescription(`<@${member.id}> Your ticket has been created! Expect a reply soon!`) userMessage.channel.send(replyEmbed) Как я могу использовать setTimeout с этим точным сообщением, потому что использование replyEmbed.delete() вместо userMessage вернуло ошибку.

avatar
Tyler2P
8 августа 2021 в 23:48
0

Вы можете использовать функцию setTimeout для задержки выполнения функции <message>.delete().

Пример:

setTimeout(function() { // Setup a timer
    userMessage.delete(); // Deletes the users message
    ticketMessage.delete(); // Deletes the ticket message
}, 5000); // 5 seconds in milliseconds

Полный пример:

const Discord = require("discord.js")

const channelId = '873769980729106442'
const check = '✅'
let registered = false

const registerEvent = client => {
    if (registered) return;

    registered = true

    client.on('messageReactionAdd', (reaction, user) => {
        if (user.bot) return;

        const { message } = reaction
        if (message.channel.id === channelId)
            message.delete()
    });
}

module.exports = {
    commands: ['ticket', 'suggest', 'suggestion'],
    minArgs: 1,
    expectedArgs: '<message>',
    callback: (userMessage, arguments, text, client) => {
        const { guild, member } = userMessage

        registerEvent(client)

        const channel = guild.channels.cache.get(channelId)
        const newTicketEmbed = new Discord.MessageEmbed()
          .setAuthor(userMessage.author.username)
          .setTitle('Created a new ticket.')
          .setDescription(`"${text}"`)
          .setFooter(`Click the ${check} icon to delete this message.`)
        channel.send(newTicketEmbed).then(ticketMessage => {
            ticketMessage.react(check)

            const replyEmbed = new Discord.MessageEmbed()
            .setDescription(`<@${member.id}> Your ticket has been created! Expect a reply soon!`)
            userMessage.channel.send(replyEmbed);

            setTimeout(function() { // Setup a timer
                userMessage.delete(); // Deletes the users message
                ticketMessage.delete(); // Deletes the ticket message
            }, 5000); // 5 seconds in milliseconds
        });
    }
}