我正在尝试在Discord机器人上执行倒计时计时器之类的操作。 这是我正在使用的rn。
//Command base
client.on("message", async message => {
var sender = message.author;
const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
//timetestvars
var starttimer = 0;
var counter = 10;
//countdown timer
if (command === 'testcount'){
while(starttimer <= 9){
setTimeout(function(){message.channel.send(counter), starttimer++, counter--},1*1)
}
};
});
但是当我键入命令时,什么也没有发生,就像...什么都没有。该僵尸程序只是崩溃了,我知道我做错了什么,但我不知道该怎么办。
任何人都可以告诉我我做错了什么,我该如何解决,该代码如何真正起作用,为什么会发生冲突?
非常感谢您的帮助!
答案 0 :(得分:0)
args.shift()
返回一个数字,因此当您运行args.shift().toLowerCase()
时,会抛出TypeError
。
尝试使用args.slice(1)
获取除第一个元素外的每个元素的新数组。
此外,args.slice(1)
返回一个数组,该数组与.toLowerCase()方法不兼容。
尝试更换
const command = args.shift().toLowerCase();
使用
const command = args.slice(1)[0].toLowerCase();
----或----
const command = args[0].toLowerCase();
答案 1 :(得分:0)
您崩溃的原因是因为机器人在 starttimer
甚至达到9前多次尝试重复同一件事而耗尽了内存。
while (starttimer <= 9) {
setTimeout(function(){message.channel.send(counter), starttimer++, counter--},1*1) // Note that setTimeout waits in milliseconds, not seconds (also 1*1=1) so the correct number to put here would be 1000
}
正确的方法是这样的:
var starttimer = 10; // set this to your desired start time
for (let i=0; i <= starttimer; i++) {
setTimeout(function(){
message.channel.send(i);
}, 1000*(starttimer-i));
}
您甚至可以通过执行var starttimer = args[0]
来获取开始时间,因此您将使用!testcount 10
的命令(假设您将前缀设置为!
)来启动10秒计时器。请注意,如果有延迟,则是由于Discord API冷却造成的,除了将计时器设置得更慢(例如将1000*(starttimer-i)
更改为2000*(starttimer-i)
)之外,没有太多解决方法。
P.S。我只是注意到这个问题是一年多以前问的,但我希望这对某人有帮助:P