Skip to content

Commit 8997aa6

Browse files
(feat): attachment support
Co-Authored-By: Space_Fox <[email protected]>
1 parent d64dfca commit 8997aa6

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

src/main/discord/listeners/commandListener.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Interaction, Message, CommandInteraction, GuildMember, InteractionResponse, BooleanCache, EmbedBuilder, ChannelType, DiscordAPIError } from 'discord.js';
1+
import { Interaction, Message, CommandInteraction, GuildMember, InteractionResponse, BooleanCache, EmbedBuilder, ChannelType, DiscordAPIError, AttachmentBuilder } from 'discord.js';
22
import { AsyncCommandStructure, CommandStructure } from '../structures';
33
import { IDiscordCommandContext } from '../../interfaces';
44
import { DiscordClient } from '../Client';
@@ -31,7 +31,7 @@ export class CommandListener {
3131
member: message.member,
3232
author: message.author,
3333
messageReplyContent: null,
34-
reply: async (...content: [string | EmbedBuilder]): Promise<Message<boolean>> => {
34+
reply: async (...content: (string | EmbedBuilder | AttachmentBuilder)[]): Promise<Message<boolean>> => {
3535
return new Promise(async (resolve, reject) => {
3636
message.reply(this.replyParser(...content)).then((result) => {
3737
context.messageReplyContent = result;
@@ -50,13 +50,13 @@ export class CommandListener {
5050
});
5151
});
5252
},
53-
editReply: async (...content: [string | EmbedBuilder]): Promise<Message> => {
53+
editReply: async (...content: (string | EmbedBuilder | AttachmentBuilder)[]): Promise<Message> => {
5454
if (context.messageReplyContent && (context.messageReplyContent as Message<boolean>).editable) {
5555
return (context.messageReplyContent as Message<boolean>).edit(this.replyParser(...content));
5656
}
5757
return (context.reply(...content) as Promise<Message<boolean>>);
5858
},
59-
discreteReply: async (...content: [string | EmbedBuilder]): Promise<Message<boolean>> => {
59+
discreteReply: async (...content: (string | EmbedBuilder | AttachmentBuilder)[]): Promise<Message<boolean>> => {
6060
return new Promise(async (resolve, reject) => {
6161
const parsedContent = this.replyParser(...content);
6262
message.reply({
@@ -68,6 +68,8 @@ export class CommandListener {
6868
context.messageReplyContent = result;
6969
return resolve(result);
7070
}).catch((error: DiscordAPIError) => {
71+
// 10008: Unknown Message
72+
// 50035: Cannot send messages to this user
7173
if (error.code === 10008 || error.code === 50035) {
7274
message.channel.send(this.replyParser(...content)).then((result) => {
7375
context.messageReplyContent = result;
@@ -109,13 +111,13 @@ export class CommandListener {
109111
member: ctx.member as GuildMember,
110112
author: ctx.user,
111113
args: ctx.options.data.map((arg) => arg.value),
112-
reply: async (...content: [string | EmbedBuilder]): Promise<InteractionResponse<boolean>> => {
114+
reply: async (...content: (string | EmbedBuilder | AttachmentBuilder)[]): Promise<InteractionResponse<boolean>> => {
113115
return await ctx.reply(this.replyParser(...content));
114116
},
115-
editReply: async (...content: [string | EmbedBuilder]): Promise<Message<BooleanCache<any>>> => {
117+
editReply: async (...content: (string | EmbedBuilder | AttachmentBuilder)[]): Promise<Message<BooleanCache<any>>> => {
116118
return await ctx.editReply(this.replyParser(...content));
117119
},
118-
discreteReply: async (...content: [string | EmbedBuilder]): Promise<InteractionResponse<boolean>> => {
120+
discreteReply: async (...content: (string | EmbedBuilder | AttachmentBuilder)[]): Promise<InteractionResponse<boolean>> => {
119121
return await ctx.reply({ ...this.replyParser(...content), ephemeral: true });
120122
},
121123
deleteReply: async (): Promise<void> => {
@@ -136,17 +138,22 @@ export class CommandListener {
136138
}
137139
}
138140

139-
private replyParser(...params: [string | EmbedBuilder]): { content?: string, embeds?: EmbedBuilder[] } {
140-
const result: { content?: string, embeds?: EmbedBuilder[] } = {
141+
private replyParser(...params: (string | EmbedBuilder | AttachmentBuilder)[]): { content?: string, embeds?: EmbedBuilder[], files?: AttachmentBuilder[] } {
142+
const result: { content?: string, embeds?: EmbedBuilder[], files?: AttachmentBuilder[] } = {
141143
content: '',
142144
embeds: [],
145+
files: [],
143146
};
144147

145148
params.forEach((item) => {
146149
if (typeof item === 'string') {
147-
result.content = item;
148-
} else {
150+
result.content += item;
151+
} else if (item instanceof EmbedBuilder) {
149152
result.embeds!.push(item);
153+
} else if (item instanceof AttachmentBuilder) {
154+
result.files!.push(item);
155+
} else {
156+
throw new Error('Invalid parameter type!');
150157
}
151158
});
152159

src/main/interfaces/IDiscordCommandContext.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
AttachmentBuilder,
23
BooleanCache,
34
CommandInteraction,
45
DMChannel,
@@ -20,9 +21,9 @@ import { DiscordClient } from '../discord';
2021

2122
export interface IDiscordCommandContext {
2223
client: DiscordClient;
23-
reply: (...content: [string | EmbedBuilder]) => Promise<Message<boolean>> | Promise<InteractionResponse<boolean>>;
24-
editReply: (...content: [string | EmbedBuilder]) => Promise<Message<boolean>> | Promise<Message<BooleanCache<any>>>;
25-
discreteReply: (...content: [string | EmbedBuilder]) => Promise<Message<boolean>> | Promise<InteractionResponse<boolean>>;
24+
reply: (...content: (string | EmbedBuilder | AttachmentBuilder)[]) => Promise<Message<boolean>> | Promise<InteractionResponse<boolean>>;
25+
editReply: (...content: (string | EmbedBuilder | AttachmentBuilder)[]) => Promise<Message<boolean>> | Promise<Message<BooleanCache<any>>>;
26+
discreteReply: (...content: (string | EmbedBuilder | AttachmentBuilder)[]) => Promise<Message<boolean>> | Promise<InteractionResponse<boolean>>;
2627
deleteReply: () => Promise<void | Message<boolean>>;
2728
messageReplyContent?: any,
2829
args: (string | number | boolean | User | undefined)[];

0 commit comments

Comments
 (0)