@mostfeatured/dbi 0.0.81 → 0.0.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/DBI.d.ts +15 -0
  2. package/dist/DBI.d.ts.map +1 -1
  3. package/dist/DBI.js +33 -1
  4. package/dist/DBI.js.map +1 -1
  5. package/dist/Events.d.ts +17 -1
  6. package/dist/Events.d.ts.map +1 -1
  7. package/dist/Events.js.map +1 -1
  8. package/dist/methods/handleMessageCommands.d.ts +6 -0
  9. package/dist/methods/handleMessageCommands.d.ts.map +1 -0
  10. package/dist/methods/handleMessageCommands.js +301 -0
  11. package/dist/methods/handleMessageCommands.js.map +1 -0
  12. package/dist/methods/hookInteractionListeners.d.ts.map +1 -1
  13. package/dist/methods/hookInteractionListeners.js +1 -1
  14. package/dist/methods/hookInteractionListeners.js.map +1 -1
  15. package/dist/types/ChatInput/ChatInputOptions.d.ts +6 -6
  16. package/dist/types/ChatInput/ChatInputOptions.d.ts.map +1 -1
  17. package/dist/types/ChatInput/ChatInputOptions.js.map +1 -1
  18. package/dist/types/Interaction.d.ts +5 -1
  19. package/dist/types/Interaction.d.ts.map +1 -1
  20. package/dist/types/Interaction.js.map +1 -1
  21. package/dist/types/other/FakeMessageInteraction.d.ts +75 -0
  22. package/dist/types/other/FakeMessageInteraction.d.ts.map +1 -0
  23. package/dist/types/other/FakeMessageInteraction.js +310 -0
  24. package/dist/types/other/FakeMessageInteraction.js.map +1 -0
  25. package/package.json +2 -1
  26. package/readme.md +35 -0
  27. package/src/DBI.ts +53 -1
  28. package/src/Events.ts +10 -1
  29. package/src/methods/handleMessageCommands.ts +310 -0
  30. package/src/methods/hookInteractionListeners.ts +1 -2
  31. package/src/types/ChatInput/ChatInputOptions.ts +3 -3
  32. package/src/types/Interaction.ts +1 -1
  33. package/src/types/other/FakeMessageInteraction.ts +292 -0
