除冷却外,该机器人的运行状况非常好。如果有人键入命令,它将以随机语句之一作为响应。我想向机器人添加用户冷却时间,因此每个用户都必须等待,直到他们可以再次使用它为止。问题是,机器人的冷却部分没有用,它根本无法工作。有人可以帮帮我吗?非常感谢详细的答案。
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);
答案 0 :(得分:1)
我已经整理了您的代码,并对其进行了修改,以使其易于扩展。我还修改了Discord.js cooldown tutorial,以将冷却时间自动添加到每个命令中。
如果您想使代码更好,我强烈建议您通读Discord.js guide。
完整的解释可以在答案的底部找到。
演示场: discord.gg/2duzjPT。
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.`);
}
答案 1 :(得分:0)
详细信息:
第一个问题是由于您对msg
的引用不存在,因此您的第二个条件从未通过。
看来您要尝试执行的操作是引用参数message
,它将保存所需数据的对象。
{
author: {
id: 'm5000'
}
}
尝试以下
if (message.content.startsWith("!random") && talkedRecently.has(message.author.id)) {
... Your code here
}
第二个问题只是“麻烦”,将来您可以研究ESLint以便尽早发现这些问题。
看来您用)};
而不是});
错误地关闭了client.on()方法