2017-12-27 776 views
2

目前我有这样的:命令超时| Discord.js

const Discord = require("discord.js"); 
const PREFIX = ","; 
const token = "my token"; 
var bot = new Discord.Client(); 
bot.on('ready',() => { 
    bot.on('message', message => { 
     if (!message.content.startsWith(PREFIX)) return; //if not command ignore message 

     var args = message.content.substring(PREFIX.length).split(" "); //splits commands so each word = pos in array 

     switch (args[0].toLowerCase()) { //not case-sensitive anymore 

      case "hello": 
       message.channel.send("hello"); 
       break; 

      //rest of the commands 

我想限制命令“你好”的用法。我希望每次用户输入“hello”时都会有10秒的超时时间。如果用户在冷却前输入命令,它会发送一条消息,说明谁最后使用了该命令,以及冷却时间还剩多长时间。

这就是我想要的结果看起来像:

User1:   ,hello 
Bot:    hello 

(After 1 second) 

User2:   ,hello 
Bot:   User1 has already used this command, please wait another 9 seconds to use it again 

(After 9 seconds) 

User 2:   ,hello 
Bot:   hello 

所有帮助表示赞赏。 谢谢,

回答

1

您需要存储该命令的最后日期,然后相应地分流。为了显示最后一次使用该命令的人员,您需要将该信息与时间戳一起存储。

下面是一个例子基于你:

const Discord = require("discord.js"); 
const PREFIX = ","; 
const token = "my token"; 
const bot = new Discord.Client(); 

let lastHelloCommandDate, lastHelloCommandUser; 

bot.on('ready',() => { 
    bot.on('message', message => { 
     if (!message.content.startsWith(PREFIX)) return; //if not command ignore message 

     var args = message.content.substring(PREFIX.length).split(" "); //splits commands so each word = pos in array 

     switch (args[0].toLowerCase()) { //not case-sensitive anymore 

      case "hello": 
       hello(message); 
       break; 

      //rest of the commands 
    }}}) 
}) 

function hello(message) { 
    const now = new Date(); 
    if (now - lastHelloCommandDate > 10 * 60 * 1000) { 
    // It's been more than 10 mins 
    message.channel.send("hello"); 
    lastHelloCommandDate = now; 
    lastHelloCommandUser = message.sender; 
    } else { 
    // It's been less than 10 mins 
    // send a direct message to the user 
    // i don't know if message.sender exists, check the api 
    message.sender.send(`Command last used by ${lastHelloCommandUser}`); 
    } 

} 

将该样品再加工,使得命令存储在一个单独的对象和动态检查。这消除了对switch语句的需要。

const Discord = require("discord.js"); 
const PREFIX = ","; 
const token = "my token"; 
const bot = new Discord.Client(); 

let lastHelloCommandDate, lastHelloCommandUser; 

bot.on('ready',() => { 
    bot.on('message', message => { 
     if (!message.content.startsWith(PREFIX)) return; //if not command ignore message 

     var args = message.content.substring(PREFIX.length).split(" "); //splits commands so each word = pos in array 
     const command = args[0].toLowerCase(); 

     if (!commands[command]) { 
      throw new Error(`Unknown command supplied: ${command}`); 
     } 
     commands[command](message); 
    }}}) 
}) 

const commands = { 
    hello: message => { 
    const now = new Date(); 
    if (now - lastHelloCommandDate > 10 * 60 * 1000) { 
     // It's been more than 10 mins 
     message.channel.send("hello"); 
     lastHelloCommandDate = now; 
     lastHelloCommandUser = message.sender; 
    } else { 
     // It's been less than 10 mins 
     // send a direct message to the user 
     // i don't know if message.sender exists, check the api 
     message.sender.send(`Command last used by ${lastHelloCommandUser}`); 
    } 
    } 
}; 
+0

是的,'lastHelloCommandDate'应该初始化为'0'。如果它是'undefined'(如上所述),则结果为'new Date() - undefined',这会导致'NaN'(不会超过任何数字)。 –