我如何为某些不和谐角色设置命令冷却时间?

时间:2021-07-28 22:53:36

标签: javascript discord discord.js

所以基本上,我需要为我的不和谐命令添加一个冷却时间,但仅限于某些角色,并且每个角色必须有不同的冷却时间。例如:会员角色:.ping cmd 24 小时冷却,订阅者角色:.ping cmd 12 小时冷却。

module.exports = {
    name: 'ping',
    description: 'pings everyone',
    execute(message, args){
        if(!message.member.roles.cache.some(r => ['869682149203271710', '869682285904031764', '869682372231196682'].includes(r.id))) return message.channel.send('You dont have perms to execute this command')
        message.channel.send('@everyone');
            }
        }

基本上我的 cmd 只允许 3 个角色使用 cmd,我需要帮助为每个允许使用 cmd 的角色添加不同的定时冷却。每个角色需要有不同的冷却时间。

2 个答案:

答案 0 :(得分:0)

这不是一个很好的方法,但可以作为一个很好的例子来帮助你实现你自己的冷却系统。

为什么不那么好?

取决于用法,如果您想要单个命令的冷却时间。那么这可能是最好的方法。但是如果你想冷却多个命令,这就是它失败的地方。因为您必须一次又一次地将冷却时间代码复制到每个命令中。这真的糟糕。冷却功能应该在您的命令处理程序内部实现。该命令仅提供冷却时间和角色 ID 等冷却数据。 如果您想限制特定角色使用的命令,也是如此。但正如我所说,这取决于用途和您想要做什么。

const activeCooldowns = new Set();

module.exports = {
    name: "ping",
    description: "Ping everyone.",
    cooldowns: [ // The order is important!
        {
            id: "867559128179671051", // role id
            time: 12 // hours
        },
        {
            id: "862850962758696990", // role id
            time: 24 // hours
        }
    ],
    execute(message, args) {

        // Check if the user has any of the roles to access this command
        if (!message.member.roles.cache.some(role => ["867559128179671051", "862850962758696990", "869682372231196682"].includes(role.id))) {
            return message.channel.send("You don't have permissions to execute this command!");
        }

        // Check for an active cooldown
        if (activeCooldowns.has(message.author.id)) {
            message.channel.send("You need to wait before using this command again!");
            return;
        }

        // Execute command
        message.channel.send("@everyone");

        // Get first matching role's cooldown
        const cooldown = this.cooldowns.find((cooldown) => {
            return message.member.roles.cache.has(cooldown.id);
        });

        if (cooldown) { // Check if the role has any cooldown at all
            // Command used, set cooldown
            activeCooldowns.add(message.author.id);
            setTimeout(() => { // Schedule cooldown removal
                activeCooldowns.delete(message.author.id);
            }, cooldown.time * 60 * 60 * 1000); // Convert hours to milliseconds
        }

    }
};

为什么冷却数组的顺序很重要?

由于用户可以有多个角色,如果我们有一个用户,谁同时拥有两个角色都有冷却时间,那么谁会赢并决定冷却时间呢?这就是数组顺序出现的时候。当从第一个元素到最后一个元素搜索数组时,我们选择第一个匹配项。

您也可以仅根据用户的最高角色来确定用户的冷却时间。还有很多其他方式...

答案 1 :(得分:-2)

例如,如果您想冷静一下,则需要这样做

module.exports = {
    name: 'beep',
    description: 'Beep!',
    cooldown: 1, 
    execute(message) {
        message.channel.send('Boop.');
    },
};