Как поставить таймер между 2 сообщениями / командами бота - PullRequest
2 голосов
/ 22 апреля 2020

Я создал бот-дискордант, вот код

const Discord = require("discord.js");
const client = new Discord.Client();

client.on("ready", () => {
   console.log("I am ready!");
});

client.on("message", (message) => {
if (message.content.startsWith("!kevin")) {
  message.channel.send("i'm kevin");
}
if (message.content.startsWith("!thomas")) {
  message.channel.send("random text blabla");
}

Обычно, когда я что-то печатаю, мой бот отвечает в чате соответствующей строкой, моя текущая проблема - мой диссонанс большой в наше время, и я хотел бы ограничить бот только X сообщениями в минуту, но я не могу найти легкую функцию, чтобы сделать это

мой вопрос:

Возможно ли получить таймер между 2 сообщениями для отправки ботом, потому что без этого мой бот просто рассылает спам каждому пользователю, набирающему !somethingsomething, я бы хотел, чтобы мой бот, как только кто-то наберет !something, сам бот заблокировал от ответа на него. любой другой !something для X количество времени

Пример,

Пользователь 1:! thomas

Пользователь 2:! thomas

Пользователь 3:! thomas

Но бот отвечает только на одного из них и ставит таймер на себя, прежде чем сможет отправить новый !message ответ

Так что, в принципе, есть ли способ заставить бота отвечать на X суммы! cmd каждую минуту, или чтобы ограничить время восстановления между 2 сообщениями s бот отправляет

вот мой сценарий: https://i.imgur.com/Q7w98Rm.jpg (я знаю, что это ужасно, тем более что у него более 9000 различий! cmd, но я быстро преобразовал старый сценарий MIR C и я ужасен в javascript)

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Перезарядка для пользователей и / или бота

Итак, из ваших комментариев я узнал, что вы хотите, чтобы бот запускал команду только каждые «X» промежутки времени. Я не рекомендую это, я рекомендую просто запретить ПОЛЬЗОВАТЕЛЯМ регистрировать cmd каждый раз "X". Я включил оба в этом примере.

let lastCmdSentTime = {};
let waitTimeForUser =  60000 * 5; //Users can only run a command once every 5 minutes
let botLastSent = false;
let timeBetweenEachCmd = 60000; //Bot will only respond once a minute.

client.on("message", (message) => {
   if(botLastSent !== false ? message.createdTimestamp - botLastSent < timeBetweenEachCmd : false) return; //don't let the bot run a cmd every [timeBetweenEachCmd]
   let userLastSent = lastCmdSentTime[message.author.id] || false;
   if(userLastSent !== false ? message.createdTimestamp - userLastSent < waitTimeForUser : false) return; //don't let the user run a cmd every [waitTimeForUser]
   lastCmdSentTime[message.author.id] = message.createdTimestamp;
   botLastSent = message.createdTimestamp;


   //RUN COMMANDS

});
0 голосов
/ 23 апреля 2020

Перезарядка для команд

Просто сохраните дату, когда была выполнена команда, а затем проверьте, прошла ли определенная сумма с момента ее установки.
Пример: Отредактировано для поддержки нескольких команд

let date = false;
let commandsTimers = {
    "!kevin":{
       waitTime: 5 * 60000, // 5 minutes wait for this particular command.
       lastUsed: false,
    }
}
let defaultWaitTime = 60000 * 2; //User needs to wait 2 minutes for each command unless specified
client.on("message", (message) => {
    let msgSentDate = Date.now();
    let commandWaitTimer = commandsTimers[message.content.split(" ")[0]] || {waitTime:defaultWaitTime, lastUsed:false}; 
    if((commandWaitTimer.lastUsed !== false ? msgSentDate - commandWaitTimer.lastUsed < commandWaitTimer.waitTime : false)){
        console.log('User needs to wait: ' + (commandWaitTimer.waitTime - (msgSentDate - commandWaitTimer .lastUsed)) / 1000 + ' seconds');
        return
    }
    commandsTimers[message.content.split(" ")[0]].lastUsed = msgSentDate;

    if (message.content.startsWith("!thomas")) {        
        message.channel.send("random text blabla");
    }
    if (message.content.startsWith("!kevin")) {        
        message.channel.send("Kevin!");
    }
});
...