@@ -0,0 +1,75 @@
1
+ import { Message, MessagePayload, ApplicationCommandType, Locale, APIInteractionGuildMember, GuildMember, PermissionsBitField, ApplicationCommandOptionType, User, Attachment } from 'discord.js';
2
+ import { TDBIInteractions } from '../Interaction';
3
+ import { DBI } from '../../DBI';
4
+ import { NamespaceEnums } from "../../../generated/namespaceData";
5
+ export declare class FakeMessageInteraction {
6
+ private dbi;
7
+ private message;
8
+ locale: string;
9
+ private usedPrefix;
10
+ channelId: string;
11
+ commandName: string;
12
+ appPermissions: any;
13
+ applicationId: string;
14
+ channel: any;
15
+ command: any;
16
+ commandGuildId: string;
17
+ commandId: any;
18
+ commandType: ApplicationCommandType.ChatInput;
19
+ deferred: boolean;
20
+ client: any;
21
+ createdAt: Date;
22
+ ephemeral: boolean;
23
+ createdTimestamp: number;
24
+ guild: any;
25
+ guildId: string;
26
+ guildLocale: Locale;
27
+ id: string;
28
+ user: User;
29
+ private repliedMessage;
30
+ private lastFollowUp;
31
+ member: GuildMember | APIInteractionGuildMember;
32
+ memberPermissions: Readonly<PermissionsBitField>;
33
+ parsedArgs: Map<string, FakeMessageInteractionArgument>;
34
+ usedCommandName: string;
35
+ fullCommandName: string;
36
+ options: any;
37
+ dbiChatInput: TDBIInteractions<string | number>;
38
+ dbiChatInputOptions: any[];
39
+ fake: boolean;
40
+ constructor(dbi: DBI<NamespaceEnums>, message: Message, chatInput: TDBIInteractions<string | number>, locale: string, commandName: string, usedPrefix: string);
41
+ private getRawOptionValue;
42
+ private getClonedDBIOption;
43
+ inGuild(): boolean;
44
+ deferReply(options: any): Promise<any>;
45
+ deleteReply(): Promise<void>;
46
+ followUp(content: string | MessagePayload): Promise<Message<boolean>>;
47
+ editReply(content: string | MessagePayload): Promise<Message<boolean>>;
48
+ reply(content: string | MessagePayload): Promise<any>;
49
+ awaitModalSubmit(): Promise<void>;
50
+ fetchReply(): Promise<Message<boolean>>;
51
+ isAnySelectMenu(): boolean;
52
+ isAutocomplete(): boolean;
53
+ isButton(): boolean;
54
+ isChannelSelectMenu(): boolean;
55
+ isChatInputCommand(): boolean;
56
+ isCommand(): boolean;
57
+ isContextMenuCommand(): boolean;
58
+ isMentionableSelectMenu(): boolean;
59
+ isMessageComponent(): boolean;
60
+ isMessageContextMenuCommand(): boolean;
61
+ isModalSubmit(): boolean;
62
+ isRepliable(): boolean;
63
+ isRoleSelectMenu(): boolean;
64
+ isStringSelectMenu(): boolean;
65
+ isUserContextMenuCommand(): boolean;
66
+ isUserSelectMenu(): boolean;
67
+ isSelectMenu(): boolean;
68
+ }
69
+ interface FakeMessageInteractionArgument {
70
+ type: ApplicationCommandOptionType;
71
+ value: any;
72
+ attachment?: Attachment;
73
+ }
74
+ export {};
75
+ //# sourceMappingURL=FakeMessageInteraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeMessageInteraction.d.ts","sourceRoot":"","sources":["../../../src/types/other/FakeMessageInteraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAA+B,MAAM,EAAE,yBAAyB,EAAE,WAAW,EAAE,mBAAmB,EAAgF,4BAA4B,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7S,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAGlE,qBAAa,sBAAsB;IAkCrB,OAAO,CAAC,GAAG;IAAuB,OAAO,CAAC,OAAO;IAAgE,MAAM,EAAE,MAAM;IAAuB,OAAO,CAAC,UAAU;IAjCpL,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,GAAG,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,GAAG,CAAC;IACf,WAAW,EAAE,sBAAsB,CAAC,SAAS,CAAC;IAG9C,QAAQ,EAAE,OAAO,CAAS;IAC1B,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,OAAO,CAAS;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,YAAY,CAAsB;IAC1C,MAAM,EAAE,WAAW,GAAG,yBAAyB,CAAC;IAChD,iBAAiB,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACjD,UAAU,8CAAqD;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAChD,mBAAmB,EAAE,GAAG,EAAE,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAQ;gBAED,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,EAAU,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAS,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAU,UAAU,EAAE,MAAM;IA2K5L,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,kBAAkB;IAI1B,OAAO;IAID,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAQtC,WAAW;IAMX,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAUzC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAM1C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAMrD,gBAAgB;IAIhB,UAAU;IAIhB,eAAe;IACf,cAAc;IACd,QAAQ;IACR,mBAAmB;IACnB,kBAAkB;IAClB,SAAS;IACT,oBAAoB;IACpB,uBAAuB;IACvB,kBAAkB;IAClB,2BAA2B;IAC3B,aAAa;IACb,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,wBAAwB;IACxB,gBAAgB;IAChB,YAAY;CACb;AAED,UAAU,8BAA8B;IACtC,IAAI,EAAE,4BAA4B,CAAC;IACnC,KAAK,EAAE,GAAG,CAAC;IACX,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB"}
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FakeMessageInteraction = void 0;
4
+ const discord_js_1 = require("discord.js");
5
+ const plsargs_1 = require("plsargs");
6
+ class FakeMessageInteraction /* implements ChatInputCommandInteraction */ {
7
+ dbi;
8
+ message;
9
+ locale;
10
+ usedPrefix;
11
+ channelId;
12
+ commandName;
13
+ appPermissions;
14
+ applicationId;
15
+ channel;
16
+ command;
17
+ commandGuildId;
18
+ commandId;
19
+ commandType;
20
+ // awaitModalSubmit: (...arr: any[]) => any;
21
+ // fetchReply: () => Promise<any>;
22
+ deferred = false;
23
+ client;
24
+ createdAt;
25
+ ephemeral = false;
26
+ createdTimestamp;
27
+ guild;
28
+ guildId;
29
+ guildLocale;
30
+ id;
31
+ user;
32
+ repliedMessage;
33
+ lastFollowUp;
34
+ member;
35
+ memberPermissions;
36
+ parsedArgs = new Map();
37
+ usedCommandName;
38
+ fullCommandName;
39
+ options;
40
+ dbiChatInput;
41
+ dbiChatInputOptions;
42
+ fake = true;
43
+ constructor(dbi, message, chatInput, locale, commandName, usedPrefix) {
44
+ this.dbi = dbi;
45
+ this.message = message;
46
+ this.locale = locale;
47
+ this.usedPrefix = usedPrefix;
48
+ const self = this;
49
+ this.channelId = message.channel.id;
50
+ this.commandName = chatInput.name.split(" ").at(0);
51
+ this.appPermissions = message.guild?.members.me.permissionsIn(message.channel) ?? new discord_js_1.PermissionsBitField(8n);
52
+ this.applicationId = message.client.user.id;
53
+ this.channel = message.channel;
54
+ this.commandGuildId = message.guild.id;
55
+ this.commandType = discord_js_1.ApplicationCommandType.ChatInput;
56
+ this.client = message.client;
57
+ this.createdAt = message.createdAt;
58
+ this.createdTimestamp = message.createdTimestamp;
59
+ this.guild = message.guild;
60
+ this.guildId = message.guild?.id;
61
+ this.guildLocale = message.guild?.preferredLocale;
62
+ this.id = message.guild?.commands.cache.find((cmd) => cmd.name === this.commandName)?.id ?? message.client.application.commands.cache.find((cmd) => cmd.name === this.commandName)?.id ?? "-1";
63
+ this.locale = message.guild?.preferredLocale;
64
+ this.member = message.member;
65
+ this.memberPermissions = message.member?.permissions;
66
+ this.user = message.author;
67
+ this.usedCommandName = commandName;
68
+ this.fullCommandName = chatInput.name;
69
+ this.dbiChatInput = chatInput;
70
+ this.dbiChatInputOptions = chatInput.options ? chatInput.options.map(i => ({ ...i })) : [];
71
+ {
72
+ const argContent = message.content.slice(usedPrefix.length + commandName.length).replace(/ +/, " ").trim();
73
+ const args = (0, plsargs_1.plsParseArgs)(argContent);
74
+ const options = chatInput.options ?? [];
75
+ const atchs = [...message.attachments.values()];
76
+ for (let i = 0, attachmentIndex = 0, namedValueSize = 0; i < options.length; i++) {
77
+ const option = options[i];
78
+ if (!option)
79
+ break;
80
+ if (option.type === discord_js_1.ApplicationCommandOptionType.Attachment) {
81
+ this.parsedArgs.set(option.name, {
82
+ type: option.type,
83
+ value: atchs.at(attachmentIndex)?.url,
84
+ attachment: atchs.at(attachmentIndex++)
85
+ });
86
+ continue;
87
+ }
88
+ const arg = args.get(option.name) ?? args.get(i - attachmentIndex - namedValueSize);
89
+ if (args.get(option.name))
90
+ namedValueSize++;
91
+ this.parsedArgs.set(option.name, {
92
+ type: option.type,
93
+ value: arg
94
+ });
95
+ }
96
+ }
97
+ this.options = {
98
+ get(name) {
99
+ const rawValue = self.getRawOptionValue(name);
100
+ if (!rawValue)
101
+ return null;
102
+ return {
103
+ value: rawValue,
104
+ get boolean() { return self.options.getBoolean(name); },
105
+ get channel() { return self.options.getChannel(name); },
106
+ get string() { return self.options.getString(name); },
107
+ get integer() { return self.options.getInteger(name); },
108
+ get number() { return self.options.getNumber(name); },
109
+ get user() { return self.options.getUser(name); },
110
+ get member() { return self.options.getMember(name); },
111
+ get role() { return self.options.getRole(name); },
112
+ get mentionable() { return self.options.getMentionable(name); },
113
+ get attachment() { return self.options.getAttachment(name); }
114
+ };
115
+ },
116
+ getSubcommand() {
117
+ let splitted = self.fullCommandName.split(" ");
118
+ if (splitted.length === 1)
119
+ return null;
120
+ return splitted.at(-1);
121
+ },
122
+ getSubcommandGroup() {
123
+ let splitted = self.fullCommandName.split(" ");
124
+ if (splitted.length === 3)
125
+ return splitted[1];
126
+ return null;
127
+ },
128
+ getBoolean(name) {
129
+ const rawValue = self.getRawOptionValue(name);
130
+ if (!rawValue)
131
+ return null;
132
+ return !!self.dbi.config.messageCommands.typeAliases.booleans[rawValue.toLowerCase()];
133
+ },
134
+ getChannel(name, _, channelType) {
135
+ const rawValue = self.getRawOptionValue(name);
136
+ if (!rawValue)
137
+ return null;
138
+ let value = rawValue.replace(/<#|>/g, "");
139
+ let channel = self.message.client.channels.cache.get(value);
140
+ if (!channel)
141
+ channel = self.message.client.channels.cache.find(c => {
142
+ if (self.guildId && c.guildId && c.guildId !== self.guildId)
143
+ return false;
144
+ return c.name === value;
145
+ });
146
+ if (channelType && channel?.type !== channelType)
147
+ return null;
148
+ return channel;
149
+ },
150
+ getString(name) {
151
+ const dbiOption = self.getClonedDBIOption(name);
152
+ let rawValue = `${self.getRawOptionValue(name)}`;
153
+ let choices = dbiOption.choices ?? dbiOption._choices;
154
+ if (choices)
155
+ return choices.find(c => c.value === rawValue || c.name === rawValue)?.value ?? rawValue;
156
+ return rawValue;
157
+ },
158
+ getInteger(name) {
159
+ const dbiOption = self.getClonedDBIOption(name);
160
+ let rawValue = self.getRawOptionValue(name);
161
+ let parsedValue = parseInt(rawValue);
162
+ let choices = dbiOption.choices ?? dbiOption._choices;
163
+ if (choices)
164
+ return choices.find(c => c.value === parsedValue || c.name === rawValue)?.value ?? rawValue;
165
+ return rawValue;
166
+ },
167
+ getNumber(name) {
168
+ const dbiOption = self.getClonedDBIOption(name);
169
+ let rawValue = self.getRawOptionValue(name);
170
+ let parsedValue = parseFloat(rawValue);
171
+ let choices = dbiOption.choices ?? dbiOption._choices;
172
+ if (choices)
173
+ return choices.find(c => c.value === parsedValue || c.name === rawValue)?.value ?? rawValue;
174
+ return rawValue;
175
+ },
176
+ getUser(name) {
177
+ const rawValue = self.getRawOptionValue(name);
178
+ if (!rawValue)
179
+ return null;
180
+ let value = rawValue.replace(/<@!?|>/g, "");
181
+ let user = self.message.client.users.cache.get(value);
182
+ if (!user)
183
+ user = self.message.client.users.cache.find(u => u.username === value || u.tag === value);
184
+ return user;
185
+ },
186
+ getMember(name) {
187
+ const rawValue = self.getRawOptionValue(name);
188
+ if (!rawValue)
189
+ return null;
190
+ let value = rawValue.replace(/<@!?|>/g, "");
191
+ let member = self.message.guild?.members.cache.get(value);
192
+ if (!member)
193
+ member = self.message.guild?.members.cache.find(m => m.user.username === value || m.user.tag === value);
194
+ return member;
195
+ },
196
+ getRole(name) {
197
+ const rawValue = self.getRawOptionValue(name);
198
+ if (!rawValue)
199
+ return null;
200
+ let value = rawValue.replace(/<@&|>/g, "");
201
+ let role = self.message.guild?.roles.cache.get(value);
202
+ if (!role)
203
+ role = self.message.guild?.roles.cache.find(r => r.name === value);
204
+ return role;
205
+ },
206
+ getMentionable(name) {
207
+ const rawValue = self.getRawOptionValue(name);
208
+ if (!rawValue)
209
+ return null;
210
+ let value = rawValue.replace(/<@(!|&)?|>/g, "");
211
+ let user = self.message.client.users.cache.get(value);
212
+ if (!user)
213
+ user = self.message.client.users.cache.find(u => u.username === value || u.tag === value);
214
+ if (user)
215
+ return user;
216
+ let member = self.message.guild?.members.cache.get(value);
217
+ if (!member)
218
+ member = self.message.guild?.members.cache.find(m => m.user.username === value || m.user.tag === value);
219
+ if (member)
220
+ return member;
221
+ let role = self.message.guild?.roles.cache.get(value);
222
+ if (!role)
223
+ role = self.message.guild?.roles.cache.find(r => r.name === value);
224
+ if (role)
225
+ return role;
226
+ return null;
227
+ },
228
+ getMessage() {
229
+ return self.message;
230
+ },
231
+ getAttachment(name) {
232
+ let d = self.parsedArgs.get(name);
233
+ return d?.attachment ?? null;
234
+ }
235
+ };
236
+ }
237
+ getRawOptionValue(name) {
238
+ return this.parsedArgs.get(name)?.value;
239
+ }
240
+ getClonedDBIOption(name) {
241
+ return this.dbiChatInputOptions.find(o => o.name === name);
242
+ }
243
+ inGuild() {
244
+ return true;
245
+ }
246
+ async deferReply(options) {
247
+ // if (options.ephemeral) throw new Error("Ephemeral replies are not supported in message commands.");
248
+ if (this.repliedMessage)
249
+ throw new Error("Already deferred reply.");
250
+ this.repliedMessage = await this.message.reply(options.content ?? "Loading...");
251
+ this.deferred = true;
252
+ return this.repliedMessage;
253
+ }
254
+ async deleteReply() {
255
+ if (!this.repliedMessage)
256
+ throw new Error("No deferred reply.");
257
+ await this.repliedMessage.delete();
258
+ this.repliedMessage = undefined;
259
+ }
260
+ async followUp(content) {
261
+ if (!this.repliedMessage)
262
+ throw new Error("No deferred reply.");
263
+ if (!this.lastFollowUp) {
264
+ this.lastFollowUp = await this.repliedMessage.reply(content);
265
+ }
266
+ else {
267
+ this.lastFollowUp = await this.lastFollowUp.reply(content);
268
+ }
269
+ return this.lastFollowUp;
270
+ }
271
+ async editReply(content) {
272
+ if (!this.repliedMessage)
273
+ throw new Error("No deferred reply.");
274
+ await this.repliedMessage.edit(content);
275
+ return this.repliedMessage;
276
+ }
277
+ async reply(content) {
278
+ if (this.repliedMessage)
279
+ throw new Error("Already deferred reply.");
280
+ this.repliedMessage = await this.message.reply(content);
281
+ return this.repliedMessage;
282
+ }
283
+ async awaitModalSubmit() {
284
+ throw new Error("Method not implemented.");
285
+ }
286
+ ;
287
+ async fetchReply() {
288
+ return this.repliedMessage?.id && await this.message.channel.messages.fetch(this.repliedMessage.id);
289
+ }
290
+ ;
291
+ isAnySelectMenu() { return false; }
292
+ isAutocomplete() { return false; }
293
+ isButton() { return false; }
294
+ isChannelSelectMenu() { return false; }
295
+ isChatInputCommand() { return true; }
296
+ isCommand() { return true; }
297
+ isContextMenuCommand() { return false; }
298
+ isMentionableSelectMenu() { return false; }
299
+ isMessageComponent() { return false; }
300
+ isMessageContextMenuCommand() { return false; }
301
+ isModalSubmit() { return false; }
302
+ isRepliable() { return true; }
303
+ isRoleSelectMenu() { return false; }
304
+ isStringSelectMenu() { return false; }
305
+ isUserContextMenuCommand() { return false; }
306
+ isUserSelectMenu() { return false; }
307
+ isSelectMenu() { return false; }
308
+ }
309
+ exports.FakeMessageInteraction = FakeMessageInteraction;
310
+ //# sourceMappingURL=FakeMessageInteraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeMessageInteraction.js","sourceRoot":"","sources":["../../../src/types/other/FakeMessageInteraction.ts"],"names":[],"mappings":"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","sourcesContent":["import { Message, MessagePayload, ApplicationCommandType, ChatInputCommandInteraction, Locale, APIInteractionGuildMember, GuildMember, PermissionsBitField, CacheType, CommandInteractionOptionResolver, CommandOptionDataTypeResolvable, ApplicationCommandOptionType, User, Attachment } from 'discord.js';\r\nimport { TDBIInteractions } from '../Interaction';\r\nimport { plsParseArgs } from \"plsargs\";\r\nimport { DBI } from '../../DBI';\r\nimport { NamespaceEnums } from \"../../../generated/namespaceData\";\r\nimport { ChannelType } from \"discord-api-types/v10\";\r\n\r\nexport class FakeMessageInteraction /* implements ChatInputCommandInteraction */ {\r\n channelId: string;\r\n commandName: string;\r\n appPermissions: any;\r\n applicationId: string;\r\n channel: any; \r\n command: any;\r\n commandGuildId: string;\r\n commandId: any; \r\n commandType: ApplicationCommandType.ChatInput;\r\n // awaitModalSubmit: (...arr: any[]) => any;\r\n // fetchReply: () => Promise<any>;\r\n deferred: boolean = false;\r\n client: any; \r\n createdAt: Date;\r\n ephemeral: boolean = false;\r\n createdTimestamp: number;\r\n guild: any; \r\n guildId: string;\r\n guildLocale: Locale;\r\n id: string;\r\n user: User;\r\n private repliedMessage: Message | undefined;\r\n private lastFollowUp: Message | undefined;\r\n member: GuildMember | APIInteractionGuildMember;\r\n memberPermissions: Readonly<PermissionsBitField>;\r\n parsedArgs = new Map<string, FakeMessageInteractionArgument>();\r\n usedCommandName: string;\r\n fullCommandName: string;\r\n options: any;\r\n dbiChatInput: TDBIInteractions<string | number>;\r\n dbiChatInputOptions: any[];\r\n fake: boolean = true;\r\n\r\n constructor(private dbi: DBI<NamespaceEnums>, private message: Message, chatInput: TDBIInteractions<string | number>, public locale: string, commandName: string, private usedPrefix: string) {\r\n const self = this;\r\n \r\n this.channelId = message.channel.id;\r\n this.commandName = chatInput.name.split(\" \").at(0);\r\n this.appPermissions = message.guild?.members.me.permissionsIn(message.channel as any) ?? new PermissionsBitField(8n);\r\n this.applicationId = message.client.user.id;\r\n this.channel = message.channel as any;\r\n this.commandGuildId = message.guild.id;\r\n this.commandType = ApplicationCommandType.ChatInput;\r\n \r\n this.client = message.client;\r\n this.createdAt = message.createdAt;\r\n this.createdTimestamp = message.createdTimestamp;\r\n this.guild = message.guild;\r\n this.guildId = message.guild?.id;\r\n this.guildLocale = message.guild?.preferredLocale;\r\n this.id = message.guild?.commands.cache.find((cmd) => cmd.name === this.commandName)?.id ?? message.client.application.commands.cache.find((cmd) => cmd.name === this.commandName)?.id ?? \"-1\";\r\n this.locale = message.guild?.preferredLocale;\r\n this.member = message.member;\r\n this.memberPermissions = message.member?.permissions;\r\n this.user = message.author;\r\n\r\n this.usedCommandName = commandName;\r\n this.fullCommandName = chatInput.name;\r\n this.dbiChatInput = chatInput;\r\n this.dbiChatInputOptions = chatInput.options ? chatInput.options.map(i => ({ ...i })) : []; \r\n\r\n {\r\n const argContent = message.content.slice(usedPrefix.length + commandName.length).replace(/ +/, \" \").trim();\r\n const args = plsParseArgs(argContent);\r\n\r\n const options = chatInput.options ?? [];\r\n const atchs = [...message.attachments.values()];\r\n for (let i = 0, attachmentIndex = 0, namedValueSize = 0; i < options.length; i++) {\r\n const option = options[i];\r\n if (!option) break;\r\n if (option.type === ApplicationCommandOptionType.Attachment) {\r\n this.parsedArgs.set(option.name, {\r\n type: option.type,\r\n value: atchs.at(attachmentIndex)?.url,\r\n attachment: atchs.at(attachmentIndex++)\r\n })\r\n continue;\r\n }\r\n const arg = args.get(option.name) ?? args.get(i - attachmentIndex - namedValueSize);\r\n if (args.get(option.name)) namedValueSize++;\r\n this.parsedArgs.set(option.name, {\r\n type: option.type,\r\n value: arg\r\n });\r\n }\r\n }\r\n\r\n this.options = {\r\n get(name: string) {\r\n const rawValue = self.getRawOptionValue(name);\r\n if (!rawValue) return null;\r\n return {\r\n value: rawValue,\r\n get boolean() { return self.options.getBoolean(name); },\r\n get channel() { return self.options.getChannel(name); },\r\n get string() { return self.options.getString(name); },\r\n get integer() { return self.options.getInteger(name); },\r\n get number() { return self.options.getNumber(name); },\r\n get user() { return self.options.getUser(name); },\r\n get member() { return self.options.getMember(name); },\r\n get role() { return self.options.getRole(name); },\r\n get mentionable() { return self.options.getMentionable(name); },\r\n get attachment() { return self.options.getAttachment(name); }\r\n };\r\n },\r\n getSubcommand() {\r\n let splitted = self.fullCommandName.split(\" \");\r\n if (splitted.length === 1) return null;\r\n return splitted.at(-1);\r\n },\r\n getSubcommandGroup() {\r\n let splitted = self.fullCommandName.split(\" \");\r\n if (splitted.length === 3) return splitted[1];\r\n return null;\r\n },\r\n getBoolean(name: string) {\r\n const rawValue = self.getRawOptionValue(name);\r\n if (!rawValue) return null;\r\n return !!self.dbi.config.messageCommands.typeAliases.booleans[rawValue.toLowerCase()];\r\n },\r\n getChannel(name: string, _: any, channelType?: ChannelType) {\r\n const rawValue = self.getRawOptionValue(name);\r\n if (!rawValue) return null;\r\n let value = rawValue.replace(/<#|>/g, \"\");\r\n let channel = self.message.client.channels.cache.get(value);\r\n if (!channel) channel = self.message.client.channels.cache.find(c => {\r\n if (self.guildId && (c as any).guildId && (c as any).guildId !== self.guildId) return false;\r\n return (c as any).name === value;\r\n });\r\n if (channelType && channel?.type !== channelType) return null;\r\n return channel;\r\n },\r\n getString(name: string) {\r\n const dbiOption = self.getClonedDBIOption(name);\r\n let rawValue = `${self.getRawOptionValue(name)}`;\r\n let choices = dbiOption.choices ?? dbiOption._choices;\r\n if (choices) return choices.find(c => c.value === rawValue || c.name === rawValue)?.value ?? rawValue;\r\n return rawValue;\r\n },\r\n getInteger(name: string) {\r\n const dbiOption = self.getClonedDBIOption(name);\r\n let rawValue = self.getRawOptionValue(name);\r\n let parsedValue = parseInt(rawValue);\r\n let choices = dbiOption.choices ?? dbiOption._choices;\r\n if (choices) return choices.find(c => c.value === parsedValue || c.name === rawValue)?.value ?? rawValue;\r\n return rawValue;\r\n },\r\n getNumber(name: string) {\r\n const dbiOption = self.getClonedDBIOption(name);\r\n let rawValue = self.getRawOptionValue(name);\r\n let parsedValue = parseFloat(rawValue);\r\n let choices = dbiOption.choices ?? dbiOption._choices;\r\n if (choices) return choices.find(c => c.value === parsedValue || c.name === rawValue)?.value ?? rawValue;\r\n return rawValue;\r\n },\r\n getUser(name: string) {\r\n const rawValue = self.getRawOptionValue(name);\r\n if (!rawValue) return null;\r\n let value = rawValue.replace(/<@!?|>/g, \"\");\r\n let user = self.message.client.users.cache.get(value);\r\n if (!user) user = self.message.client.users.cache.find(u => u.username === value || u.tag === value);\r\n return user;\r\n },\r\n getMember(name: string) {\r\n const rawValue = self.getRawOptionValue(name);\r\n if (!rawValue) return null;\r\n let value = rawValue.replace(/<@!?|>/g, \"\");\r\n let member = self.message.guild?.members.cache.get(value);\r\n if (!member) member = self.message.guild?.members.cache.find(m => m.user.username === value || m.user.tag === value);\r\n return member;\r\n },\r\n getRole(name: string) {\r\n const rawValue = self.getRawOptionValue(name);\r\n if (!rawValue) return null;\r\n let value = rawValue.replace(/<@&|>/g, \"\");\r\n let role = self.message.guild?.roles.cache.get(value);\r\n if (!role) role = self.message.guild?.roles.cache.find(r => r.name === value);\r\n return role;\r\n },\r\n getMentionable(name: string) {\r\n const rawValue = self.getRawOptionValue(name);\r\n if (!rawValue) return null;\r\n let value = rawValue.replace(/<@(!|&)?|>/g, \"\");\r\n let user = self.message.client.users.cache.get(value);\r\n if (!user) user = self.message.client.users.cache.find(u => u.username === value || u.tag === value);\r\n if (user) return user;\r\n let member = self.message.guild?.members.cache.get(value);\r\n if (!member) member = self.message.guild?.members.cache.find(m => m.user.username === value || m.user.tag === value);\r\n if (member) return member;\r\n let role = self.message.guild?.roles.cache.get(value);\r\n if (!role) role = self.message.guild?.roles.cache.find(r => r.name === value);\r\n if (role) return role;\r\n return null;\r\n },\r\n getMessage() {\r\n return self.message;\r\n },\r\n getAttachment(name: string) {\r\n let d = self.parsedArgs.get(name);\r\n return d?.attachment ?? null;\r\n }\r\n }\r\n }\r\n\r\n private getRawOptionValue(name: string): any {\r\n return this.parsedArgs.get(name)?.value;\r\n }\r\n\r\n private getClonedDBIOption(name: string): any {\r\n return this.dbiChatInputOptions.find(o => o.name === name);\r\n }\r\n\r\n inGuild() {\r\n return true;\r\n }\r\n\r\n async deferReply(options: any): Promise<any> {\r\n // if (options.ephemeral) throw new Error(\"Ephemeral replies are not supported in message commands.\");\r\n if (this.repliedMessage) throw new Error(\"Already deferred reply.\");\r\n this.repliedMessage = await this.message.reply(options.content ?? \"Loading...\");\r\n this.deferred = true;\r\n return this.repliedMessage;\r\n }\r\n\r\n async deleteReply() {\r\n if (!this.repliedMessage) throw new Error(\"No deferred reply.\");\r\n await this.repliedMessage.delete();\r\n this.repliedMessage = undefined;\r\n }\r\n\r\n async followUp(content: string | MessagePayload) {\r\n if (!this.repliedMessage) throw new Error(\"No deferred reply.\");\r\n if (!this.lastFollowUp) {\r\n this.lastFollowUp = await this.repliedMessage.reply(content);\r\n } else {\r\n this.lastFollowUp = await this.lastFollowUp.reply(content);\r\n }\r\n return this.lastFollowUp;\r\n }\r\n\r\n async editReply(content: string | MessagePayload) {\r\n if (!this.repliedMessage) throw new Error(\"No deferred reply.\");\r\n await this.repliedMessage.edit(content);\r\n return this.repliedMessage;\r\n }\r\n\r\n async reply(content: string | MessagePayload): Promise<any> {\r\n if (this.repliedMessage) throw new Error(\"Already deferred reply.\");\r\n this.repliedMessage = await this.message.reply(content);\r\n return this.repliedMessage;\r\n }\r\n\r\n async awaitModalSubmit() {\r\n throw new Error(\"Method not implemented.\");\r\n };\r\n\r\n async fetchReply() {\r\n return this.repliedMessage?.id && await this.message.channel.messages.fetch(this.repliedMessage.id);\r\n };\r\n\r\n isAnySelectMenu() { return false; }\r\n isAutocomplete() { return false; }\r\n isButton() { return false; }\r\n isChannelSelectMenu() { return false; }\r\n isChatInputCommand() { return true; }\r\n isCommand() { return true; }\r\n isContextMenuCommand() { return false; }\r\n isMentionableSelectMenu() { return false; }\r\n isMessageComponent() { return false; }\r\n isMessageContextMenuCommand() { return false; }\r\n isModalSubmit() { return false; }\r\n isRepliable() { return true; }\r\n isRoleSelectMenu() { return false; }\r\n isStringSelectMenu() { return false; }\r\n isUserContextMenuCommand() { return false; }\r\n isUserSelectMenu() { return false; }\r\n isSelectMenu() { return false; }\r\n}\r\n\r\ninterface FakeMessageInteractionArgument {\r\n type: ApplicationCommandOptionType,\r\n value: any,\r\n attachment?: Attachment\r\n}"]}
package/package.json CHANGED
@@ -6,11 +6,12 @@
6
6
  "discord-hybrid-sharding": "github:meister03/discord-hybrid-sharding",
7
7
  "discord.js": "^14.13.0",
8
8
  "lodash": "^4.17.21",
9
+ "plsargs": "^0.1.6",
9
10
  "snakecase-keys": "^5.4.2",
10
11
  "stuffs": "^0.1.21"
11
12
  },
