Javascript Discord bot冷却不起作用

时间:2020-07-28 14:26:43

标签: javascript discord bots

除冷却外,该机器人的运行状况非常好。如果有人键入命令,它将以随机语句之一作为响应。我想向机器人添加用户冷却时间,因此每个用户都必须等待,直到他们可以再次使用它为止。问题是,机器人的冷却部分没有用,它根本无法工作。有人可以帮帮我吗?非常感谢详细的答案。

const Discord = require('discord.js');

const client = new Discord.Client();

const prefix = '!';

const used = new Map();

const talkedRecently = new Set();

client.once('ready', () => {
    console.log('Ready!');
});


  client.on("message", (message) => {
    if (message.content.startsWith("!random") && talkedRecently.has(msg.author.id)) {
    msg.channel.send("Wait 1 minute before getting typing this again. - " + msg.author);}
    else {
        let tomb=["something1","something2", "something3",];
  
  let i = tomb[Math.floor(Math.random()*tomb.length)];
      message.channel.send(i);
    }
            talkedRecently.add(msg.author.id);
        setTimeout(() => {
          // Removes the user from the set after a minute
          talkedRecently.delete(msg.author.id);
        }, 60000);
    )};
 

client.login(process.env.token);

2 个答案:

答案 0 :(得分:1)

我已经整理了您的代码,并对其进行了修改,以使其易于扩展。我还修改了Discord.js cooldown tutorial,以将冷却时间自动添加到每个命令中。

如果您想使代码更好,我强烈建议您通读Discord.js guide

完整的解释可以在答案的底部找到。

演示场: discord.gg/2duzjPT

演示

Discord command cooldown example

代码

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

const prefix = '!';

const cooldowns = new Discord.Collection();

client.once('ready', () => {
  console.log('Ready!');
});

client.on('message', (message) => {
  if (message.author.bot || !message.content.startsWith(prefix)) return;

  const [ command, ...args ] = message.content.slice(prefix.length).split(/\s+/g);

  if (!cooldowns.has(command)) {
    cooldowns.set(command, new Discord.Collection());
  }

  const now = Date.now();
  const timestamps = cooldowns.get(command);
  const cooldownAmount = 1 * 60 * 1000;

  if (timestamps.has(message.author.id)) {
    const expirationTime = timestamps.get(message.author.id) + cooldownAmount;

    if (now < expirationTime) {
      const timeLeft = (expirationTime - now) / 1000;
      return message.reply(`Please wait ${timeLeft.toFixed(1)} more second(s) before reusing the \`${command}\` command.`);
    }
  }

  timestamps.set(message.author.id, now);
  setTimeout(() => timestamps.delete(message.author.id), cooldownAmount);

  switch (command) {
    case 'random':
      let tomb = ['something1', 'something2', 'something3'];
  
      let i = tomb[Math.floor(Math.random() * tomb.length)];
      message.channel.send(i);
      break;
    default:
      message.reply(`The command \`${command}\` was not recognized.`);
  }
});

client.login(process.env.token);

说明

创建了一个集合来存储带有冷却时间的命令:

const cooldowns = new Discord.Collection();

如果消息是由漫游器发送的,或者消息的前缀不是(!开头,则消息处理程序将退出:

if (message.author.bot || !message.content.startsWith(prefix)) return;

该消息分为一个命令和参数数组;这是通过删除以.slice(prefix.length)开头的前缀,然后使用.split(/\s+/g)在每个空白处分割消息来完成的:

const [ command, ...args ] = message.content.slice(prefix.length).split(/\s+/g);

如果所请求的命令不在cooldowns集合中,则会添加该命令并将其值设置为新集合:

if (!cooldowns.has(command)) {
  cooldowns.set(command, new Discord.Collection());
}

当前时间(以毫秒为单位)放置在变量中:

const now = Date.now();

所请求命令的集合放在一个变量中;其中包含在1分钟内使用了所请求命令的所有用户:

const timestamps = cooldowns.get(command);

默认的冷却时间设置为1分钟:

const cooldownAmount = 1 * 60 * 1000;

这将检查用户是否属于所请求命令的集合;如果是,则计算可以再次使用该命令的时间,并进行检查以查看到期时间是否已过;如果还没有,则计算剩余时间,向用户发送一条消息,然后消息处理程序退出:

if (timestamps.has(message.author.id)) {
  const expirationTime = timestamps.get(message.author.id) + cooldownAmount;

  if (now < expirationTime) {
    const timeLeft = (expirationTime - now) / 1000;
    return message.reply(`Please wait ${timeLeft.toFixed(1)} more second(s) before reusing the \`${command}\` command.`);
  }
}

如果用户在1分钟内未使用该命令,则将其用户ID添加到集合中,并创建计时器以在经过一分钟后自动从集合中删除其用户ID:

timestamps.set(message.author.id, now);
setTimeout(() => timestamps.delete(message.author.id), cooldownAmount);

最后,机器人检查用户输入的命令并执行某些代码;如果无法识别该命令,则会向用户发送一条消息:

switch (command) {
  case 'random':
    let tomb = ['something1', 'something2', 'something3'];

    let i = tomb[Math.floor(Math.random() * tomb.length)];
    message.channel.send(i);
    break;
  default:
    message.reply(`The command \`${command}\` was not recognized.`);
}

参考

Discord.js(documentation

JavaScript(documentation

答案 1 :(得分:0)

详细信息:

第一个问题是由于您对msg的引用不存在,因此您的第二个条件从未通过。 看来您要尝试执行的操作是引用参数message,它将保存所需数据的对象。

{
    author: {
        id: 'm5000'
    }
}

尝试以下

if (message.content.startsWith("!random") && talkedRecently.has(message.author.id)) {
   ... Your code here
}

第二个问题只是“麻烦”,将来您可以研究ESLint以便尽早发现这些问题。

看来您用)};而不是});错误地关闭了client.on()方法