mirror of
https://github.com/discordeno/discordeno.git
synced 2026-06-02 08:50:07 +00:00
* Simplify SfetchMembers (#2339) Co-authored-by: meister03 * Create leaveVoiceChannel.ts (#2342) * Update editFollowupMessage.ts (#2344) * Update editInteractionResponse.ts (#2343) * Update editMessage.ts (#2341) * Update calculateShardId.ts Fix wrong shardId calculations * Add Role Icon to Edit (#2346) Co-authored-by: meister03 * Add mix max length (#2347) Co-authored-by: meister03 * style: deno fmt * Fix Disabled Options (#2368) Co-authored-by: meister03 <meisterpi@gmail.com> * Add app_permissions (#2369) Co-authored-by: meister03 <meisterpi@gmail.com> * thread_id instead of threadId (#2378) Co-authored-by: Veeti K <veeti@veetik.com> * feat: Create `ApplicationCommandFlags` enumerator. (#2384) Co-authored-by: vxern <vxern@wordcollector.co.uk> * Small Changes in a bulk pr to close the issues (#2370) * Initial Commit * Close #2364 * Add preset whitelist to automod #2356 -> Resolve Issue * Close [api-docs] AutoMod message intent updates (#5083) #2330 * Breaking Channge | [api-docs] Update message type names (#5093) * message.interaction.name changed attitude | [api-docs] Update Change_Log.md #2333 * #2333 also closes #2316 * Clarify 45 chars length | Add those on permission plugins | [api-docs] text input label has max 45 characters (#4689) #2137 * Clarify webhook naming restrictions (#4625) #2094 * 8th August Webhook new View Channel perm | Closes #2363 * 8th August Webhook new View Channel perm | Closes #2363 * Document thread_name for execute webhook (#5007) #2263 * Close Update create and modify channel documentation (#4867) #2237 * unnecesary nullable tag in Modify Guild Member params (#5164) #2355 * deno fmt * deno fmt * Use .includefor disallowed webhook names" * Add Missing Enums & #2367, #2362, #2361, #2371, #2372. #2349, #2358, #2325 back * deno fmt :( Co-authored-by: meister03 <meisterpi@gmail.com> Co-authored-by: LTS20050703 <87189679+lts20050703@users.noreply.github.com> Co-authored-by: Tomato6966 <chris.pre03@gmail.com> Co-authored-by: ITOH <to@itoh.at> Co-authored-by: meister03 <meisterpi@gmail.com> Co-authored-by: Veeti K <veeti@veetik.com> Co-authored-by: vxern <vxern@wordcollector.co.uk> Co-authored-by: LTS20050703 <87189679+lts20050703@users.noreply.github.com>
107 lines
5.2 KiB
TypeScript
107 lines
5.2 KiB
TypeScript
import type { Bot } from "../../../bot.ts";
|
|
import { ApplicationCommandOption, ApplicationCommandTypes, Localization } from "../../../mod.ts";
|
|
import { DiscordApplicationCommand, DiscordApplicationCommandOption } from "../../../types/discord.ts";
|
|
import { AtLeastOne, PermissionStrings } from "../../../types/shared.ts";
|
|
|
|
/**
|
|
* There are two kinds of Application Commands: global commands and guild commands. Global commands are available for every guild that adds your app; guild commands are specific to the guild you specify when making them. Command names are unique per application within each scope (global and guild). That means:
|
|
*
|
|
* - Your app **cannot** have two global commands with the same name
|
|
* - Your app **cannot** have two guild commands within the same name **on the same guild**
|
|
* - Your app **can** have a global and guild command with the same name
|
|
* - Multiple apps **can** have commands with the same names
|
|
*
|
|
* Global commands are cached for **1 hour**. That means that new global commands will fan out slowly across all guilds, and will be guaranteed to be updated in an hour.
|
|
* Guild commands update **instantly**. We recommend you use guild commands for quick testing, and global commands when they're ready for public use.
|
|
*/
|
|
export async function createApplicationCommand(
|
|
bot: Bot,
|
|
options: CreateApplicationCommand | CreateContextApplicationCommand,
|
|
guildId?: bigint,
|
|
) {
|
|
const result = await bot.rest.runMethod<DiscordApplicationCommand>(
|
|
bot.rest,
|
|
"POST",
|
|
guildId
|
|
? bot.constants.routes.COMMANDS_GUILD(bot.applicationId, guildId)
|
|
: bot.constants.routes.COMMANDS(bot.applicationId),
|
|
isContextApplicationCommand(options)
|
|
? { name: options.name, name_localizations: options.nameLocalizations, type: options.type }
|
|
: {
|
|
name: options.name,
|
|
name_localizations: options.nameLocalizations,
|
|
description: options.description,
|
|
description_localizations: options.descriptionLocalizations,
|
|
type: options.type,
|
|
options: options.options ? makeOptionsForCommand(options.options) : undefined,
|
|
default_member_permissions: options.defaultMemberPermissions
|
|
? bot.utils.calculateBits(options.defaultMemberPermissions)
|
|
: undefined,
|
|
dm_permission: options.dmPermission,
|
|
},
|
|
);
|
|
|
|
return bot.transformers.applicationCommand(bot, result);
|
|
}
|
|
|
|
export function makeOptionsForCommand(options: ApplicationCommandOption[]): DiscordApplicationCommandOption[] {
|
|
return options.map((option) => ({
|
|
type: option.type,
|
|
name: option.name,
|
|
name_localizations: option.nameLocalizations,
|
|
description: option.description,
|
|
description_localizations: option.descriptionLocalizations,
|
|
required: option.required,
|
|
choices: option.choices?.map((choice) => ({
|
|
name: choice.name,
|
|
name_localizations: choice.nameLocalizations,
|
|
value: choice.value,
|
|
})),
|
|
options: option.options ? makeOptionsForCommand(option.options) : undefined,
|
|
channel_types: option.channelTypes,
|
|
autocomplete: option.autocomplete,
|
|
min_value: option.minValue,
|
|
max_value: option.maxValue,
|
|
min_length: option.minLength,
|
|
max_length: option.maxLength,
|
|
}));
|
|
}
|
|
|
|
/** https://discord.com/developers/docs/interactions/application-commands#endpoints-json-params */
|
|
export interface CreateApplicationCommand {
|
|
/**
|
|
* Name of command, 1-32 characters.
|
|
* `ApplicationCommandTypes.ChatInput` command names must match the following regex `^[-_\p{L}\p{N}\p{sc=Deva}\p{sc=Thai}]{1,32}$` with the unicode flag set.
|
|
* If there is a lowercase variant of any letters used, you must use those.
|
|
* Characters with no lowercase variants and/or uncased letters are still allowed.
|
|
* ApplicationCommandTypes.User` and `ApplicationCommandTypes.Message` commands may be mixed case and can include spaces.
|
|
*/
|
|
name: string;
|
|
/** Localization object for the `name` field. Values follow the same restrictions as `name` */
|
|
nameLocalizations?: Localization;
|
|
/** 1-100 character description */
|
|
description: string;
|
|
/** Localization object for the `description` field. Values follow the same restrictions as `description` */
|
|
descriptionLocalizations?: Localization;
|
|
/** Type of command, defaults `ApplicationCommandTypes.ChatInput` if not set */
|
|
type?: ApplicationCommandTypes;
|
|
/** Parameters for the command */
|
|
options?: ApplicationCommandOption[];
|
|
/** Set of permissions represented as a bit set */
|
|
defaultMemberPermissions?: PermissionStrings[];
|
|
/** Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible. */
|
|
dmPermission?: boolean;
|
|
}
|
|
|
|
/** https://discord.com/developers/docs/interactions/application-commands#endpoints-json-params */
|
|
export interface CreateContextApplicationCommand extends Omit<CreateApplicationCommand, "options"> {
|
|
/** The type of the command */
|
|
type: ApplicationCommandTypes.Message | ApplicationCommandTypes.User;
|
|
}
|
|
|
|
export function isContextApplicationCommand(
|
|
cmd: AtLeastOne<CreateContextApplicationCommand> | AtLeastOne<CreateApplicationCommand>,
|
|
): cmd is AtLeastOne<CreateContextApplicationCommand> {
|
|
return cmd.type === ApplicationCommandTypes.Message || cmd.type === ApplicationCommandTypes.User;
|
|
}
|