如何在一段时间后删除不和谐的机器人消息?

时间:2021-04-18 22:09:02

标签: javascript discord.js

出于某种原因,message.delete({timeout: 5000}); 语句在 if 语句中不起作用。它确实在代码的早期工作。任何想法为什么?

const Discord = require('discord.js');
const client = new Discord.Client();

const config = require('./config.json');

client.on("ready", async () => {
    
    console.log('--> Online');
    
    status = client.users.cache.get(config.user).presence.status;
    channel = client.channels.cache.get(config.channel);
    
    embed = new Discord.MessageEmbed()
        embed.setDescription('I am ONLINE');
        embed.setColor('#00ccff');
    message = await channel.send(embed);
    
    message.delete({timeout: 5000}); 

它似乎在这里工作^^

    setInterval(() => {

        user = client.users.cache.get(config.user);
        updated = client.users.cache.get(config.user).presence.status;

        if(updated != status) {
            status = updated;

            if(updated == 'online') {
                channel.send(embed);
                message.delete({timeout: 5000});
            } 
        
        
        } else {
            return
        }
    }, 1250);
});

client.login(config.token);

不在这里^^

3 个答案:

答案 0 :(得分:0)

也许你可以这样做:

channel.send(embed).then(m => m.delete({ timeout: 5000 }))
            })

编辑:

您的命令不起作用,因为在您执行的第一个代码中

    message = await channel.send(embed);
    
    message.delete({timeout: 5000}); 

在您执行的第二个代码中:

      channel.send(embed);
                message.delete({timeout: 5000});

您忘记添加

 message = await channel.send(embed);

但我的代码也有效

答案 1 :(得分:0)

如果您希望第二段代码的工作方式与您的第一个工作示例的工作方式相同,您需要通过以下方式更改 setInterval 及其内容:

setInterval(async () => {

    user = client.users.cache.get(config.user);
    updated = client.users.cache.get(config.user).presence.status;

    if(updated != status) {
        status = updated;

        if(updated == 'online') {
            var message = await channel.send(embed);
            message.delete({timeout: 5000});
        } 
    
    
    } else {
        return
    }
}, 1250);

您在这里犯的两个主要错误是:

  1. 您没有定义 message 变量。你只是做了 channel.send(embed) 而不将其结果放入该变量中, 像这样:var message = await channel.send(embed);
  2. 在通道中发送消息是异步的。换句话说, 因为发送消息需要您的代码向 Discord API 和 Discord API 然后解释和 响应您的请求,消息需要一些时间 实际上被发送。因此,您的 message.delete() 行被称为 在 Discord API 甚至有机会在 首先,所以代码认为它将删除一个 不存在的消息。这就是为什么你需要使用 async/await 这里(你在你的第一段代码中做的,但不是你的 第二); await 将等到请求完成(也就是直到 Promise 已解决),然后再继续执行其余代码。 因此,通过使用 await,消息删除定时器只会 消息发送成功后开始,创建 您想要的功能。

您也可以使用 .then(),但 async/await 被设计为一种更简洁、更简单的方式来处理此类异步 Promise。请注意,为了使 await 工作,您必须将其运行的函数设置为 async。在这种情况下,您需要在 async 中运行的方法之前添加 setInterval,如我上面的解决方案所示。

答案 2 :(得分:0)

这很容易做到,您只需转到机器人应发送的消息,然后输入

.then(m => m.delete({timeout: <the time you want it to be deleted in milliseconds>}))

如果你有 discord 12v,这应该 100% 有效。

示例:

message.channel.send("This message will be deleted in 5 seconds!")
.then(m => m.delete({timeout: 5000}))

message.reply("This message will be deleted in 5 seconds!")
.then(m => m.delete({timeout: 5000}))

您可以为 m => m.delete 使用任何名称,例如 msg => msg.delete ,但它不应与 message.send 名称相同。

我的意思是不喜欢 message.channel.send("This message will be deleted in 5 seconds!") .then(message => message.delete({timeout: 5000}))

您甚至可以在每次超时时使用此方法,例如 m.replym.edit