Discord.js v13:斜杠命令重复
Discord.js v13: Slash commands are duplicated
这似乎是一些错误或者我不知道,但我确信这是可以修复的。我所有的斜杠命令都是重复的,第一个是最新版本的命令,第二个是一些过时的命令。
我假设它与斜杠命令注册有关,所以这里是:
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))
})
全局命令和公会命令不一样。
说明
全局命令和公会命令是存储在不同位置的 2 种不同类型的斜杠命令。
它们都有 100 的限制并有自己的速率限制。
那有什么区别呢?
- 全局命令对所有公会和用户(包括 DM)可见。
- 另一方面,公会命令是特定于服务器的。
示范[=25=]
假设您有 2 台服务器,一台名为 A
,一台名为 B
。
现在,您在 A 中注册了 2 个公会命令。这 2 个命令不会出现在 B.
上
但是,如果您注册另外 2 个全局命令,这将出现在两个服务器上,包括 DM。
那我的代码怎么了?
您同时注册了全局命令和公会命令,并且它们具有相同的配置。
这就是它们都出现重复的原因。
修复?
有一种方法可以重置所有公会和全局命令。
通过使用下面的代码,它会立即重置公会命令。
但是,您必须等待约 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([]);
尝试使用此代码重新启动您的机器人:
client.application.commands.set([])
或者如果你有公会,你可以这样做:
guild.commands.set([])
这可能需要一些时间才能完成,但它会起作用。它将清除所有斜杠命令,这样您就可以将它们放回去而无需重复。据我所知,您同时拥有 Guild 命令 和 应用程序命令
这似乎是一些错误或者我不知道,但我确信这是可以修复的。我所有的斜杠命令都是重复的,第一个是最新版本的命令,第二个是一些过时的命令。
我假设它与斜杠命令注册有关,所以这里是:
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))
})
全局命令和公会命令不一样。
说明
全局命令和公会命令是存储在不同位置的 2 种不同类型的斜杠命令。
它们都有 100 的限制并有自己的速率限制。
那有什么区别呢?
- 全局命令对所有公会和用户(包括 DM)可见。
- 另一方面,公会命令是特定于服务器的。
示范[=25=]
假设您有 2 台服务器,一台名为 A
,一台名为 B
。
现在,您在 A 中注册了 2 个公会命令。这 2 个命令不会出现在 B.
上
但是,如果您注册另外 2 个全局命令,这将出现在两个服务器上,包括 DM。
那我的代码怎么了?
您同时注册了全局命令和公会命令,并且它们具有相同的配置。
这就是它们都出现重复的原因。
修复?
有一种方法可以重置所有公会和全局命令。
通过使用下面的代码,它会立即重置公会命令。
但是,您必须等待约 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([]);
尝试使用此代码重新启动您的机器人:
client.application.commands.set([])
或者如果你有公会,你可以这样做:
guild.commands.set([])
这可能需要一些时间才能完成,但它会起作用。它将清除所有斜杠命令,这样您就可以将它们放回去而无需重复。据我所知,您同时拥有 Guild 命令 和 应用程序命令