12
13
  "name": "@mostfeatured/dbi",
13
- "version": "0.0.81",
14
+ "version": "0.0.83",
14
15
  "main": "dist/index.js",
15
16
  "type": "commonjs",
16
17
  "private": false,
package/readme.md CHANGED
@@ -35,8 +35,26 @@ let dbi = createDBI("xd", {
35
35
  ttl: 60 * 1000 * 60,
36
36
  check: 60 * 1000
37
37
  }
38
+ },
39
+ // Message Commands are optional. Message Commands work trough emulating the slash commands..
40
+ messageCommands: {
41
+ prefixes: ["!", "."],
42
+ typeAliases: {
43
+ booleans: {
44
+ "true": true,
45
+ "false": false,
46
+ "yes": true,
47
+ "no": false,
48
+ }
49
+ }
38
50
  }
39
51
  });
52
+
53
+ dbi.events.on("messageCommandArgumentError", (data) => {
54
+ data.message.reply(`‼️ Invalid argument \`${data.error.option.name}\` (Index: \`${data.error.index}\`). Error Kind: \`${data.error.type}\`. Expected: \`${ApplicationCommandOptionType[data.error.option.type]}\`${data.error.extra ? ` with any of \`${data.error.extra.map(i => i.name).join(", ")}\`` : ""}.`);
55
+ return false;
56
+ });
57
+
40
58
  module.exports = dbi;
41
59
  ```
42
60
 
@@ -307,9 +325,26 @@ let dbi = createDBI("xd", {
307
325
  ttl: 60 * 1000 * 60,
308
326
  check: 60 * 1000
309
327
  }
328
+ },
329
+ // Mesaj Komutları isteğe bağlıdır. Mesaj Komutları slash komutlarını taklit ederek çalışır. Yani siz sadece slash komut kodlasanız bile uyumlu olarak çalışacaktır.
330
+ messageCommands: {
331
+ prefixes: ["!", "."],
332
+ typeAliases: {
333
+ booleans: {
334
+ "true": true,
335
+ "false": false,
336
+ "yes": true,
337
+ "no": false,
338
+ }
339
+ }
310
340
  }
311
341
  });
