【问题标题】:Setting a timeout to delete a message embed on discord.js设置超时以删除嵌入 discord.js 上的消息
【发布时间】:2021-10-12 18:09:17
【问题描述】:

我有一个建议频道的基本票务系统。

理想情况下,当用户执行.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 秒后被删除。

【问题讨论】:

标签: discord.js


【解决方案1】:

您可以使用setTimeout 函数来延迟&lt;message&gt;.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
        });
    }
}

【讨论】:

    【解决方案2】:

    Message.delete 有一个 options 参数,它是一个对象,你可以在那里设置超时时间(v13 没有这个!):

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

    v13 必须使用 setTimeout,因为该功能已被删除

    setTimeout(() => userMessage.delete(), 5000) //deletes after 5000 ms
    

    【讨论】:

    • 我知道我应该有用户setTimeout,但是当我将setTimeout 用于userMessage 时,它会将函数应用于用户消息,例如.exeticket &lt;ticketname&gt; 而不是机器人对我在 const replyEmbed = new Discord.MessageEmbed() .setDescription(`&lt;@${member.id}&gt; Your ticket has been created! Expect a reply soon!`) userMessage.channel.send(replyEmbed) 中编码的内容的回复 我如何使用 setTimeout 来提供确切的消息,因为使用 replyEmbed.delete() 而不是 userMessage 返回错误。
    猜你喜欢
    • 2020-09-07
    • 2020-09-08
    • 1970-01-01
    • 2020-07-22
    • 2021-06-17
    • 2018-08-26
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多