djs-builder 0.5.42 → 0.6.0

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 (156) hide show
  1. package/README.md +140 -303
  2. package/function/function.js +236 -0
  3. package/function/log.js +736 -0
  4. package/handler/helper.js +277 -0
  5. package/handler/starter.js +335 -0
  6. package/package.json +10 -42
  7. package/.tsbuildinfo +0 -1
  8. package/dist/discord/builder/components/Buttons.d.ts +0 -22
  9. package/dist/discord/builder/components/Buttons.d.ts.map +0 -1
  10. package/dist/discord/builder/components/Buttons.js +0 -91
  11. package/dist/discord/builder/components/Buttons.js.map +0 -1
  12. package/dist/discord/builder/components/Menus.d.ts +0 -31
  13. package/dist/discord/builder/components/Menus.d.ts.map +0 -1
  14. package/dist/discord/builder/components/Menus.js +0 -82
  15. package/dist/discord/builder/components/Menus.js.map +0 -1
  16. package/dist/discord/builder/permissions/perms.d.ts +0 -6
  17. package/dist/discord/builder/permissions/perms.d.ts.map +0 -1
  18. package/dist/discord/builder/permissions/perms.js +0 -66
  19. package/dist/discord/builder/permissions/perms.js.map +0 -1
  20. package/dist/discord/builder/system/Pagination.d.ts +0 -68
  21. package/dist/discord/builder/system/Pagination.d.ts.map +0 -1
  22. package/dist/discord/builder/system/Pagination.js +0 -256
  23. package/dist/discord/builder/system/Pagination.js.map +0 -1
  24. package/dist/discord/builder/system/collectors.d.ts +0 -27
  25. package/dist/discord/builder/system/collectors.d.ts.map +0 -1
  26. package/dist/discord/builder/system/collectors.js +0 -137
  27. package/dist/discord/builder/system/collectors.js.map +0 -1
  28. package/dist/discord/builder/utils.d.ts +0 -5
  29. package/dist/discord/builder/utils.d.ts.map +0 -1
  30. package/dist/discord/builder/utils.js +0 -10
  31. package/dist/discord/builder/utils.js.map +0 -1
  32. package/dist/discord/events-handler/eventLoader.d.ts +0 -13
  33. package/dist/discord/events-handler/eventLoader.d.ts.map +0 -1
  34. package/dist/discord/events-handler/eventLoader.js +0 -169
  35. package/dist/discord/events-handler/eventLoader.js.map +0 -1
  36. package/dist/discord/events-handler/events.d.ts +0 -8
  37. package/dist/discord/events-handler/events.d.ts.map +0 -1
  38. package/dist/discord/events-handler/events.js +0 -186
  39. package/dist/discord/events-handler/events.js.map +0 -1
  40. package/dist/discord/events-handler/login.d.ts +0 -9
  41. package/dist/discord/events-handler/login.d.ts.map +0 -1
  42. package/dist/discord/events-handler/login.js +0 -273
  43. package/dist/discord/events-handler/login.js.map +0 -1
  44. package/dist/discord/events-handler/prefix-register.d.ts +0 -23
  45. package/dist/discord/events-handler/prefix-register.d.ts.map +0 -1
  46. package/dist/discord/events-handler/prefix-register.js +0 -109
  47. package/dist/discord/events-handler/prefix-register.js.map +0 -1
  48. package/dist/discord/events-handler/prefix-responder.d.ts +0 -5
  49. package/dist/discord/events-handler/prefix-responder.d.ts.map +0 -1
  50. package/dist/discord/events-handler/prefix-responder.js +0 -155
  51. package/dist/discord/events-handler/prefix-responder.js.map +0 -1
  52. package/dist/discord/events-handler/prefixLoader.d.ts +0 -7
  53. package/dist/discord/events-handler/prefixLoader.d.ts.map +0 -1
  54. package/dist/discord/events-handler/prefixLoader.js +0 -74
  55. package/dist/discord/events-handler/prefixLoader.js.map +0 -1
  56. package/dist/discord/events-handler/slash-register.d.ts +0 -4
  57. package/dist/discord/events-handler/slash-register.d.ts.map +0 -1
  58. package/dist/discord/events-handler/slash-register.js +0 -85
  59. package/dist/discord/events-handler/slash-register.js.map +0 -1
  60. package/dist/discord/events-handler/slash-responder.d.ts +0 -3
  61. package/dist/discord/events-handler/slash-responder.d.ts.map +0 -1
  62. package/dist/discord/events-handler/slash-responder.js +0 -112
  63. package/dist/discord/events-handler/slash-responder.js.map +0 -1
  64. package/dist/discord/events-handler/slashLoader.d.ts +0 -7
  65. package/dist/discord/events-handler/slashLoader.d.ts.map +0 -1
  66. package/dist/discord/events-handler/slashLoader.js +0 -94
  67. package/dist/discord/events-handler/slashLoader.js.map +0 -1
  68. package/dist/discord/events-handler/starter.d.ts +0 -6
  69. package/dist/discord/events-handler/starter.d.ts.map +0 -1
  70. package/dist/discord/events-handler/starter.js +0 -85
  71. package/dist/discord/events-handler/starter.js.map +0 -1
  72. package/dist/discord/functions/anticrash.d.ts +0 -3
  73. package/dist/discord/functions/anticrash.d.ts.map +0 -1
  74. package/dist/discord/functions/anticrash.js +0 -55
  75. package/dist/discord/functions/anticrash.js.map +0 -1
  76. package/dist/discord/functions/devLogs.d.ts +0 -2
  77. package/dist/discord/functions/devLogs.d.ts.map +0 -1
  78. package/dist/discord/functions/devLogs.js +0 -137
  79. package/dist/discord/functions/devLogs.js.map +0 -1
  80. package/dist/discord/functions/logger.d.ts +0 -5
  81. package/dist/discord/functions/logger.d.ts.map +0 -1
  82. package/dist/discord/functions/logger.js +0 -57
  83. package/dist/discord/functions/logger.js.map +0 -1
  84. package/dist/discord/functions/mongoDb.d.ts +0 -4
  85. package/dist/discord/functions/mongoDb.d.ts.map +0 -1
  86. package/dist/discord/functions/mongoDb.js +0 -39
  87. package/dist/discord/functions/mongoDb.js.map +0 -1
  88. package/dist/discord/functions/similarity.d.ts +0 -3
  89. package/dist/discord/functions/similarity.d.ts.map +0 -1
  90. package/dist/discord/functions/similarity.js +0 -56
  91. package/dist/discord/functions/similarity.js.map +0 -1
  92. package/dist/discord/functions/terminal.d.ts +0 -2
  93. package/dist/discord/functions/terminal.d.ts.map +0 -1
  94. package/dist/discord/functions/terminal.js +0 -127
  95. package/dist/discord/functions/terminal.js.map +0 -1
  96. package/dist/discord/functions/utils.d.ts +0 -5
  97. package/dist/discord/functions/utils.d.ts.map +0 -1
  98. package/dist/discord/functions/utils.js +0 -11
  99. package/dist/discord/functions/utils.js.map +0 -1
  100. package/dist/discord/functions/versedb.d.ts +0 -3
  101. package/dist/discord/functions/versedb.d.ts.map +0 -1
  102. package/dist/discord/functions/versedb.js +0 -21
  103. package/dist/discord/functions/versedb.js.map +0 -1
  104. package/dist/discord/games/X-O.d.ts +0 -20
  105. package/dist/discord/games/X-O.d.ts.map +0 -1
  106. package/dist/discord/games/X-O.js +0 -166
  107. package/dist/discord/games/X-O.js.map +0 -1
  108. package/dist/discord/games/rps.d.ts +0 -21
  109. package/dist/discord/games/rps.d.ts.map +0 -1
  110. package/dist/discord/games/rps.js +0 -99
  111. package/dist/discord/games/rps.js.map +0 -1
  112. package/dist/discord/types/starter.d.ts +0 -144
  113. package/dist/discord/types/starter.d.ts.map +0 -1
  114. package/dist/discord/types/starter.js +0 -3
  115. package/dist/discord/types/starter.js.map +0 -1
  116. package/dist/discord/types/utils.d.ts +0 -3
  117. package/dist/discord/types/utils.d.ts.map +0 -1
  118. package/dist/discord/types/utils.js +0 -3
  119. package/dist/discord/types/utils.js.map +0 -1
  120. package/dist/discord/utils.d.ts +0 -15
  121. package/dist/discord/utils.d.ts.map +0 -1
  122. package/dist/discord/utils.js +0 -41
  123. package/dist/discord/utils.js.map +0 -1
  124. package/dist/index.d.ts +0 -4
  125. package/dist/index.d.ts.map +0 -1
  126. package/dist/index.js +0 -71
  127. package/dist/index.js.map +0 -1
  128. package/lib/discord/builder/components/Buttons.ts +0 -123
  129. package/lib/discord/builder/components/Menus.ts +0 -106
  130. package/lib/discord/builder/permissions/perms.ts +0 -66
  131. package/lib/discord/builder/system/Pagination.ts +0 -374
  132. package/lib/discord/builder/system/collectors.ts +0 -197
  133. package/lib/discord/builder/utils.ts +0 -9
  134. package/lib/discord/events-handler/eventLoader.ts +0 -166
  135. package/lib/discord/events-handler/events.ts +0 -160
  136. package/lib/discord/events-handler/login.ts +0 -265
  137. package/lib/discord/events-handler/prefix-register.ts +0 -117
  138. package/lib/discord/events-handler/prefix-responder.ts +0 -176
  139. package/lib/discord/events-handler/prefixLoader.ts +0 -83
  140. package/lib/discord/events-handler/slash-register.ts +0 -81
  141. package/lib/discord/events-handler/slash-responder.ts +0 -136
  142. package/lib/discord/events-handler/slashLoader.ts +0 -104
  143. package/lib/discord/events-handler/starter.ts +0 -85
  144. package/lib/discord/functions/anticrash.ts +0 -60
  145. package/lib/discord/functions/devLogs.ts +0 -128
  146. package/lib/discord/functions/logger.ts +0 -58
  147. package/lib/discord/functions/mongoDb.ts +0 -38
  148. package/lib/discord/functions/similarity.ts +0 -70
  149. package/lib/discord/functions/terminal.ts +0 -162
  150. package/lib/discord/functions/utils.ts +0 -4
  151. package/lib/discord/functions/versedb.ts +0 -17
  152. package/lib/discord/types/starter.ts +0 -158
  153. package/lib/discord/types/utils.ts +0 -2
  154. package/lib/discord/utils.ts +0 -17
  155. package/lib/index.ts +0 -37
  156. package/tsconfig.json +0 -21
