Я хочу сделать интервал сообщения диссонанс бот - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу, чтобы бот разногласий отправлял интервал сообщений для бывших.через 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 ]

1 голос
/ 24 сентября 2019

Вы, вероятно, пытаетесь сделать это до того, как бот будет готов - потому что интервал фактически равен миллисекундам .

  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 расширяет это.

0 голосов
/ 24 сентября 2019

Зависит от того, как ты это делаешь.Например, один из моих ботов отправляет сообщение каждые 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 (если вы его используете)

...