我有一个小的不和谐的机器人,我在3年前的打字稿,并出现在80多个公会,我最近决定更新它从discord.js-v12.3.1-dev
到discord.js-v13.6
,同时添加著名的斜杠命令。
但是,当我在我的“就绪”事件中用不和谐的Routes.applicationGuildCommands
例程注册它们时,当我映射到我的机器人所在的每个行会时,methode Routes.applicationGuildCommands
会在我的大多数公会(但不是全部)上给我返回一个错误Missing Access
:
Trace: S[50001]: Missing Access
at Q.runRequest (/home/user/bot/node_modules/@discordjs/rest/src/lib/handlers/SequentialHandler.ts:487:11)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async Q.queueRequest (/home/user/bot/node_modules/@discordjs/rest/src/lib/handlers/SequentialHandler.ts:200:11)
at async /home/user/bot/src/discord.ts:21:9
at async Promise.all (index 50)
at async Client.<anonymous> (/home/user/bot/src/discord.ts:19:5) {
rawError: { message: 'Missing Access', code: 50001 },
code: 50001,
status: 403,
method: 'put',
url: 'https://discord.com/api/v9/applications/642935463048642470/guilds/907457626412628088/commands',
requestBody: { files: undefined, json: [ [Object], [Object] ] }
}
at /home/user/bot/src/discord.ts:21:17
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async Promise.all (index 50)
at async Client.<anonymous> (/home/user/botsrc/discord.ts:19:5)
下面是我的代码片段(这只是我代码的一部分,我剪掉了代码中所有无关的部分)。
--我知道
Routes.applicationCommands
是存在的,但结果是一样的,我想把我的命令分别推到我的行会上,以便以后再对我的命令进行描述。
import { Client, Intents, Guild } from 'discord.js';
import { REST } from '@discordjs/rest';
import { Routes } from 'discord-api-types/v9';
import * as commands from "./commands/";
export const bot: Client = new Client({
intents: [
Intents.FLAGS.GUILDS,
Intents.FLAGS.GUILD_MEMBERS,
Intents.FLAGS.GUILD_MESSAGES,
Intents.FLAGS.DIRECT_MESSAGES,
Intents.FLAGS.GUILD_MESSAGE_REACTIONS
]
});
bot.on("ready", async (): Promise<void> => {
const commandsList: any[] = Object.keys(commands)?.map((name: string) => commands[name]);
console.log(`Curently connected on (${bot.guilds.cache.size}) servers:`);
await Promise.all(bot.guilds.cache.map(async (guild: Guild) => {
try {
await rest.put(Routes.applicationGuildCommands(bot.user.id, guild.id), { body: commandsList });
console.log(` - ${guild.name} ✔️`);
} catch (error) {
console.log(` - ${guild.name} ❌`);
console.trace(error);
}
}));
console.log(`${commandsList.length} imported command${commandsList.length ? 's' : ''}.`);
await bot.user.setActivity("le Krosmoz", { type: "WATCHING" });
});
在我的commandsList
事件的第一行创建的ready
对象是有效的,如下所示:
commandsList = [
{
name: 'help',
description: 'Print the list of commands'
},
{
name: 'toto',
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit'
options: [
{
name: 'date',
description: "The toto's date",
type: 3,
required: false
},
{
name: 'item',
description: "The toto's item",
type: 3,
required: false
}
]
}
]
我上面的代码“工作”,但是我的所有服务器(我的机器人所在的服务器)都没有注册命令、所有服务器的列表,如果Routes.applicationGuildCommands
成功与否,在机器人的控制台中显示如下:
Curently connected on (9) servers:
- Guild1 ❌
- Guild2 ✔️
- Guild3 ❌
- Guild4 ❌
- Guild5 ❌
- Guild6 ❌
- Guild7 ❌
- Guild8 ✔️
- Guild9 ❌
由console.log(
- ${guild.name}✔️);
或console.log(
- ${guild.name}❌);
产生的结果(当❌
出现时,表示遇到的Missing Access
)。
,我的问题是:我如何在我的机器人协会中成功地注册我的斜杠命令?
有些是他成功注册它们的公会(没有Missing Access
错误和✔️
)没有我的bot命令(即使重新加载了不和谐的客户端,等待了几个小时或几天的缓存问题),我的一些bot公会在遇到Missing Access
时仍然可以让我的bot命令列表工作.
当我所有的机器人公会增加他的时候,applications.commands
甚至都不存在,如果每个公会的所有者踢他并重新邀请他来修复它,但是很多机器人(比如MEE6,Tatsumaki & co)成功地推送了他们的斜杠命令,而不管他们对公会的权限如何,而不需要被踢和重新邀请。即使在我的机器人上授予administrator
权限也不允许他成功地在一个测试服务器上注册他的命令。
我已经阅读了https://discord.com/developers/docs/interactions/application-commands指南的全部“应用程序命令”部分,但没有线索,在StackOverflow上应该添加application.commands.update
作用域(但不在我的bot门户中)。
,我错过了什么吗?
和我真的不想踢我所有公会的机器人,用
applications.commands
范围重新邀请它,而很多其他的机器人不需要这么做。
发布于 2022-02-12 14:33:31
不幸的是,如果您的应用程序在公会中没有applications.commands意图,它就不能在那里创建斜杠命令。当有人使用非斜杠命令时,你可以用一个新的oauth链接在公会中发送一条消息来添加带有applications.commands意图的机器人。
关于:我真的不想踢我的机器人的所有他的公会重新邀请它与applications.commands范围,而许多其他机器人不需要这样做。
不和谐添加到所有行会的applications.commands意图与现有的机器人在他们,但如果在此之后加入的机器人没有意图,它将无法工作。
https://stackoverflow.com/questions/71091282
复制相似问题