Skip to content

Commit

Permalink
feat: support last 14 version djs
Browse files Browse the repository at this point in the history
  • Loading branch information
SocketSomeone committed Jun 11, 2022
1 parent 82403a4 commit 7a58e06
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 56 deletions.
21 changes: 2 additions & 19 deletions src/commands/command.discovery.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,8 @@
import { PermissionResolvable, Snowflake } from 'discord.js';
import { BaseApplicationCommandData, Snowflake } from 'discord.js';
import { NecordBaseDiscovery } from '../context';
import { LocalizationMap } from 'discord-api-types/v10';

// TODO: Use BaseApplicationCommandData
export interface BaseApplicationCommandMeta {
name: string;
name_localizations?: LocalizationMap;
dm_permission?: boolean;
default_member_permissions?: PermissionResolvable;

// The functionality not released yet https://github.com/discord/discord-api-docs/pull/4965
// nsfw?: boolean;

/**
* @deprecated Use `dm_permission` and/or `default_member_permissions` instead
*/
default_permission?: boolean;
}

export abstract class CommandDiscovery<
T extends BaseApplicationCommandMeta = BaseApplicationCommandMeta
T extends BaseApplicationCommandData = BaseApplicationCommandData
> extends NecordBaseDiscovery<T> {
public abstract getGuilds(): Set<Snowflake>;
}
21 changes: 6 additions & 15 deletions src/commands/context-menus/context-menu.discovery.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import {
ApplicationCommandType,
ContextMenuCommandInteraction,
MessageApplicationCommandData,
PermissionsBitField,
Snowflake
Snowflake,
UserApplicationCommandData
} from 'discord.js';
import { GUILDS_METADATA } from '../../necord.constants';
import { RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';
import { BaseApplicationCommandMeta, CommandDiscovery } from '../command.discovery';
import { CommandDiscovery } from '../command.discovery';

export interface ContextMenuMeta extends BaseApplicationCommandMeta {
type: Exclude<ApplicationCommandType, ApplicationCommandType.ChatInput>;
}
export type ContextMenuMeta = MessageApplicationCommandData | UserApplicationCommandData;

export class ContextMenuDiscovery extends CommandDiscovery<ContextMenuMeta> {
public getContextType() {
Expand Down Expand Up @@ -44,14 +43,6 @@ export class ContextMenuDiscovery extends CommandDiscovery<ContextMenuMeta> {
}

public override toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody {
return {
type: this.meta.type,
name: this.meta.name,
name_localizations: this.meta.name_localizations,
dm_permission: this.meta.dm_permission,
default_member_permissions: new PermissionsBitField(
this.meta.default_member_permissions
).bitfield.toString()
};
return this.meta;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { applyDecorators, SetMetadata, Type, UseInterceptors } from '@nestjs/common';
import { ApplicationCommandOptionChoiceData, AutocompleteInteraction } from 'discord.js';
import {
ApplicationCommandOptionChoiceData,
AutocompleteInteraction,
AutocompleteOption
} from 'discord.js';
import { AUTOCOMPLETE_METADATA } from '../../../necord.constants';
import { AutocompleteInterceptor } from './autocomplete.interceptor';

export interface TransformOptions {
transformOptions(
interaction: AutocompleteInteraction,
focused: ApplicationCommandOptionChoiceData
focused: AutocompleteOption
): ApplicationCommandOptionChoiceData[] | Promise<ApplicationCommandOptionChoiceData[]>;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable, of } from 'rxjs';
import { NecordExecutionContext, SlashCommandContext } from '../../../context';
import { AutocompleteContext, NecordExecutionContext, SlashCommandContext } from '../../../context';
import { ModuleRef, Reflector } from '@nestjs/core';
import { AUTOCOMPLETE_METADATA } from '../../../necord.constants';
import { AutocompleteMeta } from './autocomplete.decorator';
import { InteractionType } from 'discord.js';

// TODO: Make Service instead Interceptor
@Injectable()
Expand All @@ -18,10 +19,14 @@ export class AutocompleteInterceptor implements NestInterceptor {
next: CallHandler<any>
): Promise<Observable<any>> {
const necordContext = NecordExecutionContext.create(context);
const [interaction] = necordContext.getContext<SlashCommandContext>();
const [interaction] = necordContext.getContext<AutocompleteContext>();
const discovery = necordContext.getDiscovery();

if (!interaction.isAutocomplete() || !discovery.isSlashCommand()) return next.handle();
if (
interaction.type !== InteractionType.ApplicationCommandAutocomplete ||
!discovery.isSlashCommand()
)
return next.handle();

const autocompletes = this.reflector
.getAllAndOverride<AutocompleteMeta>(AUTOCOMPLETE_METADATA, [discovery.getHandler()])
Expand Down
17 changes: 6 additions & 11 deletions src/commands/slash-commands/slash-command.discovery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,21 @@ import {
ApplicationCommandOptionType,
ApplicationCommandType,
AutocompleteInteraction,
ChatInputApplicationCommandData,
CommandInteraction,
CommandInteractionOptionResolver,
PermissionsBitField,
Snowflake
} from 'discord.js';
import { GUILDS_METADATA, OPTIONS_METADATA } from '../../necord.constants';
import { APIApplicationCommandOptionBase } from 'discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/base';
import { LocalizationMap } from 'discord-api-types/v10';
import { BaseApplicationCommandMeta, CommandDiscovery } from '../command.discovery';
import { CommandDiscovery } from '../command.discovery';

export interface SlashCommandMeta extends BaseApplicationCommandMeta {
type:
// @ts-ignore
export interface SlashCommandMeta extends ChatInputApplicationCommandData {
type?:
| ApplicationCommandType.ChatInput
| ApplicationCommandOptionType.SubcommandGroup
| ApplicationCommandOptionType.Subcommand;
description: string;
description_localizations?: LocalizationMap;
}

export interface OptionMeta extends APIApplicationCommandOptionBase<any> {
Expand Down Expand Up @@ -46,7 +44,7 @@ export class SlashCommandDiscovery extends CommandDiscovery<SlashCommandMeta> {
return this.reflector.get(OPTIONS_METADATA, this.getHandler()) ?? {};
}

public getOptions(): OptionMeta[] {
public getOptions() {
if (this.subcommands.size >= 1) {
return [...this.subcommands.values()].map(subcommand => subcommand.toJSON());
}
Expand All @@ -65,9 +63,6 @@ export class SlashCommandDiscovery extends CommandDiscovery<SlashCommandMeta> {
public override toJSON() {
return {
...this.meta,
default_member_permissions: new PermissionsBitField(
this.meta.default_member_permissions
).bitfield.toString(),
options: this.getOptions()
};
}
Expand Down
8 changes: 6 additions & 2 deletions src/commands/slash-commands/slash-commands.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Injectable, OnApplicationBootstrap, OnModuleInit } from '@nestjs/common';
import { SlashCommandDiscovery } from './slash-command.discovery';
import { Client } from 'discord.js';
import { Client, InteractionType } from 'discord.js';
import { SLASH_COMMAND_METADATA } from '../../necord.constants';
import { NecordExplorerService } from '../../necord-explorer.service';
import { CommandDiscovery } from '../command.discovery';
Expand All @@ -25,7 +25,11 @@ export class SlashCommandsService implements OnModuleInit, OnApplicationBootstra

public onApplicationBootstrap() {
return this.client.on('interactionCreate', i => {
if (!i.isChatInputCommand() && !i.isAutocomplete()) return;
if (
!i.isChatInputCommand() &&
i.type !== InteractionType.ApplicationCommandAutocomplete
)
return;

const name = [
i.commandName,
Expand Down
3 changes: 3 additions & 0 deletions src/context/necord-context.interface.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
AutocompleteInteraction,
ButtonInteraction,
CommandInteraction,
Message,
Expand All @@ -9,6 +10,8 @@ import {
} from 'discord.js';
import { NecordEvents } from '../listeners/listener.interface';

export type AutocompleteContext = [AutocompleteInteraction];

export type SlashCommandContext = [CommandInteraction];

export type TextCommandContext = [Message];
Expand Down
2 changes: 1 addition & 1 deletion src/message-components/message-components.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export class MessageComponentsService implements OnModuleInit, OnApplicationBoot

public onApplicationBootstrap() {
return this.client.on('interactionCreate', interaction => {
if (!interaction.isMessageComponent()) return;
if (!interaction.isButton() && !interaction.isSelectMenu()) return;

return this.componentsMap
.get([interaction.componentType, interaction.customId].join(':'))
Expand Down
3 changes: 2 additions & 1 deletion src/modals/decorators/fields.decorator.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { createParamDecorator } from '@nestjs/common';
import { NecordExecutionContext } from '../../context';
import { InteractionType } from 'discord.js';

export const Fields = createParamDecorator((customId, context) => {
const necordContext = NecordExecutionContext.create(context);
const [interaction] = necordContext.getContext<'interactionCreate'>();

if (!interaction.isModalSubmit()) {
if (interaction.type !== InteractionType.ModalSubmit) {
return null;
}

Expand Down
4 changes: 2 additions & 2 deletions src/modals/modals.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Injectable, OnApplicationBootstrap, OnModuleInit } from '@nestjs/common';
import { Client } from 'discord.js';
import { Client, AnyInteraction, InteractionType } from 'discord.js';
import { NecordExplorerService } from '../necord-explorer.service';
import { MODAL_METADATA } from '../necord.constants';
import { ModalDiscovery } from './modal.discovery';
Expand All @@ -21,7 +21,7 @@ export class ModalsService implements OnModuleInit, OnApplicationBootstrap {

public onApplicationBootstrap() {
return this.client.on('interactionCreate', interaction => {
if (!interaction.isModalSubmit()) return;
if (interaction.type !== InteractionType.ModalSubmit) return;

return this.modals.get(interaction.customId)?.execute(interaction);
});
Expand Down

0 comments on commit 7a58e06

Please sign in to comment.