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



由于某些原因,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);

不在这里^^

如果您希望第二段代码的工作方式与第一个工作示例的工作方式相同,则需要更改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变量。你只是做了CCD_ 4而不将其结果放入该变量中,如: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。在这种情况下,您需要在setInterval中运行的方法之前添加async,如我上面的解决方案所示。

也许你可以这样做:

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

但我的代码也工作

这很容易做到,你只需转到机器人应该发送的消息,然后放上这个

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

如果你有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}))

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

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

您甚至可以像m.replym.edit一样在每次超时时使用此方法!

最新更新