refactor(TextBasedChannel): sendSlash

Using REST API (without opcode 24, fix `command outdate` error)
This commit is contained in:
March 7th 2022-06-15 18:13:25 +07:00
parent 769cbb21d5
commit 17a1a19f42
3 changed files with 43 additions and 64 deletions

View File

@ -1076,10 +1076,9 @@ class Message extends Base {
* Send context Menu v2 * Send context Menu v2
* @param {Snowflake} botId Bot id * @param {Snowflake} botId Bot id
* @param {string} commandName Command name in Context Menu * @param {string} commandName Command name in Context Menu
* @param {boolean} [search=true] Search for command
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
async contextMenu(botId, commandName, search = true) { async contextMenu(botId, commandName) {
if (!botId) throw new Error('Bot ID is required'); if (!botId) throw new Error('Bot ID is required');
const user = await this.client.users.fetch(botId).catch(() => {}); const user = await this.client.users.fetch(botId).catch(() => {});
if (!user || !user.bot || !user.applications) { if (!user || !user.bot || !user.applications) {
@ -1089,39 +1088,29 @@ class Message extends Base {
throw new Error('Command name is required'); throw new Error('Command name is required');
} }
// https://discord.com/api/v9/channels/817671035813888030/application-commands/search?type=3&application_id=817229550684471297 // https://discord.com/api/v9/channels/817671035813888030/application-commands/search?type=3&application_id=817229550684471297
let contextCMD = user.applications.cache.find(c => c.name == commandName && c.type === 'MESSAGE'); let contextCMD;
if (!contextCMD && !search) { const data = await this.client.api.channels[this.channelId]['application-commands'].search.get({
query: {
type: 3, // MESSAGE,
// include_applications: false,
// query: commandName,
limit: 25,
// Shet
application_id: botId,
},
});
for (const command of data.application_commands) {
user.applications._add(command, true);
}
contextCMD = user.applications.cache.find(c => c.name == commandName && c.type === 'MESSAGE');
if (!contextCMD) {
throw new Error( throw new Error(
'INTERACTION_SEND_FAILURE', 'INTERACTION_SEND_FAILURE',
`Command ${commandName} is not found (without search)\nList command avalible: ${user.applications.cache `Command ${commandName} is not found (with search)\nList command avalible: ${user.applications.cache
.filter(a => a.type == 'MESSAGE') .filter(a => a.type == 'MESSAGE')
.map(a => a.name) .map(a => a.name)
.join(', ')}`, .join(', ')}`,
); );
} else {
const data = await this.client.api.channels[this.channelId]['application-commands'].search.get({
query: {
type: 3, // MESSAGE,
// include_applications: false,
// query: commandName,
limit: 25,
// Shet
application_id: botId,
},
});
for (const command of data.application_commands) {
user.applications._add(command, true);
}
contextCMD = user.applications.cache.find(c => c.name == commandName && c.type === 'MESSAGE');
if (!contextCMD) {
throw new Error(
'INTERACTION_SEND_FAILURE',
`Command ${commandName} is not found (with search)\nList command avalible: ${user.applications.cache
.filter(a => a.type == 'MESSAGE')
.map(a => a.name)
.join(', ')}`,
);
}
} }
return contextCMD.sendContextMenu(this, true); return contextCMD.sendContextMenu(this, true);
} }

View File

@ -393,11 +393,10 @@ class TextBasedChannel {
* Send Slash to this channel * Send Slash to this channel
* @param {Snowflake} botId Bot Id (Supports application ID - not bot) * @param {Snowflake} botId Bot Id (Supports application ID - not bot)
* @param {string} commandName Command name * @param {string} commandName Command name
* @param {boolean} [search=true] Whether to search for the command
* @param {...?string} args Command arguments * @param {...?string} args Command arguments
* @returns {Promise<pending>} * @returns {Promise<pending>}
*/ */
async sendSlash(botId, commandName, search = true, ...args) { async sendSlash(botId, commandName, ...args) {
if (!botId) throw new Error('Bot ID is required'); if (!botId) throw new Error('Bot ID is required');
// ? maybe ... // ? maybe ...
const user = await this.client.users.fetch(botId).catch(() => {}); const user = await this.client.users.fetch(botId).catch(() => {});
@ -405,42 +404,33 @@ class TextBasedChannel {
throw new Error('botId is not a bot or does not have an application slash command'); throw new Error('botId is not a bot or does not have an application slash command');
} }
if (!commandName || typeof commandName !== 'string') throw new Error('Command name is required'); if (!commandName || typeof commandName !== 'string') throw new Error('Command name is required');
let commandTarget = user.applications.cache.find(c => c.name === commandName && c.type === 'CHAT_INPUT'); // Using API to search (without opcode ~ehehe)
if (!commandTarget && !search) { let commandTarget;
// https://discord.com/api/v9/channels/id/application-commands/search?type=1&query=aiko&limit=7&include_applications=false&application_id=id
const data = await this.client.api.channels[this.id]['application-commands'].search.get({
query: {
type: 1, // CHAT_INPUT,
include_applications: false,
query: commandName,
limit: 25,
// Shet
// application_id: botId,
},
});
for (const command of data.application_commands) {
if (user.id == command.application_id) {
commandTarget = user.applications._add(command, true);
}
}
// Remove
// commandTarget = user.applications.cache.find(c => c.name === commandName && c.type === 'CHAT_INPUT');
if (!commandTarget) {
throw new Error( throw new Error(
'INTERACTION_SEND_FAILURE', 'INTERACTION_SEND_FAILURE',
`SlashCommand ${commandName} is not found (Without search)\nDebug:\n+ botId: ${botId}\n+ args: ${args.join( `SlashCommand ${commandName} is not found (With search)\nDebug:\n+ botId: ${botId}\n+ args: ${args.join(
' | ', ' | ',
)}`, )}`,
); );
} else {
// Using API to search (without opcode ~ehehe)
// https://discord.com/api/v9/channels/id/application-commands/search?type=1&query=aiko&limit=7&include_applications=false&application_id=id
const data = await this.client.api.channels[this.id]['application-commands'].search.get({
query: {
type: 1, // CHAT_INPUT,
include_applications: false,
query: commandName,
limit: 25,
// Shet
// application_id: botId,
},
});
for (const command of data.application_commands) {
if (user.id == command.application_id) {
commandTarget = user.applications._add(command, true);
}
}
// Remove
// commandTarget = user.applications.cache.find(c => c.name === commandName && c.type === 'CHAT_INPUT');
if (!commandTarget) {
throw new Error(
'INTERACTION_SEND_FAILURE',
`SlashCommand ${commandName} is not found (With search)\nDebug:\n+ botId: ${botId}\n+ args: ${args.join(
' | ',
)}`,
);
}
} }
return commandTarget.sendSlashCommand( return commandTarget.sendSlashCommand(
new Message(this.client, { new Message(this.client, {

4
typings/index.d.ts vendored
View File

@ -1672,7 +1672,7 @@ export class Message<Cached extends boolean = boolean> extends Base {
public clickButton(buttonID: string): Promise<void>; public clickButton(buttonID: string): Promise<void>;
public selectMenu(menuID: string, options: string[]): Promise<void>; public selectMenu(menuID: string, options: string[]): Promise<void>;
public selectMenu(options: string[]): Promise<void>; public selectMenu(options: string[]): Promise<void>;
public contextMenu(botID: Snowflake, commandName: string, search?: boolean): Promise<void>; public contextMenu(botID: Snowflake, commandName: string): Promise<void>;
} }
export class MessageActionRow< export class MessageActionRow<
@ -3719,7 +3719,7 @@ export interface TextBasedChannelFields extends PartialTextBasedChannelFields {
setNSFW(nsfw?: boolean, reason?: string): Promise<this>; setNSFW(nsfw?: boolean, reason?: string): Promise<this>;
fetchWebhooks(): Promise<Collection<Snowflake, Webhook>>; fetchWebhooks(): Promise<Collection<Snowflake, Webhook>>;
sendTyping(): Promise<void>; sendTyping(): Promise<void>;
sendSlash(botId: Snowflake, commandName: string, search?: boolean, ...args: any): Promise<undefined>; sendSlash(botId: Snowflake, commandName: string, ...args: any): Promise<undefined>;
} }
export function PartialWebhookMixin<T>(Base?: Constructable<T>): Constructable<T & PartialWebhookFields>; export function PartialWebhookMixin<T>(Base?: Constructable<T>): Constructable<T & PartialWebhookFields>;