我想使间隔消息不一致机器人

时间:2019-09-24 14:14:32

标签: node.js discord discord.js commando

我想让那个不和谐的机器人将发送消息间隔为ex。在10分钟内,但是会引发错误!请帮我! (对不起,我的英语不完美)

这是代码:

const Commando = require('discord.js-commando');
const bot = new Commando.Client({commandPrefix: '$'});
const TOKEN = 'here is token';
const MIN_INTERVAL = 100;

bot.registry.registerGroup('connectc', 'Connectc');
bot.registry.registerGroup('defaultc', 'Defaultc');
bot.registry.registerDefaults();
bot.registry.registerCommandsIn(__dirname + "/commands")

bot.on('ready', function(){
    console.log("Ready");
});
setInterval(function(){
    var generalChannel = bot.channels.get("542082004821213197"); // Replace with known channel ID
    generalChannel.send("Hello, world!") ;
}, MIN_INTERVAL);

bot.login(TOKEN);

它会引发此错误

PS C:\Users\User\Documents\Visual Studio Code\Discord Bots\VblacqeBot> node .
C:\Users\User\Documents\Visual Studio Code\Discord Bots\VblacqeBot\index.js:18
    generalChannel.send("Eldo!") ;
                   ^

TypeError: Cannot read property 'send' of undefined
    at eldo (C:\Users\User\Documents\Visual Studio Code\Discord Bots\VblacqeBot\index.js:18:20)
    at Object.<anonymous> (C:\Users\User\Documents\Visual Studio Code\Discord Bots\VblacqeBot\index.js:28:13)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
PS C:\Users\User\Documents\Visual Studio Code\Discord Bots\VblacqeBot> 

2 个答案:

答案 0 :(得分:1)

您可能正在尝试在bot就绪之前执行此操作-因为间隔实际上是毫秒

  1. 使时间间隔正确:

    const MIN_INTERVAL = 10 * 60 * 1000;
    // 10 minutes, 60 seconds in a minute, 1000 milliseconds in a second
    
  2. 确保仅在机器人准备就绪后 开始您的时间间隔:

    bot.on('ready', function(){
      console.log("Ready");
      setInterval(/* ... */);
    });
    

顺便说一句,您应该使用在Client上定义的间隔方法-它们保证如果客户端被销毁,它们也会被取消:

bot.setInterval(/*...*/);

请参见https://discord.js.org/#/docs/main/master/class/BaseClient-Commando的客户端对此进行了扩展。

答案 1 :(得分:-1)

这取决于您的操作方式。例如,我的一个机器人每4小时将一条消息发送到一个特定的频道,我只使用异步循环功能:

async function notifLoop(){
  while(true){
    client.channels.get(/*channelid*/).send("This message is sent every ten minutes");
    await Sleep(600000)
  }
}

使用此睡眠功能:

function Sleep(milliseconds) {
    return new Promise(resolve => setTimeout(resolve, milliseconds));
}

当我的机器人准备就绪时,此循环会自动开始,如下所示:

bot.on('ready', function(){
    notifLoop();
    console.log("Ready");
});

现在,这取决于您托管它的方式,例如,服务器可能每24小时重新启动一次(例如heroku),那么您需要添加一个时间戳记。例如,您可以将其存储在config.json中(如果使用的话)