312
342
 
343
+ dbi.events.on("messageCommandArgumentError", (data) => {
344
+ data.message.reply(`‼️ Hatalı argument \`${data.error.option.name}\` (Konum: \`${data.error.index}\`). Hata Tipi: \`${data.error.type}\`. Beklenen: \`${ApplicationCommandOptionType[data.error.option.type]}\`${data.error.extra ? ` şunlardan herhangi biri \`${data.error.extra.map(i => i.name).join(", ")}\`` : ""}.`);
345
+ return false;
346
+ });
347
+
313
348
  module.exports = dbi;
314
349
  ```
315
350
 
package/src/DBI.ts CHANGED
@@ -25,6 +25,7 @@ import { DBIUserSelectMenu, TDBIUserSelectMenuOmitted } from "./types/Components
25
25
  import { DBIMentionableSelectMenu, TDBIMentionableSelectMenuOmitted } from "./types/Components/MentionableSelectMenu";
26
26
  import { DBIChannelSelectMenu, TDBIChannelSelectMenuOmitted } from "./types/Components/ChannelSelectMenu";
27
27
  import { DBIRoleSelectMenu, TDBIRoleSelectMenuOmitted } from "./types/Components/RoleSelectMenu";
28
+ import { handleMessageCommands } from "./methods/handleMessageCommands";
28
29
 
29
30
  export interface DBIStore {
30
31
  get(key: string, defaultValue?: any): Promise<any>;
@@ -61,6 +62,12 @@ export interface DBIConfig {
61
62
  };
62
63
 
63
64
  strict: boolean;
65
+ messageCommands?: {
66
+ prefixes: string[];
67
+ typeAliases: {
68
+ booleans: Record<string, boolean>;
69
+ }
70
+ }
64
71
  }
65
72
 
66
73
  export interface DBIConfigConstructor {
@@ -98,6 +105,16 @@ export interface DBIConfigConstructor {
98
105
  }
99
106
 
100
107
  strict?: boolean;
108
+
109
+ messageCommands?: {
110
+ prefixes: string[];
111
+ typeAliases?: {
112
+ /**
113
+ * Example: {"yes": true, "no": false}
114
+ */
115
+ booleans?: Record<string, boolean>;
116
+ }
117
+ }
101
118
  }
102
119
 
103
120
  export interface DBIRegisterAPI<TNamespace extends NamespaceEnums> {
@@ -167,6 +184,25 @@ export class DBI<TNamespace extends NamespaceEnums, TOtherData = Record<string,
167
184
  ...(config.references || {})
168
185
  }
169
186
 
187
+ if (config.messageCommands) {
188
+ if (config.strict && !config.messageCommands?.prefixes?.length) throw new Error("No message command prefixes provided.");
189
+
190
+ let { typeAliases } = config.messageCommands;
191
+
192
+ config.messageCommands.typeAliases = {
193
+ booleans: typeAliases.booleans ?? {
194
+ "true": true,
195
+ "false": false,
196
+ "yes": true,
197
+ "no": false,
198
+ "y": true,
199
+ "n": false,
200
+ "1": true,
201
+ "0": false
202
+ }
203
+ };
204
+ }
205
+
170
206
  // @ts-ignore
171
207
  this.config = config;
172
208
 
@@ -235,10 +271,11 @@ export class DBI<TNamespace extends NamespaceEnums, TOtherData = Record<string,
235
271
 
236
272
  private async _hookListeners() {
237
273
  if (this._hooked) return;
274
+ const self = this;
238
275
  this._hooked = true;
239
276
  this.data.unloaders.add(hookInteractionListeners(this as any));
240
277
  this.data.unloaders.add(hookEventListeners(this as any));
241
- if (typeof this.config.references.autoClear != "undefined") {
278
+ if (typeof this.config.references.autoClear !== "undefined") {
242
279
  this.data.unloaders.add((() => {
243
280
  let interval = setInterval(() => {
244
281
  this.data.refs.forEach(({ at, ttl }, key) => {
@@ -252,6 +289,20 @@ export class DBI<TNamespace extends NamespaceEnums, TOtherData = Record<string,
252
289
  }
253
290
  })());
254
291
  }
292
+ if (typeof this.config.messageCommands !== "undefined") {
293
+ this.data.unloaders.add((() => {
294
+ const { client } = this.client();
295
+
296
+ function onMessage(message: Discord.Message) {
297
+ handleMessageCommands(self as any, message);
298
+ }
299
+
300
+ client.on("messageCreate", onMessage);
301
+ return () => {
302
+ client.off("messageCreate", onMessage);
303
+ }
304
+ })());
305
+ }
255
306
  }
256
307
 
257
308
  private async _unhookListeners() {
@@ -414,6 +465,7 @@ export class DBI<TNamespace extends NamespaceEnums, TOtherData = Record<string,
414
465
  },
415
466
  });
416
467
  }
468
+ self.data.interactions.sort((a, b) => a.name.length - b.name.length);
417
469
  }
418
470
 
419
471
  emit<TEventName extends keyof (NamespaceData[TNamespace]["customEvents"] & ClientEvents)>(name: TEventName, args: (NamespaceData[TNamespace]["customEvents"] & ClientEvents)[TEventName]): void {
package/src/Events.ts CHANGED
@@ -1,10 +1,13 @@
1
1
  import { NamespaceEnums, NamespaceData } from "../generated/namespaceData";
2
2
  import { DBI } from "./DBI";
3
+ import { TDBIMessageCommandArgumentErrorTypes } from "./methods/handleMessageCommands";
3
4
  import { ClientEvents } from "./types/Event";
4
5
  import { IDBIBaseExecuteCtx, TDBIRateLimitTypes } from "./types/Interaction";
6
+ import { FakeMessageInteraction } from "./types/other/FakeMessageInteraction";
5
7
  import { DBILocale } from "./types/other/Locale";
8
+ import Discord from "discord.js";
6
9
 
7
- export type TDBIEventNames = "beforeInteraction" | "afterInteraction" | "interactionRateLimit" | "beforeEvent" | "afterEvent" | "interactionError" | "eventError";
10
+ export type TDBIEventNames = "beforeInteraction" | "afterInteraction" | "interactionRateLimit" | "beforeEvent" | "afterEvent" | "interactionError" | "eventError" | "messageCommandArgumentError";
8
11
 
9
12
  export type TDBIEventHandlerCtx<TNamespace extends NamespaceEnums> = {
10
13
  [K in keyof (ClientEvents & NamespaceData[TNamespace]["customEvents"])]: { other: Record<string, any>, locale?: { guild: DBILocale<TNamespace> }, eventName: K } & (ClientEvents & NamespaceData[TNamespace]["customEvents"])[K]
@@ -69,6 +72,12 @@ export class Events<TNamespace extends NamespaceEnums> {
69
72
  options?: { once: boolean }
70
73
  ): (() => any);
71
74
 
75
+ on(
76
+ eventName: "messageCommandArgumentError",
77
+ handler: (data: { message: Discord.Message, interaction: FakeMessageInteraction, error: { type: TDBIMessageCommandArgumentErrorTypes, option: any, index: number, extra?: any }, value: any }) => Promise<boolean> | boolean,
78
+ options?: { once: boolean }
79
+ ): (() => any);
80
+
72
81
  on(eventName: TDBIEventNames, handler: (data: any) => Promise<boolean> | boolean, options: { once: boolean } = { once: false }): (() => any) {
73
82
  if (!this.handlers.hasOwnProperty(eventName)) this.handlers[eventName] = [];
74
83
  if (options.once) {