mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-15 11:03:30 +01:00
feat(builders): add new command permissions v2 (#7861)
This commit is contained in:
@@ -30,3 +30,19 @@ export function validateRequiredParameters(name: string, type: number) {
|
|||||||
// Assert type is valid
|
// Assert type is valid
|
||||||
validateType(type);
|
validateType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dmPermissionPredicate = s.boolean.nullish;
|
||||||
|
|
||||||
|
export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {
|
||||||
|
dmPermissionPredicate.parse(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const memberPermissionPredicate = s.union(
|
||||||
|
s.bigint.transform((value) => value.toString()),
|
||||||
|
s.number.safeInt.transform((value) => value.toString()),
|
||||||
|
s.string.regex(/^\d+$/),
|
||||||
|
).nullish;
|
||||||
|
|
||||||
|
export function validateDefaultMemberPermissions(permissions: unknown) {
|
||||||
|
return memberPermissionPredicate.parse(permissions);
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,9 +2,17 @@ import type {
|
|||||||
ApplicationCommandType,
|
ApplicationCommandType,
|
||||||
LocaleString,
|
LocaleString,
|
||||||
LocalizationMap,
|
LocalizationMap,
|
||||||
|
Permissions,
|
||||||
RESTPostAPIApplicationCommandsJSONBody,
|
RESTPostAPIApplicationCommandsJSONBody,
|
||||||
} from 'discord-api-types/v10';
|
} from 'discord-api-types/v10';
|
||||||
import { validateRequiredParameters, validateName, validateType, validateDefaultPermission } from './Assertions';
|
import {
|
||||||
|
validateRequiredParameters,
|
||||||
|
validateName,
|
||||||
|
validateType,
|
||||||
|
validateDefaultPermission,
|
||||||
|
validateDefaultMemberPermissions,
|
||||||
|
validateDMPermission,
|
||||||
|
} from './Assertions';
|
||||||
import { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions';
|
import { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions';
|
||||||
|
|
||||||
export class ContextMenuCommandBuilder {
|
export class ContextMenuCommandBuilder {
|
||||||
@@ -26,9 +34,21 @@ export class ContextMenuCommandBuilder {
|
|||||||
/**
|
/**
|
||||||
* Whether the command is enabled by default when the app is added to a guild
|
* Whether the command is enabled by default when the app is added to a guild
|
||||||
*
|
*
|
||||||
* @default true
|
* @deprecated This property is deprecated and will be removed in the future.
|
||||||
|
* You should use `setDefaultMemberPermissions` or `setDMPermission` instead.
|
||||||
*/
|
*/
|
||||||
public readonly defaultPermission: boolean | undefined = undefined;
|
public readonly default_permission: boolean | undefined = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set of permissions represented as a bit set for the command
|
||||||
|
*/
|
||||||
|
public readonly default_member_permissions: Permissions | null | undefined = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
|
||||||
|
* By default, commands are visible.
|
||||||
|
*/
|
||||||
|
public readonly dm_permission: boolean | null | undefined = undefined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the name
|
* Sets the name
|
||||||
@@ -66,12 +86,48 @@ export class ContextMenuCommandBuilder {
|
|||||||
* @param value Whether or not to enable this command by default
|
* @param value Whether or not to enable this command by default
|
||||||
*
|
*
|
||||||
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
||||||
|
* @deprecated Use `setDefaultMemberPermissions` or `setDMPermission` instead.
|
||||||
*/
|
*/
|
||||||
public setDefaultPermission(value: boolean) {
|
public setDefaultPermission(value: boolean) {
|
||||||
// Assert the value matches the conditions
|
// Assert the value matches the conditions
|
||||||
validateDefaultPermission(value);
|
validateDefaultPermission(value);
|
||||||
|
|
||||||
Reflect.set(this, 'defaultPermission', value);
|
Reflect.set(this, 'default_permission', value);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the default permissions a member should have in order to run the command.
|
||||||
|
*
|
||||||
|
* **Note:** You can set this to `'0'` to disable the command by default.
|
||||||
|
*
|
||||||
|
* @param permissions The permissions bit field to set
|
||||||
|
*
|
||||||
|
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
||||||
|
*/
|
||||||
|
public setDefaultMemberPermissions(permissions: Permissions | null | undefined) {
|
||||||
|
// Assert the value and parse it
|
||||||
|
const permissionValue = validateDefaultMemberPermissions(permissions);
|
||||||
|
|
||||||
|
Reflect.set(this, 'default_member_permissions', permissionValue);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets if the command is available in DMs with the application, only for globally-scoped commands.
|
||||||
|
* By default, commands are visible.
|
||||||
|
*
|
||||||
|
* @param enabled If the command should be enabled in DMs
|
||||||
|
*
|
||||||
|
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
||||||
|
*/
|
||||||
|
public setDMPermission(enabled: boolean | null | undefined) {
|
||||||
|
// Assert the value matches the conditions
|
||||||
|
validateDMPermission(enabled);
|
||||||
|
|
||||||
|
Reflect.set(this, 'dm_permission', enabled);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -129,12 +185,7 @@ export class ContextMenuCommandBuilder {
|
|||||||
|
|
||||||
validateLocalizationMap(this.name_localizations);
|
validateLocalizationMap(this.name_localizations);
|
||||||
|
|
||||||
return {
|
return { ...this };
|
||||||
name: this.name,
|
|
||||||
name_localizations: this.name_localizations,
|
|
||||||
type: this.type,
|
|
||||||
default_permission: this.defaultPermission,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,3 +95,19 @@ export const localizationMapPredicate = s.object<LocalizationMap>(
|
|||||||
export function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {
|
export function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {
|
||||||
localizationMapPredicate.parse(value);
|
localizationMapPredicate.parse(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dmPermissionPredicate = s.boolean.nullish;
|
||||||
|
|
||||||
|
export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {
|
||||||
|
dmPermissionPredicate.parse(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const memberPermissionPredicate = s.union(
|
||||||
|
s.bigint.transform((value) => value.toString()),
|
||||||
|
s.number.safeInt.transform((value) => value.toString()),
|
||||||
|
s.string.regex(/^\d+$/),
|
||||||
|
).nullish;
|
||||||
|
|
||||||
|
export function validateDefaultMemberPermissions(permissions: unknown) {
|
||||||
|
return memberPermissionPredicate.parse(permissions);
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,8 +6,10 @@ import type {
|
|||||||
import { mix } from 'ts-mixer';
|
import { mix } from 'ts-mixer';
|
||||||
import {
|
import {
|
||||||
assertReturnOfBuilder,
|
assertReturnOfBuilder,
|
||||||
|
validateDefaultMemberPermissions,
|
||||||
validateDefaultPermission,
|
validateDefaultPermission,
|
||||||
validateLocalizationMap,
|
validateLocalizationMap,
|
||||||
|
validateDMPermission,
|
||||||
validateMaxOptionsLength,
|
validateMaxOptionsLength,
|
||||||
validateRequiredParameters,
|
validateRequiredParameters,
|
||||||
} from './Assertions';
|
} from './Assertions';
|
||||||
@@ -45,9 +47,21 @@ export class SlashCommandBuilder {
|
|||||||
/**
|
/**
|
||||||
* Whether the command is enabled by default when the app is added to a guild
|
* Whether the command is enabled by default when the app is added to a guild
|
||||||
*
|
*
|
||||||
* @default true
|
* @deprecated This property is deprecated and will be removed in the future.
|
||||||
|
* You should use `setDefaultMemberPermissions` or `setDMPermission` instead.
|
||||||
*/
|
*/
|
||||||
public readonly defaultPermission: boolean | undefined = undefined;
|
public readonly default_permission: boolean | undefined = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set of permissions represented as a bit set for the command
|
||||||
|
*/
|
||||||
|
public readonly default_member_permissions: Permissions | null | undefined = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
|
||||||
|
* By default, commands are visible.
|
||||||
|
*/
|
||||||
|
public readonly dm_permission: boolean | null | undefined = undefined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the final data that should be sent to Discord.
|
* Returns the final data that should be sent to Discord.
|
||||||
@@ -61,12 +75,8 @@ export class SlashCommandBuilder {
|
|||||||
validateLocalizationMap(this.description_localizations);
|
validateLocalizationMap(this.description_localizations);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: this.name,
|
...this,
|
||||||
name_localizations: this.name_localizations,
|
|
||||||
description: this.description,
|
|
||||||
description_localizations: this.description_localizations,
|
|
||||||
options: this.options.map((option) => option.toJSON()),
|
options: this.options.map((option) => option.toJSON()),
|
||||||
default_permission: this.defaultPermission,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,12 +88,48 @@ export class SlashCommandBuilder {
|
|||||||
* @param value Whether or not to enable this command by default
|
* @param value Whether or not to enable this command by default
|
||||||
*
|
*
|
||||||
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
||||||
|
* @deprecated Use `setDefaultMemberPermissions` or `setDMPermission` instead.
|
||||||
*/
|
*/
|
||||||
public setDefaultPermission(value: boolean) {
|
public setDefaultPermission(value: boolean) {
|
||||||
// Assert the value matches the conditions
|
// Assert the value matches the conditions
|
||||||
validateDefaultPermission(value);
|
validateDefaultPermission(value);
|
||||||
|
|
||||||
Reflect.set(this, 'defaultPermission', value);
|
Reflect.set(this, 'default_permission', value);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the default permissions a member should have in order to run the command.
|
||||||
|
*
|
||||||
|
* **Note:** You can set this to `'0'` to disable the command by default.
|
||||||
|
*
|
||||||
|
* @param permissions The permissions bit field to set
|
||||||
|
*
|
||||||
|
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
||||||
|
*/
|
||||||
|
public setDefaultMemberPermissions(permissions: Permissions | null | undefined) {
|
||||||
|
// Assert the value and parse it
|
||||||
|
const permissionValue = validateDefaultMemberPermissions(permissions);
|
||||||
|
|
||||||
|
Reflect.set(this, 'default_member_permissions', permissionValue);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets if the command is available in DMs with the application, only for globally-scoped commands.
|
||||||
|
* By default, commands are visible.
|
||||||
|
*
|
||||||
|
* @param enabled If the command should be enabled in DMs
|
||||||
|
*
|
||||||
|
* @see https://discord.com/developers/docs/interactions/application-commands#permissions
|
||||||
|
*/
|
||||||
|
public setDMPermission(enabled: boolean | null | undefined) {
|
||||||
|
// Assert the value matches the conditions
|
||||||
|
validateDMPermission(enabled);
|
||||||
|
|
||||||
|
Reflect.set(this, 'dm_permission', enabled);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user