Discord.js v13:斜杠命令重复

Posted

技术标签:

【中文标题】Discord.js v13:斜杠命令重复【英文标题】:Discord.js v13: Slash commands are duplicated 【发布时间】:2022-01-07 00:50:18 【问题描述】:

这似乎是一些错误,或者我不知道,但我确信这是可以修复的。我所有的斜杠命令都是重复的,首先是最新版本的命令,其次是一些过时的命令。

我假设它与斜杠命令注册有关,所以这里是:

const guild = await client.guilds.cache
            .get("836212492769165363")

        guild.commands.set(arrayOfSlashCommands).then((cmd) => 
          const getRoles = (commandName) => 
            const permissions = arrayOfSlashCommands.find(x => x.name === commandName).userPermissions;

            if(!permissions) return null;
            return guild.roles.cache.filter(x => x.permissions.has(permissions) && !x.managed)
          

          const fullPermissions = cmd.reduce((accumulator, x) => 
            const roles = getRoles(x.name);
            if(!roles) return accumulator;

            const permissions = roles.reduce((a, v) => 
              return [
                ...a,
                
                  id: v.id, 
                  type: 'ROLE',
                  permission: true,
                ,
              ]
            , [])
            return [
              ...accumulator,
              
                id: x.id,
                permissions,
              
            ]
          , [])
          guild.commands.permissions.set( fullPermissions ).catch((e) => console.log(e))
        )

【问题讨论】:

【参考方案1】:

尝试使用此代码重新启动您的机器人:

client.application.commands.set([])

或者,如果你有公会,你可以这样做:

guild.commands.set([])

可能需要一些时间才能完成,但它会起作用。它将清除所有斜杠命令,因此您可以将它们放回去而不会重复。据我所知,您有 Guild 命令应用程序命令

【讨论】:

我尝试将client.application.commands.set([]) 放在guild.commands.set(arrayOfSlashCommands).then((cmd) => 行之前,与guild.commands.set([]) 相同,5 分钟内没有任何变化 您似乎同时设置了全局和公会命令。你做过Guild.commands.set()吗? 在我的处理程序中只有一个guild.commands.set(arrayOfSlashCommands),没有client.application.commands.set() 我需要找到一种方法来删除所有命令然后创建新命令,我试过了:`client.application.commands.fetch().then((cmds) => cmds.delete() ) - 但这没有用。 该死的一个小时后它改变了!谢谢!【参考方案2】:

全局和公会命令不一样。

说明


全局和公会命令是存储在不同位置的两种不同类型的斜线命令。 它们都有 100 的限制,并且有自己的速率限制。

那么有什么区别呢?


全局命令对所有公会和用户(包括 DM)可见。 另一方面,公会命令是特定于服务器的。

演示


假设您有 2 台服务器,一台名为 A,另一台名为 B。 现在,您在 A 中注册了 2 个公会命令。这 2 个命令不会出现在 B 上。 但是,如果您注册另外 2 个全局命令,这将出现在两个服务器上,包括 DM。

那我的代码怎么了?


您注册了 global 和 guild 命令,它们都具有相同的配置。 这就是它们都出现重复的原因。

修复?


有一种方法可以重置所有公会和全局命令。 通过使用下面的代码,它将立即重置公会命令。 但是,您必须等待大约 1 小时才能更新全局命令。

    const guild = client.guilds.cache.get("<guild id>");

    // This takes ~1 hour to update
    client.application.commands.set([]);
    // This updates immediately
    guild.commands.set([]);

【讨论】:

嘿,谢谢你的详细回答,但我该如何解决呢?我必须重新邀请机器人、删除集成还是什么?您应该在答案中添加解决方案标题,我们将不胜感激(并标记为答案)。 您下次应该在问题中要求修复,就像标记的答案所说的那样做。大多数人会认为你想要解释它是如何发生的。 我为你添加了一切,下次。包括诸如“我将如何解决这个问题?”之类的内容。这样人们就可以知道您也在寻求修复。

以上是关于Discord.js v13:斜杠命令重复的主要内容,如果未能解决你的问题,请参考以下文章

如何将斜杠命令隐藏到特定用户或频道 Discord.js v13

如何使用 discord.js 调用 SubCommand 的选项? (v13)

Discord.js V13 使用斜线命令时添加角色

Discord.js 缺少对斜杠命令的访问权限

Discord.js v13,@discordjs/voice 播放音乐命令

Ping 为负值(Discord.js v13)