refactor(TextBasedChannel): sendSlash
Using REST API (without opcode 24, fix `command outdate` error)
This commit is contained in:
parent
769cbb21d5
commit
17a1a19f42
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
4
typings/index.d.ts
vendored
@ -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>;
|
||||||
|
Loading…
Reference in New Issue
Block a user