@@ -1,374 +0,0 @@
1
- import {
2
- ButtonBuilder,
3
- ActionRowBuilder,
4
- EmbedBuilder,
5
- Message,
6
- MessageComponentInteraction,
7
- MessageActionRowComponentBuilder,
8
- ButtonStyle,
9
- StringSelectMenuBuilder,
10
- } from "discord.js";
11
-
12
- interface PagerOptions {
13
- firstLast?: boolean;
14
- deleteOption?: boolean;
15
- otherComponents?: ActionRowBuilder<MessageActionRowComponentBuilder>[];
16
- home?: {
17
- home_Option?: boolean;
18
- home_page?: number;
19
- };
20
- timeOption?: {
21
- timeOut?: number;
22
- disable?: boolean;
23
- deletes?: boolean;
24
- custom?: (() => void);
25
- };
26
- user_only?: {
27
- user_status?: boolean;
28
- reply?: string;
29
- };
30
- style?: {
31
- nextAndBack?: ButtonStyle;
32
- firstAndLast?: ButtonStyle;
33
- homeStyle?: ButtonStyle;
34
- deleteStyle?: ButtonStyle;
35
- };
36
- label?: {
37
- labelNext?: string | null;
38
- labelBack?: string | null;
39
- labelFirst?: string | null;
40
- labelLast?: string | null;
41
- labelHome?: string | null;
42
- labelDelete?: string | null;
43
- };
44
- emoji?: {
45
- emojiNext?: string;
46
- emojiBack?: string;
47
- emojiFirst?: string;
48
- emojiLast?: string;
49
- emojiHome?: string;
50
- emojiDelete?: string;
51
- };
52
- pages?: {
53
- embeds?: EmbedBuilder[];
54
- attachment?: (string | Buffer)[];
55
- content?: string[];
56
- };
57
- navigationMenu?: {
58
- enabled?: boolean;
59
- placeHolder?: string;
60
- selects?: string[];
61
- };
62
- }
63
-
64
- const CUSTOM_IDS = {
65
- NEXT: "next-discobase",
66
- BACK: "back-discobase",
67
- FIRST: "first-discobase",
68
- LAST: "last-discobase",
69
- DELETE: "delete-discobase",
70
- HOME: "home-discobase",
71
- SELECT: "select-discobase"
72
- };
73
-
74
- const VALID_BUTTON_STYLES = [
75
- ButtonStyle.Primary,
76
- ButtonStyle.Secondary,
77
- ButtonStyle.Success,
78
- ButtonStyle.Danger
79
- ];
80
-
81
- const isValidEmoji = (emoji: string | undefined): boolean => {
82
- if (!emoji) return true; // No emoji is valid.
83
-
84
- const unicodeEmojiPattern = /[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F700}-\u{1F77F}\u{1F780}-\u{1F7FF}\u{1F800}-\u{1F8FF}\u{1F900}-\u{1F9FF}\u{1FA00}-\u{1FA6F}\u{1FA70}-\u{1FAFF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{2300}-\u{23FF}\u{2B50}\u{2934}\u{2935}\u{3030}\u{20E3}\u{FE0F}]/u;
85
- const discordCustomEmojiPattern = /^<:[a-zA-Z0-9_]+:[0-9]+>$/;
86
- return unicodeEmojiPattern.test(emoji) || discordCustomEmojiPattern.test(emoji);
87
- };
88
-
89
- export class Pagination {
90
- private message: Message;
91
- private options: Required<PagerOptions>;
92
- private buttons: ButtonBuilder[];
93
- private components: ActionRowBuilder<MessageActionRowComponentBuilder>[];
94
- private naw_page: number = 0;
95
-
96
- constructor(message: Message, options: PagerOptions) {
97
- this.message = message;
98
- this.options = {
99
- firstLast: false,
100
- deleteOption: false,
101
- otherComponents: [],
102
- home: { home_Option: false, home_page: 0 },
103
- timeOption: { timeOut: 86400000, disable: false, deletes: false, custom: undefined },
104
- user_only: { user_status: false, reply: "You are not the command owner" },
105
- style: { nextAndBack: ButtonStyle.Primary, firstAndLast: ButtonStyle.Secondary, homeStyle: ButtonStyle.Success, deleteStyle: ButtonStyle.Danger },
106
- label: {},
107
- emoji: { emojiNext: "➡️", emojiBack: "⬅️", emojiFirst: "⏪", emojiLast: "⏩", emojiHome: "🏠", emojiDelete: "🗑️" },
108
- pages: { embeds: [], attachment: [], content: [] },
109
- navigationMenu: { enabled: false, placeHolder: "Choose a page", selects: [] },
110
- ...options,
111
- };
112
-
113
- this.validateOptions();
114
- this.buttons = this.createButtons();
115
- this.components = this.createComponents();
116
- }
117
-
118
- private validateOptions() {
119
- const { emoji } = this.options;
120
- const emojiValues = Object.values(emoji);
121
-
122
- if (emojiValues.some(e => e && !isValidEmoji(e))) {
123
- throw new Error("Invalid emoji format. Must be Unicode emojis, valid emoji IDs, or empty.");
124
- }
125
-
126
- const { style } = this.options;
127
- if (!Object.values(style).every(style => VALID_BUTTON_STYLES.includes(style))) {
128
- throw new Error("Invalid button style. Must be one of the predefined ButtonStyle values.");
129
- }
130
-
131
- if (this.options.deleteOption && this.options.home?.home_Option) {
132
- throw new Error("You can't use 'home' and 'delete' together.");
133
- }
134
-
135
- if (this.options.timeOption?.disable && this.options.timeOption?.deletes) {
136
- throw new Error("You can't use 'disable' and 'deletes' together.");
137
- }
138
- }
139
-
140
- private createButtons(): ButtonBuilder[] {
141
- const {
142
- nextAndBack,
143
- firstAndLast,
144
- homeStyle,
145
- deleteStyle,
146
- } = this.options.style;
147
-
148
- const {
149
- emojiNext,
150
- emojiBack,
151
- emojiFirst,
152
- emojiLast,
153
- emojiHome,
154
- emojiDelete,
155
- } = this.options.emoji;
156
-
157
- const next = new ButtonBuilder().setCustomId(CUSTOM_IDS.NEXT).setStyle(nextAndBack!);
158
- if (emojiNext) next.setEmoji(emojiNext);
159
-
160
- const back = new ButtonBuilder().setCustomId(CUSTOM_IDS.BACK).setStyle(nextAndBack!);
161
- if (emojiBack) back.setEmoji(emojiBack);
162
-
163
- const first = new ButtonBuilder().setCustomId(CUSTOM_IDS.FIRST).setStyle(firstAndLast!);
164
- if (emojiFirst) first.setEmoji(emojiFirst);
165
-
166
- const last = new ButtonBuilder().setCustomId(CUSTOM_IDS.LAST).setStyle(firstAndLast!);
167
- if (emojiLast) last.setEmoji(emojiLast);
168
-
169
- const home = new ButtonBuilder().setCustomId(CUSTOM_IDS.HOME).setStyle(homeStyle!);
170
- if (emojiHome) home.setEmoji(emojiHome);
171
-
172
- const deleteBtn = new ButtonBuilder().setCustomId(CUSTOM_IDS.DELETE).setStyle(deleteStyle!);
173
- if (emojiDelete) deleteBtn.setEmoji(emojiDelete);
174
-
175
- const {
176
- labelNext,
177
- labelBack,
178
- labelFirst,
179
- labelLast,
180
- labelHome,
181
- labelDelete,
182
- } = this.options.label;
183
-
184
- if (labelNext) next.setLabel(labelNext);
185
- if (labelBack) back.setLabel(labelBack);
186
- if (labelFirst) first.setLabel(labelFirst);
187
- if (labelLast) last.setLabel(labelLast);
188
- if (labelHome) home.setLabel(labelHome);
189
- if (labelDelete) deleteBtn.setLabel(labelDelete);
190
-
191
- const buttons: ButtonBuilder[] = [];
192
-
193
- if (this.options.firstLast) {
194
- buttons.push(first);
195
- }
196
-
197
- buttons.push(back);
198
-
199
- if (this.options.home?.home_Option) {
200
- buttons.push(home);
201
- if (this.options.firstLast) {
202
- buttons.push(next);
203
- buttons.push(last);
204
- } else {
205
- buttons.push(next);
206
- }
207
- } else {
208
- if (this.options.deleteOption) {
209
- buttons.push(deleteBtn);
210
- }
211
-
212
- buttons.push(next);
213
-
214
- if (this.options.firstLast) {
215
- buttons.push(last);
216
- }
217
- }
218
-
219
-
220
- if (!this.options.firstLast) {
221
- buttons.push(last);
222
- }
223
-
224
- return buttons;
225
- }
226
-
227
-
228
- private createComponents(): ActionRowBuilder<MessageActionRowComponentBuilder>[] {
229
- const actionRow = new ActionRowBuilder<MessageActionRowComponentBuilder>().addComponents(this.buttons);
230
- const components = [actionRow, ...this.options.otherComponents];
231
-
232
- if (this.options.navigationMenu?.enabled) {
233
- const menuOptions = this.options.navigationMenu.selects!.map((select, index) => ({
234
- label: `Page ${index + 1}`,
235
- description: select,
236
- value: `${index}`,
237
- }));
238
-
239
- const selectMenu = new StringSelectMenuBuilder()
240
- .setCustomId(CUSTOM_IDS.SELECT)
241
- .setPlaceholder(this.options.navigationMenu.placeHolder || "Select a page")
242
- .addOptions(menuOptions);
243
-
244
- const row = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(selectMenu);
245
- components.push(row);
246
- }
247
-
248
- return components;
249
- }
250
-
251
- public async send() {
252
- const { embeds = [], content = [], attachment = [] } = this.options.pages || {};
253
-
254
- const safeEmbeds = embeds ?? [];
255
-
256
- if (safeEmbeds.length === 0) {
257
- throw new Error("No embeds provided.");
258
- }
259
-
260
- try {
261
- const msg = await this.message.reply({
262
- embeds: [safeEmbeds[0]],
263
- content: content[0] || "",
264
- files: attachment[0] ? [attachment[0]] : undefined,
265
- components: this.components,
266
- });
267
-
268
- this.handleInteraction(msg);
269
- } catch (error) {
270
- console.error("Failed to send message:", error);
271
- }
272
- }
273
-
274
-
275
-
276
- private async handleInteraction(msg: Message) {
277
- const filter = (i: MessageComponentInteraction) => i.user.id === this.message.author.id;
278
-
279
- const collector = msg.createMessageComponentCollector({ filter, time: this.options.timeOption?.timeOut || 60000 });
280
-
281
- collector.on("collect", async (interaction: MessageComponentInteraction) => {
282
- try {
283
- const embedsLength = this.options.pages.embeds?.length || 0;
284
-
285
- // Handle interaction based on its type
286
- if (interaction.isButton()) {
287
- switch (interaction.customId) {
288
- case CUSTOM_IDS.NEXT:
289
- this.naw_page = (this.naw_page + 1) % embedsLength;
290
- break;
291
- case CUSTOM_IDS.BACK:
292
- this.naw_page = (this.naw_page - 1 + embedsLength) % embedsLength;
293
- break;
294
- case CUSTOM_IDS.FIRST:
295
- this.naw_page = 0;
296
- break;
297
- case CUSTOM_IDS.LAST:
298
- this.naw_page = embedsLength - 1;
299
- break;
300
- case CUSTOM_IDS.DELETE:
301
- await interaction.deferUpdate();
302
- await msg.delete();
303
- collector.stop();
304
- return;
305
- case CUSTOM_IDS.HOME:
306
- this.naw_page = this.options.home?.home_page || 0;
307
- break;
308
- default:
309
- break;
310
- }
311
- } else if (interaction.isStringSelectMenu()) {
312
- if (interaction.customId === CUSTOM_IDS.SELECT) {
313
- this.naw_page = Number(interaction.values[0]);
314
- }
315
- }
316
-
317
- await interaction.deferUpdate();
318
- await this.updateMessage(msg);
319
- } catch (error) {
320
- console.error("Interaction error:", error);
321
- }
322
- });
323
-
324
- collector.on("end", async () => {
325
- try {
326
- const fetchedMsg = await this.message.channel.messages.fetch(msg.id);
327
-
328
- if (this.options.timeOption?.disable) {
329
- const disabledButtons = this.buttons.map(button =>
330
- button.setDisabled(true)
331
- );
332
-
333
- const menuOptions: { label: string; description?: string; value: string }[] =
334
- this.options.navigationMenu?.selects?.map((select, index) => ({
335
- label: `Page ${index + 1}`,
336
- description: select,
337
- value: `${index}`,
338
- })) || [];
339
-
340
- const disabledComponents = new ActionRowBuilder<MessageActionRowComponentBuilder>().addComponents(disabledButtons);
341
- const newComponents = [disabledComponents, ...this.options.otherComponents];
342
-
343
- if (this.options.navigationMenu?.enabled) {
344
- const selectMenu = new StringSelectMenuBuilder()
345
- .setCustomId(CUSTOM_IDS.SELECT)
346
- .setPlaceholder(this.options.navigationMenu.placeHolder || "Select a page")
347
- .addOptions(menuOptions)
348
- .setDisabled(true);
349
-
350
- const row = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(selectMenu);
351
- newComponents.push(row);
352
- }
353
-
354
- await fetchedMsg.edit({ components: newComponents });
355
- }
356
-
357
- if (this.options.timeOption?.deletes) {
358
- await fetchedMsg.delete();
359
- }
360
- } catch (error: any) {}
361
- });
362
- }
363
-
364
- private async updateMessage(msg: Message) {
365
- const { embeds = [], content = [], attachment = [] } = this.options.pages || {};
366
-
367
- await msg.edit({
368
- embeds: [embeds[this.naw_page]],
369
- content: content[this.naw_page] || "",
370
- files: attachment[this.naw_page] ? [attachment[this.naw_page]] : undefined,
371
- components: this.components,
372
- });
373
- }
374
- }
@@ -1,197 +0,0 @@
1
- import {
2
- Message,
3
- Interaction,
4
- MessageCollector,
5
- InteractionCollector,
6
- CollectorFilter,
7
- Snowflake,
8
- ReadonlyCollection,
9
- CommandInteraction,
10
- ButtonInteraction,
11
- MessageReaction,
12
- ModalSubmitInteraction,
13
- StringSelectMenuInteraction,
14
- UserSelectMenuInteraction,
15
- RoleSelectMenuInteraction,
16
- ContextMenuCommandInteraction,
17
- Collector,
18
- } from 'discord.js';
19
-
20
- type EventSource = Message | CommandInteraction | ButtonInteraction | MessageReaction | Interaction;
21
-
22
- const collectorCache: Map<string, any> = new Map();
23
-
24
- /**
25
- * @param sources - The event source(s) (message, interaction, reaction, etc.) to collect from.
26
- * @param options - Custom options for collection (time, filter, max, idle).
27
- * @param events - Custom event handlers for `onCollect`, `onEnd`, `onError`, etc.
28
- */
29
- function Djs_Collectors<T extends EventSource>(
30
- sources: T | T[],
31
- options: {
32
- time?: number;
33
- filter?: CollectorFilter<[T]>;
34
- max?: number;
35
- idle?: number;
36
- log?: boolean;
37
- throttle?: number;
38
- uniqueId?: string;
39
- },
40
- events: {
41
- onCollect: (collectedItem: T, meta?: Record<string, any>) => void;
42
- onEnd?: (collected: ReadonlyCollection<Snowflake, T>, reason: string) => void;
43
- onError?: (error: Error) => void;
44
- onDispose?: (disposedItem: T) => void;
45
- onTimeout?: () => void;
46
- onStart?: () => void;
47
- },
48
- metadata?: Record<string, any>
49
- ): { stop: (reason?: string) => void } {
50
- const eventSources = Array.isArray(sources) ? sources : [sources];
51
- const filter: CollectorFilter<[T]> = options.filter || (() => true);
52
- const time: number = options.time || 60000;
53
-
54
- if (events.onStart) events.onStart();
55
-
56
- if (options.uniqueId && collectorCache.has(options.uniqueId)) {
57
- console.warn(`Collector with unique ID "${options.uniqueId}" is already active. Skipping creation.`);
58
- return { stop: () => {} };
59
- }
60
-
61
- if (options.uniqueId) {
62
- collectorCache.set(options.uniqueId, { sources: eventSources, time, max: options.max, idle: options.idle });
63
- }
64
-
65
- const collectors: any[] = [];
66
-
67
- for (const source of eventSources) {
68
- if (source instanceof Message) {
69
- const messageCollector = new MessageCollector(source.channel, {
70
- filter: filter as CollectorFilter<[Message]>,
71
- time,
72
- max: options.max,
73
- idle: options.idle,
74
- });
75
-
76
- collectors.push(messageCollector); // Store reference
77
- handleCollector(messageCollector, events, options, metadata);
78
-
79
- } else if (
80
- source instanceof CommandInteraction ||
81
- source instanceof ButtonInteraction ||
82
- source instanceof StringSelectMenuInteraction ||
83
- source instanceof UserSelectMenuInteraction ||
84
- source instanceof RoleSelectMenuInteraction ||
85
- source instanceof ContextMenuCommandInteraction ||
86
- source instanceof ModalSubmitInteraction
87
- ) {
88
- if (!source.client.isReady()) {
89
- throw new Error('Client is not ready. Please ensure the client is logged in and ready before creating a collector.');
90
- }
91
-
92
- const interactionCollector = new InteractionCollector(source.client, {
93
- filter: filter as CollectorFilter<[Interaction]>,
94
- time,
95
- max: options.max,
96
- idle: options.idle,
97
- });
98
-
99
- collectors.push(interactionCollector);
100
- handleCollector(interactionCollector, events, options, metadata);
101
-
102
- } else if (source instanceof MessageReaction) {
103
- const reactionCollector = source.message.createReactionCollector({
104
- filter: filter as CollectorFilter<[MessageReaction]>,
105
- time,
106
- max: options.max,
107
- idle: options.idle,
108
- });
109
-
110
- collectors.push(reactionCollector);
111
- handleCollector(reactionCollector, events, options, metadata);
112
-
113
- } else {
114
- throw new Error("Source must be either a Message, Interaction, or Reaction.");
115
- }
116
- }
117
-
118
- return {
119
- stop: (reason: string = 'manual') => {
120
- if (options.uniqueId) {
121
- const cached = collectorCache.get(options.uniqueId);
122
- if (cached) {
123
- collectors.forEach((collector) => collector.stop(reason));
124
- collectorCache.delete(options.uniqueId);
125
- console.log(`Collector with unique ID "${options.uniqueId}" has been ended. Reason: ${reason}`);
126
- } else {
127
- console.warn(`No collector found with unique ID "${options.uniqueId}".`);
128
- }
129
- } else {
130
- collectors.forEach((collector) => collector.stop(reason));
131
- console.log(`Collectors have been ended. Reason: ${reason}`);
132
- }
133
- },
134
- };
135
- }
136
-
137
- /**
138
- * Generic function to handle a collector's events and lifecycle.
139
- * @param collector - The specific collector (MessageCollector, InteractionCollector, etc.).
140
- * @param events - The event handlers for collection lifecycle.
141
- * @param options - Additional collection options.
142
- * @param metadata - Optional metadata attached to each collected item.
143
- */
144
- function handleCollector<T>(
145
- collector: any,
146
- events: {
147
- onCollect: (collectedItem: T, meta?: Record<string, any>) => void;
148
- onEnd?: (collected: ReadonlyCollection<Snowflake, T>, reason: string) => void;
149
- onError?: (error: Error) => void;
150
- onDispose?: (disposedItem: T) => void;
151
- onTimeout?: () => void;
152
- },
153
- options: { log?: boolean; throttle?: number; uniqueId?: string },
154
- metadata?: Record<string, any>
155
- ) {
156
- let lastCollectedTime = 0;
157
-
158
- collector.on('collect', (collectedItem: T) => {
159
- const now = Date.now();
160
- if (options.throttle && now - lastCollectedTime < options.throttle) {
161
- if (options.log) console.warn(`Throttled collect for ${collectedItem}`);
162
- return;
163
- }
164
- lastCollectedTime = now;
165
-
166
- if (options.log) console.log('Collected item:', collectedItem);
167
- events.onCollect(collectedItem, metadata);
168
- });
169
-
170
- collector.on('end', (collected: ReadonlyCollection<Snowflake, T>, reason: string) => {
171
- if (options.log) console.log(`Collector ended. Reason: ${reason}`);
172
- if (events.onEnd) events.onEnd(collected, reason);
173
- if (reason === 'time' && events.onTimeout) {
174
- events.onTimeout();
175
- }
176
-
177
- if (options.uniqueId) {
178
- collectorCache.delete(options.uniqueId);
179
- }
180
- });
181
-
182
- if (events.onError) {
183
- collector.on('error', (error: Error) => {
184
- if (options.log) console.error('Collector error:', error);
185
- (events.onError as (error: Error) => void)(error);
186
- });
187
- }
188
-
189
- if (events.onDispose) {
190
- collector.on('dispose', (disposedItem: T) => {
191
- if (options.log) console.log('Disposed item:', disposedItem);
192
- (events.onDispose as (disposedItem: T) => void)(disposedItem);
193
- });
194
- }
195
- }
196
-
197
- export { Djs_Collectors };
@@ -1,9 +0,0 @@
1
- import { ButtonManager } from './components/Buttons';
2
- import { MenuManager } from './components/Menus';
3
- import { PermissionChecker } from './permissions/perms';
4
-
5
- export {
6
- ButtonManager,
7
- MenuManager,
8
- PermissionChecker
9
- };