Skip to content

Commit

Permalink
feat: add support for djs v14 (#58)
Browse files Browse the repository at this point in the history
BREAKING CHANGE: djs v14 is required.
  • Loading branch information
imranbarbhuiya committed Jul 18, 2022
1 parent bbd2ec2 commit 4f4ee26
Show file tree
Hide file tree
Showing 7 changed files with 350 additions and 352 deletions.
4 changes: 2 additions & 2 deletions packages/tagscript-plugin-discord/package.json
Expand Up @@ -36,13 +36,13 @@
],
"devDependencies": {
"@favware/cliff-jumper": "^1.8.5",
"discord.js": "^13.8.1",
"discord.js": "^14.0.1",
"tagscript": "workspace:^",
"tsup": "^6.1.3",
"typescript": "^4.7.4"
},
"peerDependencies": {
"discord.js": "^13.5.0",
"discord.js": "^14.0.0",
"tagscript": "*"
},
"engines": {
Expand Down
10 changes: 6 additions & 4 deletions packages/tagscript-plugin-discord/src/lib/Parsers/Embed.ts
@@ -1,6 +1,6 @@
import { BaseParser, split, type Context, type IParser } from 'tagscript';

import type { Awaitable, MessageEmbedOptions } from 'discord.js';
import type { Awaitable, EmbedData, APIEmbed } from 'discord.js';

/**
* An embed tag will send an embed in the tag response.
Expand Down Expand Up @@ -36,6 +36,7 @@ import type { Awaitable, MessageEmbedOptions } from 'discord.js';
* {embed(description):Follow these rules to ensure a good experience in our server!}
* {embed(field):Rule 1|Respect everyone you speak to.|false}
* ```
* @note The return type depends on user's input. So it might not be `EmbedData | APIEmbed`. So use a typeguard to check.
*/
export class EmbedParser extends BaseParser implements IParser {
public constructor() {
Expand Down Expand Up @@ -68,16 +69,17 @@ export class EmbedParser extends BaseParser implements IParser {
* @param payload
* @returns
*/
protected parseEmbedJSON(payload: string): Awaitable<MessageEmbedOptions> {
protected parseEmbedJSON(payload: string): Awaitable<EmbedData | APIEmbed> {
return JSON.parse(payload);
}

private returnEmbed(ctx: Context, data: MessageEmbedOptions): string {
ctx.response.actions.embed ??= {};
private returnEmbed(ctx: Context, data: EmbedData | APIEmbed): string {
ctx.response.actions.embed ??= {} as EmbedData;
const { fields, ...rest } = data;
if (fields) {
ctx.response.actions.embed.fields = [...(ctx.response.actions.embed.fields ?? []), ...fields];
}
// @ts-expect-error - The return type should be unknown
ctx.response.actions.embed = { ...ctx.response.actions.embed, ...rest };
return '';
}
Expand Down
@@ -1,31 +1,39 @@
import { Channel, CommandInteractionOption, CommandInteractionOptionResolver, GuildMember, Role, User } from 'discord.js';
import {
ApplicationCommandOptionType,
BaseChannel,
CommandInteractionOption,
CommandInteractionOptionResolver,
GuildMember,
Role,
User
} from 'discord.js';
import { IntegerTransformer, ITransformer, StringTransformer } from 'tagscript';
import { ChannelTransformer, MemberTransformer, RoleTransformer, UserTransformer } from '../Transformer';

export const mapOptions = (options: readonly CommandInteractionOption[], transformers: Record<string, ITransformer>, prefix = '') => {
options.forEach((data) => {
switch (data.type) {
case 'SUB_COMMAND_GROUP':
case ApplicationCommandOptionType.SubcommandGroup:
transformers.subCommandGroup = new StringTransformer(data.value as string);
mapOptions(data.options!, transformers, `${data.name}-`);
break;
case 'SUB_COMMAND':
case ApplicationCommandOptionType.Subcommand:
transformers.subCommand = new StringTransformer(data.value as string);
mapOptions(data.options!, transformers, `${prefix}${data.name}-`);
break;
case 'STRING':
case ApplicationCommandOptionType.String:
transformers[prefix + data.name] = new StringTransformer(data.value as string);
break;
case 'BOOLEAN':
case ApplicationCommandOptionType.Boolean:
transformers[prefix + data.name] = new StringTransformer(data.value as string);
break;
case 'INTEGER':
case ApplicationCommandOptionType.Integer:
transformers[prefix + data.name] = new IntegerTransformer(data.value as `${number}`);
break;
case 'NUMBER':
case ApplicationCommandOptionType.Number:
transformers[prefix + data.name] = new IntegerTransformer(data.value as `${number}`);
break;
case 'MENTIONABLE':
case ApplicationCommandOptionType.Mentionable:
transformers[prefix + data.name] =
data.member instanceof GuildMember
? new MemberTransformer(data.member)
Expand All @@ -36,7 +44,7 @@ export const mapOptions = (options: readonly CommandInteractionOption[], transfo
: // added only for test. Will be removed after rewriting these tests
new StringTransformer(data.value as string);
break;
case 'USER':
case ApplicationCommandOptionType.User:
transformers[prefix + data.name] =
data.member instanceof GuildMember
? new MemberTransformer(data.member)
Expand All @@ -45,13 +53,13 @@ export const mapOptions = (options: readonly CommandInteractionOption[], transfo
: // added only for test. Will be removed after rewriting these tests
new StringTransformer(data.value as string);
break;
case 'ROLE':
case ApplicationCommandOptionType.Role:
data.role instanceof Role && (transformers[prefix + data.name] = new RoleTransformer(data.role));
break;
case 'CHANNEL':
data.channel instanceof Channel && (transformers[prefix + data.name] = new ChannelTransformer(data.channel));
case ApplicationCommandOptionType.Channel:
data.channel instanceof BaseChannel && (transformers[prefix + data.name] = new ChannelTransformer(data.channel));
break;
case 'ATTACHMENT':
case ApplicationCommandOptionType.Attachment:
transformers[prefix + data.name] = new StringTransformer(data.attachment!.url);
}
});
Expand Down
6 changes: 3 additions & 3 deletions packages/tagscript-plugin-discord/src/lib/interfaces/index.ts
@@ -1,4 +1,4 @@
import { AnyChannel, Guild, MessageEmbedOptions } from 'discord.js';
import { EmbedData, APIEmbed, Channel, Guild } from 'discord.js';
import 'tagscript';

declare module 'tagscript' {
Expand All @@ -7,11 +7,11 @@ declare module 'tagscript' {
cooldown: number;
message: string | null;
};
embed?: MessageEmbedOptions;
embed?: EmbedData | APIEmbed;
deleteMessage?: boolean;
silentResponse?: boolean;
files?: string[];
}
}

export type GuildChannel = Extract<AnyChannel, { guild: Guild }>;
export type GuildChannel = Extract<Channel, { guild: Guild }>;
@@ -1,4 +1,4 @@
import { Client, CommandInteraction, Guild, GuildMember, Role, TextChannel, User } from 'discord.js';
import { ChatInputCommandInteraction, Client, Guild, GuildMember, Role, TextChannel, User } from 'discord.js';
import {
APIUser,
APIRole,
Expand Down Expand Up @@ -228,6 +228,6 @@ export const member: GuildMember = new GuildMember(client, memberObject, guild);
export const channel: TextChannel = new TextChannel(guild, channelObject, client);

// @ts-expect-error using protected constructor to test
export const interaction: CommandInteraction = new CommandInteraction(client, interactionObject);
export const interaction: ChatInputCommandInteraction = new ChatInputCommandInteraction(client, interactionObject);

/* eslint-enable @typescript-eslint/no-unsafe-assignment */
3 changes: 2 additions & 1 deletion tsconfig.base.json
Expand Up @@ -17,5 +17,6 @@
"declaration": true,
"outDir": "dist"
},
"includes": ["src/**/*.ts"]
"includes": ["packages/**/*.ts"],
"exclude": ["packages/**/dist/**"]
}

0 comments on commit 4f4ee26

Please sign in to comment.