feat: add support for nsfw commands (#7976)

* chore: update

* fix: add edit changes

* chore: make requested changes

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
Suneet Tipirneni
2022-12-15 21:04:56 -05:00
committed by GitHub
parent 6540914b4a
commit 7a5134459c
5 changed files with 33 additions and 0 deletions

View File

@@ -94,3 +94,7 @@ const memberPermissionPredicate = s.union(
export function validateDefaultMemberPermissions(permissions: unknown) { export function validateDefaultMemberPermissions(permissions: unknown) {
return memberPermissionPredicate.parse(permissions); return memberPermissionPredicate.parse(permissions);
} }
export function validateNSFW(value: unknown): asserts value is boolean {
booleanPredicate.parse(value);
}

View File

@@ -13,6 +13,7 @@ import {
validateDMPermission, validateDMPermission,
validateMaxOptionsLength, validateMaxOptionsLength,
validateRequiredParameters, validateRequiredParameters,
validateNSFW,
} from './Assertions.js'; } from './Assertions.js';
import { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js'; import { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';
import { SharedNameAndDescription } from './mixins/NameAndDescription.js'; import { SharedNameAndDescription } from './mixins/NameAndDescription.js';
@@ -64,6 +65,11 @@ export class SlashCommandBuilder {
*/ */
public readonly dm_permission: boolean | undefined = undefined; public readonly dm_permission: boolean | undefined = undefined;
/**
* Whether this command is NSFW
*/
public readonly nsfw: boolean | undefined = undefined;
/** /**
* Returns the final data that should be sent to Discord. * Returns the final data that should be sent to Discord.
* *
@@ -134,6 +140,18 @@ export class SlashCommandBuilder {
return this; return this;
} }
/**
* Sets whether this command is NSFW
*
* @param nsfw - Whether this command is NSFW
*/
public setNSFW(nsfw = true) {
// Assert the value matches the conditions
validateNSFW(nsfw);
Reflect.set(this, 'nsfw', nsfw);
return this;
}
/** /**
* Adds a new subcommand group to this command * Adds a new subcommand group to this command
* *

View File

@@ -252,6 +252,7 @@ class ApplicationCommandManager extends CachedManager {
name: command.name, name: command.name,
name_localizations: command.nameLocalizations ?? command.name_localizations, name_localizations: command.nameLocalizations ?? command.name_localizations,
description: command.description, description: command.description,
nsfw: command.nsfw,
description_localizations: command.descriptionLocalizations ?? command.description_localizations, description_localizations: command.descriptionLocalizations ?? command.description_localizations,
type: command.type, type: command.type,
options: command.options?.map(o => ApplicationCommand.transformOption(o)), options: command.options?.map(o => ApplicationCommand.transformOption(o)),

View File

@@ -52,6 +52,12 @@ class ApplicationCommand extends Base {
*/ */
this.type = data.type; this.type = data.type;
/**
* Whether this command is age-restricted (18+)
* @type {boolean}
*/
this.nsfw = data.nsfw ?? false;
this._patch(data); this._patch(data);
} }
@@ -188,6 +194,7 @@ class ApplicationCommand extends Base {
* {@link ApplicationCommandType.ChatInput} * {@link ApplicationCommandType.ChatInput}
* @property {Object<Locale, string>} [nameLocalizations] The localizations for the command name * @property {Object<Locale, string>} [nameLocalizations] The localizations for the command name
* @property {string} description The description of the command, if type is {@link ApplicationCommandType.ChatInput} * @property {string} description The description of the command, if type is {@link ApplicationCommandType.ChatInput}
* @property {boolean} [nsfw] Whether the command is age-restricted
* @property {Object<Locale, string>} [descriptionLocalizations] The localizations for the command description, * @property {Object<Locale, string>} [descriptionLocalizations] The localizations for the command description,
* if type is {@link ApplicationCommandType.ChatInput} * if type is {@link ApplicationCommandType.ChatInput}
* @property {ApplicationCommandType} [type=ApplicationCommandType.ChatInput] The type of the command * @property {ApplicationCommandType} [type=ApplicationCommandType.ChatInput] The type of the command
@@ -377,6 +384,7 @@ class ApplicationCommand extends Base {
('description' in command && command.description !== this.description) || ('description' in command && command.description !== this.description) ||
('version' in command && command.version !== this.version) || ('version' in command && command.version !== this.version) ||
(command.type && command.type !== this.type) || (command.type && command.type !== this.type) ||
('nsfw' in command && command.nsfw !== this.nsfw) ||
// Future proof for options being nullable // Future proof for options being nullable
// TODO: remove ?? 0 on each when nullable // TODO: remove ?? 0 on each when nullable
(command.options?.length ?? 0) !== (this.options?.length ?? 0) || (command.options?.length ?? 0) !== (this.options?.length ?? 0) ||

View File

@@ -419,6 +419,7 @@ export class ApplicationCommand<PermissionsFetchType = {}> extends Base {
>; >;
public type: ApplicationCommandType; public type: ApplicationCommandType;
public version: Snowflake; public version: Snowflake;
public nsfw: boolean;
public delete(): Promise<ApplicationCommand<PermissionsFetchType>>; public delete(): Promise<ApplicationCommand<PermissionsFetchType>>;
public edit(data: Partial<ApplicationCommandData>): Promise<ApplicationCommand<PermissionsFetchType>>; public edit(data: Partial<ApplicationCommandData>): Promise<ApplicationCommand<PermissionsFetchType>>;
public setName(name: string): Promise<ApplicationCommand<PermissionsFetchType>>; public setName(name: string): Promise<ApplicationCommand<PermissionsFetchType>>;
@@ -4169,6 +4170,7 @@ export interface BaseApplicationCommandData {
nameLocalizations?: LocalizationMap; nameLocalizations?: LocalizationMap;
dmPermission?: boolean; dmPermission?: boolean;
defaultMemberPermissions?: PermissionResolvable | null; defaultMemberPermissions?: PermissionResolvable | null;
nsfw?: boolean;
} }
export interface AttachmentData { export interface AttachmentData {