【问题标题】:I want to make interval message discord bot我想制作间隔消息不和谐机器人
【发布时间】:2020-01-24 16:41:37
【问题描述】:

我想让 Discord 机器人为 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> 

【问题讨论】:

  • Cannot read property 'send' of undefined 表示bot.channels.get 没有返回任何内容。

标签: node.js discord discord.js commando


【解决方案1】:

您可能试图在机器人准备好之前执行此操作 - 因为时间间隔实际上以 毫秒 为单位。

  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 的客户端扩展了它。

【讨论】:

    【解决方案2】:

    这取决于你如何做到这一点。例如,我的一个机器人每 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 中(如果您使用的话)

    【讨论】:

    • 如果你不等待你的承诺,它就不会暂停。此外,您设置它的方式无法阻止它终止 Node 进程。
    • 它给出了错误。我只在 5 秒内更改时间来尝试这个,客户端到 bot 这是错误:pastebin.com/mwNeWsfB
    猜你喜欢
    • 2021-06-30
    • 2018-11-19
    • 2017-10-30
    • 2020-04-21
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2021-04-27
    • 2019-07-11
    相关资源
    最近更新 更多