trivious 1.3.24 → 1.3.26

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 (129) hide show
  1. package/dist/core/client/trivious.client.cjs +90 -0
  2. package/dist/core/client/trivious.client.cjs.map +1 -0
  3. package/dist/core/client/trivious.client.d.cts +3 -0
  4. package/dist/core/client/trivious.client.d.ts +3 -0
  5. package/dist/core/client/trivious.client.js +88 -0
  6. package/dist/core/client/trivious.client.js.map +1 -0
  7. package/dist/core/commands/command.base.cjs +307 -0
  8. package/dist/core/commands/command.base.cjs.map +1 -0
  9. package/dist/core/commands/command.base.d.cts +3 -0
  10. package/dist/core/commands/command.base.d.ts +3 -0
  11. package/dist/core/commands/command.base.js +299 -0
  12. package/dist/core/commands/command.base.js.map +1 -0
  13. package/dist/core/commands/subcommand.base.cjs +96 -0
  14. package/dist/core/commands/subcommand.base.cjs.map +1 -0
  15. package/dist/core/commands/subcommand.base.d.cts +3 -0
  16. package/dist/core/commands/subcommand.base.d.ts +3 -0
  17. package/dist/core/commands/subcommand.base.js +91 -0
  18. package/dist/core/commands/subcommand.base.js.map +1 -0
  19. package/dist/core/components/component.base.cjs +111 -0
  20. package/dist/core/components/component.base.cjs.map +1 -0
  21. package/dist/core/components/component.base.d.cts +3 -0
  22. package/dist/core/components/component.base.d.ts +3 -0
  23. package/dist/core/components/component.base.js +106 -0
  24. package/dist/core/components/component.base.js.map +1 -0
  25. package/dist/core/events/clientReady.cjs +12 -0
  26. package/dist/core/events/clientReady.cjs.map +1 -0
  27. package/dist/core/events/clientReady.d.cts +10 -0
  28. package/dist/core/events/clientReady.d.ts +10 -0
  29. package/dist/core/events/clientReady.js +10 -0
  30. package/dist/core/events/clientReady.js.map +1 -0
  31. package/dist/core/events/interactionCreate.cjs +70 -0
  32. package/dist/core/events/interactionCreate.cjs.map +1 -0
  33. package/dist/core/events/interactionCreate.d.cts +10 -0
  34. package/dist/core/events/interactionCreate.d.ts +10 -0
  35. package/dist/core/events/interactionCreate.js +68 -0
  36. package/dist/core/events/interactionCreate.js.map +1 -0
  37. package/dist/core/registry/command.registry.cjs +60 -0
  38. package/dist/core/registry/command.registry.cjs.map +1 -0
  39. package/dist/core/registry/command.registry.d.cts +3 -0
  40. package/dist/core/registry/command.registry.d.ts +3 -0
  41. package/dist/core/registry/command.registry.js +54 -0
  42. package/dist/core/registry/command.registry.js.map +1 -0
  43. package/dist/core/registry/component.registry.cjs +46 -0
  44. package/dist/core/registry/component.registry.cjs.map +1 -0
  45. package/dist/core/registry/component.registry.d.cts +3 -0
  46. package/dist/core/registry/component.registry.d.ts +3 -0
  47. package/dist/core/registry/component.registry.js +40 -0
  48. package/dist/core/registry/component.registry.js.map +1 -0
  49. package/dist/core/registry/event.registry.cjs +77 -0
  50. package/dist/core/registry/event.registry.cjs.map +1 -0
  51. package/dist/core/registry/event.registry.d.cts +3 -0
  52. package/dist/core/registry/event.registry.d.ts +3 -0
  53. package/dist/core/registry/event.registry.js +71 -0
  54. package/dist/core/registry/event.registry.js.map +1 -0
  55. package/dist/core/registry/index.cjs +49 -0
  56. package/dist/core/registry/index.cjs.map +1 -0
  57. package/dist/core/registry/index.d.cts +19 -0
  58. package/dist/core/registry/index.d.ts +19 -0
  59. package/dist/core/registry/index.js +39 -0
  60. package/dist/core/registry/index.js.map +1 -0
  61. package/dist/core/registry/module.registry.cjs +61 -0
  62. package/dist/core/registry/module.registry.cjs.map +1 -0
  63. package/dist/core/registry/module.registry.d.cts +3 -0
  64. package/dist/core/registry/module.registry.d.ts +3 -0
  65. package/dist/core/registry/module.registry.js +55 -0
  66. package/dist/core/registry/module.registry.js.map +1 -0
  67. package/dist/index-5IsAwOsi.d.ts +940 -0
  68. package/dist/index-BjPKCNAw.d.cts +940 -0
  69. package/dist/index.cjs +65 -1403
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.d.cts +3 -987
  72. package/dist/index.d.ts +3 -987
  73. package/dist/index.js +9 -1392
  74. package/dist/index.js.map +1 -1
  75. package/dist/shared/typings/client.cjs +4 -0
  76. package/dist/shared/typings/client.cjs.map +1 -0
  77. package/dist/shared/typings/client.d.cts +3 -0
  78. package/dist/shared/typings/client.d.ts +3 -0
  79. package/dist/shared/typings/client.js +3 -0
  80. package/dist/shared/typings/client.js.map +1 -0
  81. package/dist/shared/typings/commands.cjs +4 -0
  82. package/dist/shared/typings/commands.cjs.map +1 -0
  83. package/dist/shared/typings/commands.d.cts +3 -0
  84. package/dist/shared/typings/commands.d.ts +3 -0
  85. package/dist/shared/typings/commands.js +3 -0
  86. package/dist/shared/typings/commands.js.map +1 -0
  87. package/dist/shared/typings/components.cjs +22 -0
  88. package/dist/shared/typings/components.cjs.map +1 -0
  89. package/dist/shared/typings/components.d.cts +3 -0
  90. package/dist/shared/typings/components.d.ts +3 -0
  91. package/dist/shared/typings/components.js +19 -0
  92. package/dist/shared/typings/components.js.map +1 -0
  93. package/dist/shared/typings/events.cjs +4 -0
  94. package/dist/shared/typings/events.cjs.map +1 -0
  95. package/dist/shared/typings/events.d.cts +3 -0
  96. package/dist/shared/typings/events.d.ts +3 -0
  97. package/dist/shared/typings/events.js +3 -0
  98. package/dist/shared/typings/events.js.map +1 -0
  99. package/dist/shared/typings/index.cjs +56 -0
  100. package/dist/shared/typings/index.cjs.map +1 -0
  101. package/dist/shared/typings/index.d.cts +3 -0
  102. package/dist/shared/typings/index.d.ts +3 -0
  103. package/dist/shared/typings/index.js +9 -0
  104. package/dist/shared/typings/index.js.map +1 -0
  105. package/dist/shared/typings/module.cjs +4 -0
  106. package/dist/shared/typings/module.cjs.map +1 -0
  107. package/dist/shared/typings/module.d.cts +3 -0
  108. package/dist/shared/typings/module.d.ts +3 -0
  109. package/dist/shared/typings/module.js +3 -0
  110. package/dist/shared/typings/module.js.map +1 -0
  111. package/dist/shared/typings/permissions.cjs +22 -0
  112. package/dist/shared/typings/permissions.cjs.map +1 -0
  113. package/dist/shared/typings/permissions.d.cts +3 -0
  114. package/dist/shared/typings/permissions.d.ts +3 -0
  115. package/dist/shared/typings/permissions.js +19 -0
  116. package/dist/shared/typings/permissions.js.map +1 -0
  117. package/dist/shared/typings/registry.cjs +63 -0
  118. package/dist/shared/typings/registry.cjs.map +1 -0
  119. package/dist/shared/typings/registry.d.cts +51 -0
  120. package/dist/shared/typings/registry.d.ts +51 -0
  121. package/dist/shared/typings/registry.js +61 -0
  122. package/dist/shared/typings/registry.js.map +1 -0
  123. package/dist/shared/utility/functions.cjs +80 -0
  124. package/dist/shared/utility/functions.cjs.map +1 -0
  125. package/dist/shared/utility/functions.d.cts +56 -0
  126. package/dist/shared/utility/functions.d.ts +56 -0
  127. package/dist/shared/utility/functions.js +73 -0
  128. package/dist/shared/utility/functions.js.map +1 -0
  129. package/package.json +1 -1
@@ -0,0 +1,299 @@
1
+ import { SlashCommandBuilder, ContextMenuCommandBuilder, Collection, InteractionContextType } from 'discord.js';
2
+ import { PermissionLevel } from '../../shared/typings/index.js';
3
+ import { hasPermission } from '../../shared/utility/functions.js';
4
+
5
+ class Command {
6
+ /**
7
+ * Returns whether the command is a SlashCommand.
8
+ *
9
+ * @public
10
+ * @param {Command} this
11
+ * @returns {this is SlashCommand}
12
+ */
13
+ isSlashCommand() {
14
+ return this.data instanceof SlashCommandBuilder && this instanceof SlashCommand;
15
+ }
16
+ /**
17
+ * Returns whether the command is a ContextMenuCommand.
18
+ *
19
+ * @public
20
+ * @param {Command} this
21
+ * @returns {this is ContextMenuCommand}
22
+ */
23
+ isContextMenuCommand() {
24
+ return this.data instanceof ContextMenuCommandBuilder && this instanceof ContextMenuCommand;
25
+ }
26
+ /**
27
+ * Returns JSON of the command builder.
28
+ *
29
+ * @public
30
+ * @returns {*}
31
+ */
32
+ toJSON() {
33
+ return this.data.toJSON();
34
+ }
35
+ /**
36
+ * Reply to the interaction respecting command metadata and if the interaction has already been replied to.
37
+ *
38
+ * @public
39
+ * @async
40
+ * @param {CommandInteraction} interaction
41
+ * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options
42
+ * @returns {*}
43
+ */
44
+ async reply(interaction, options) {
45
+ if (interaction.replied) {
46
+ await interaction.editReply(options);
47
+ return;
48
+ }
49
+ const newOptions = { ...options };
50
+ if (this.metadata.ephemeralReply) newOptions.flags = ["Ephemeral"];
51
+ await interaction.reply(newOptions);
52
+ }
53
+ /**
54
+ * Validate permissions for a user/member in a guild.
55
+ *
56
+ * @async
57
+ * @param {CommandInteraction} interaction
58
+ * @param {PermissionLevel} permission
59
+ * @param {boolean} [doReply=true]
60
+ * @returns {unknown}
61
+ */
62
+ async validateGuildPermission(client, interaction, permission, doReply = true) {
63
+ const isContextMenu = interaction.isContextMenuCommand();
64
+ const isChatInput = interaction.isChatInputCommand();
65
+ const requiresGuildCheck = isContextMenu || isChatInput && (this.isSlashCommand() ? this.metadata.guildOnly : false);
66
+ if (!requiresGuildCheck) return true;
67
+ const member = interaction.member;
68
+ const memberHasPermission = hasPermission(client, { permission, member });
69
+ if (!memberHasPermission && doReply) {
70
+ await this.reply(interaction, {
71
+ content: `You do not have permission to run this command, required permission: \`${PermissionLevel[permission]}\``
72
+ });
73
+ }
74
+ return memberHasPermission;
75
+ }
76
+ }
77
+ class SlashCommand extends Command {
78
+ /**
79
+ * Optional function to run if the SlashCommand has no subcommands or for extra fuctionality.
80
+ *
81
+ * @abstract
82
+ * @type {?(
83
+ * client: TriviousClient,
84
+ * interaction: ChatInputCommandInteraction
85
+ * ) => Promise<void>}
86
+ */
87
+ run;
88
+ /**
89
+ * General handler for the command and its subcommand, if applicable.
90
+ *
91
+ * @public
92
+ * @async
93
+ * @param {TriviousClient} client
94
+ * @param {ChatInputCommandInteraction} interaction
95
+ * @returns {*}
96
+ */
97
+ async execute(client, interaction) {
98
+ const { run, reply, metadata } = this;
99
+ const { options } = interaction;
100
+ if (run) {
101
+ const memberHasPermission2 = await this.validateGuildPermission(
102
+ client,
103
+ interaction,
104
+ metadata.permission,
105
+ false
106
+ );
107
+ if (memberHasPermission2) await run(client, interaction);
108
+ }
109
+ const subcommands = metadata.subcommands;
110
+ if (subcommands.size <= 0) return;
111
+ const subcommand = metadata.subcommands.find(
112
+ (subcmd) => subcmd.data.name === options.getSubcommand()
113
+ );
114
+ if (!subcommand) {
115
+ await reply(interaction, {
116
+ content: "Ran subcommand is outdated or does not have a handler!"
117
+ });
118
+ return;
119
+ }
120
+ const memberHasPermission = await this.validateGuildPermission(
121
+ client,
122
+ interaction,
123
+ subcommand.metadata.permission
124
+ );
125
+ if (!memberHasPermission) return;
126
+ await subcommand.execute(client, interaction);
127
+ }
128
+ }
129
+ class CommandBuilder extends SlashCommandBuilder {
130
+ _active = true;
131
+ _guildOnly = false;
132
+ _ownerOnly = false;
133
+ _permission = PermissionLevel.USER;
134
+ _subcommands = new Collection();
135
+ _ephemeralReply = false;
136
+ /**
137
+ * Set the command as disabled.
138
+ *
139
+ * @public
140
+ * @returns {this}
141
+ */
142
+ disable() {
143
+ this._active = false;
144
+ return this;
145
+ }
146
+ /**
147
+ * Set the command as guild only.
148
+ *
149
+ * @public
150
+ * @returns {this}
151
+ */
152
+ setGuildOnly() {
153
+ this._guildOnly = true;
154
+ this._permission = PermissionLevel.USER;
155
+ this.setContexts(InteractionContextType.Guild);
156
+ return this;
157
+ }
158
+ /**
159
+ * Set the command as public only.
160
+ *
161
+ * @public
162
+ * @returns {this}
163
+ */
164
+ setOwnerOnly() {
165
+ this._permission = PermissionLevel.BOT_OWNER;
166
+ return this;
167
+ }
168
+ /**
169
+ * Set the permission level required to run the command.
170
+ *
171
+ * @public
172
+ * @param {PermissionLevel} permission
173
+ * @returns {this}
174
+ */
175
+ setPermission(permission) {
176
+ if (!this._guildOnly) return this;
177
+ this._permission = permission;
178
+ return this;
179
+ }
180
+ /**
181
+ * Set the interaction as ephemeral.
182
+ *
183
+ * @public
184
+ * @returns {this}
185
+ */
186
+ setEphemeralReply() {
187
+ this._ephemeralReply = true;
188
+ return this;
189
+ }
190
+ /**
191
+ * Build the builder.
192
+ *
193
+ * @public
194
+ * @returns {{ data: CommandBuilder; metadata: CommandMetadata; }}
195
+ */
196
+ build() {
197
+ return {
198
+ data: this,
199
+ metadata: {
200
+ active: this._active,
201
+ guildOnly: this._guildOnly,
202
+ ownerOnly: this._ownerOnly,
203
+ permission: this._permission,
204
+ subcommands: this._subcommands,
205
+ ephemeralReply: this._ephemeralReply
206
+ }
207
+ };
208
+ }
209
+ }
210
+ class ContextMenuCommand extends Command {
211
+ /**
212
+ * Base command handler.
213
+ *
214
+ * @public
215
+ * @async
216
+ * @param {TriviousClient} client
217
+ * @param {ContextMenuCommandInteraction} interaction
218
+ * @returns {*}
219
+ */
220
+ async execute(client, interaction) {
221
+ const { run, metadata } = this;
222
+ const memberHasPermission = await this.validateGuildPermission(
223
+ client,
224
+ interaction,
225
+ metadata.permission,
226
+ false
227
+ );
228
+ if (memberHasPermission) await run(client, interaction);
229
+ }
230
+ }
231
+ class ContextMenuBuilder extends ContextMenuCommandBuilder {
232
+ _active = true;
233
+ _ownerOnly = false;
234
+ _permission = PermissionLevel.USER;
235
+ _ephemeralReply = false;
236
+ /**
237
+ * Set the command as disabled.
238
+ *
239
+ * @public
240
+ * @returns {this}
241
+ */
242
+ disable() {
243
+ this._active = false;
244
+ return this;
245
+ }
246
+ /**
247
+ * Set the command as owner only.
248
+ *
249
+ * @public
250
+ * @returns {this}
251
+ */
252
+ setOwnerOnly() {
253
+ this._permission = PermissionLevel.BOT_OWNER;
254
+ this._ownerOnly = true;
255
+ return this;
256
+ }
257
+ /**
258
+ * Set the permission level required to run the command.
259
+ *
260
+ * @public
261
+ * @param {PermissionLevel} permission
262
+ * @returns {this}
263
+ */
264
+ setPermission(permission) {
265
+ this._permission = permission;
266
+ return this;
267
+ }
268
+ /**
269
+ * Set the interaction as ephemeral.
270
+ *
271
+ * @public
272
+ * @returns {this}
273
+ */
274
+ setEphemeralReply() {
275
+ this._ephemeralReply = true;
276
+ return this;
277
+ }
278
+ /**
279
+ * Build the builder
280
+ *
281
+ * @public
282
+ * @returns {{ data: ContextMenuBuilder; metadata: ContextMenuMetadata; }}
283
+ */
284
+ build() {
285
+ return {
286
+ data: this,
287
+ metadata: {
288
+ active: this._active,
289
+ ownerOnly: this._ownerOnly,
290
+ permission: this._permission,
291
+ ephemeralReply: this._ephemeralReply
292
+ }
293
+ };
294
+ }
295
+ }
296
+
297
+ export { CommandBuilder, ContextMenuBuilder, ContextMenuCommand, SlashCommand, Command as default };
298
+ //# sourceMappingURL=command.base.js.map
299
+ //# sourceMappingURL=command.base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/commands/command.base.ts"],"names":["memberHasPermission"],"mappings":";;;;AAgCA,MAAO,OAAA,CAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW9B,cAAA,GAAoD;AAC1D,IAAA,OAAO,IAAA,CAAK,IAAA,YAAgB,mBAAA,IAAuB,IAAA,YAAgB,YAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,oBAAA,GAAgE;AACtE,IAAA,OAAO,IAAA,CAAK,IAAA,YAAgB,yBAAA,IAA6B,IAAA,YAAgB,kBAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,MAAA,GAAS;AACf,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,EAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,KAAA,CACZ,WAAA,EACA,OAAA,EACC;AACD,IAAA,IAAI,YAAY,OAAA,EAAS;AACxB,MAAA,MAAM,WAAA,CAAY,UAAU,OAAsC,CAAA;AAClE,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,OAAA,EAAQ;AAChC,IAAA,IAAI,KAAK,QAAA,CAAS,cAAA,EAAgB,UAAA,CAAW,KAAA,GAAQ,CAAC,WAAW,CAAA;AAEjE,IAAA,MAAM,WAAA,CAAY,MAAM,UAAU,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,uBAAA,CACL,MAAA,EACA,WAAA,EACA,UAAA,EACA,UAAmB,IAAA,EAClB;AACD,IAAA,MAAM,aAAA,GAAgB,YAAY,oBAAA,EAAqB;AACvD,IAAA,MAAM,WAAA,GAAc,YAAY,kBAAA,EAAmB;AAEnD,IAAA,MAAM,kBAAA,GACL,iBAAkB,WAAA,KAAgB,IAAA,CAAK,gBAAe,GAAI,IAAA,CAAK,SAAS,SAAA,GAAY,KAAA,CAAA;AACrF,IAAA,IAAI,CAAC,oBAAoB,OAAO,IAAA;AAEhC,IAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,IAAA,MAAM,sBAAsB,aAAA,CAAc,MAAA,EAAQ,EAAE,UAAA,EAAY,QAAQ,CAAA;AAExE,IAAA,IAAI,CAAC,uBAAuB,OAAA,EAAS;AACpC,MAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAa;AAAA,QAC7B,OAAA,EAAS,CAAA,uEAAA,EAA0E,eAAA,CAAgB,UAAU,CAAC,CAAA,EAAA;AAAA,OAC9G,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,mBAAA;AAAA,EACR;AACD;AAWO,MAAe,qBAAqB,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYlD,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,OAAA,CAAQ,MAAA,EAAwB,WAAA,EAA0C;AACtF,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA;AACjC,IAAA,MAAM,EAAE,SAAQ,GAAI,WAAA;AAEpB,IAAA,IAAI,GAAA,EAAK;AACR,MAAA,MAAMA,oBAAAA,GAAsB,MAAM,IAAA,CAAK,uBAAA;AAAA,QACtC,MAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,CAAS,UAAA;AAAA,QACT;AAAA,OACD;AACA,MAAA,IAAIA,oBAAAA,EAAqB,MAAM,GAAA,CAAI,MAAA,EAAQ,WAAW,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,cAAc,QAAA,CAAS,WAAA;AAC7B,IAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,EAAG;AAE3B,IAAA,MAAM,UAAA,GAAa,SAAS,WAAA,CAAY,IAAA;AAAA,MACvC,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,QAAQ,aAAA;AAAc,KACtD;AACA,IAAA,IAAI,CAAC,UAAA,EAAY;AAChB,MAAA,MAAM,MAAM,WAAA,EAAa;AAAA,QACxB,OAAA,EAAS;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,uBAAA;AAAA,MACtC,MAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAW,QAAA,CAAS;AAAA,KACrB;AACA,IAAA,IAAI,CAAC,mBAAA,EAAqB;AAE1B,IAAA,MAAM,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,EAC7C;AACD;AAUO,MAAM,uBAAuB,mBAAA,CAAoB;AAAA,EAC/C,OAAA,GAAU,IAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA,EACb,cAAc,eAAA,CAAgB,IAAA;AAAA,EAC9B,YAAA,GAAe,IAAI,UAAA,EAA+B;AAAA,EAClD,eAAA,GAAkB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,cAAc,eAAA,CAAgB,IAAA;AACnC,IAAA,IAAA,CAAK,WAAA,CAAY,uBAAuB,KAAK,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,cAAc,eAAA,CAAgB,SAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,cAAc,UAAA,EAAmC;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA;AAE7B,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAA,GAAQ;AACd,IAAA,OAAO;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACT,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,aAAa,IAAA,CAAK,YAAA;AAAA,QAClB,gBAAgB,IAAA,CAAK;AAAA;AACtB,KACD;AAAA,EACD;AACD;AAWO,MAAe,2BAA2B,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BxD,MAAa,OAAA,CAAQ,MAAA,EAAwB,WAAA,EAA4C;AACxF,IAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAS,GAAI,IAAA;AAE1B,IAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,uBAAA;AAAA,MACtC,MAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA,CAAS,UAAA;AAAA,MACT;AAAA,KACD;AACA,IAAA,IAAI,mBAAA,EAAqB,MAAM,GAAA,CAAI,MAAA,EAAQ,WAAW,CAAA;AAAA,EACvD;AACD;AAUO,MAAM,2BAA2B,yBAAA,CAA0B;AAAA,EACzD,OAAA,GAAU,IAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EACb,cAAc,eAAA,CAAgB,IAAA;AAAA,EAC9B,eAAA,GAAkB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,cAAc,eAAA,CAAgB,SAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,cAAc,UAAA,EAAmC;AACvD,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAA,GAAQ;AACd,IAAA,OAAO;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACT,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,gBAAgB,IAAA,CAAK;AAAA;AACtB,KACD;AAAA,EACD;AACD","file":"command.base.js","sourcesContent":["import {\n\tCollection,\n\tContextMenuCommandBuilder,\n\tGuildMember,\n\tInteractionContextType,\n\tInteractionEditReplyOptions,\n\tInteractionReplyOptions,\n\tMessagePayload,\n\tSlashCommandBuilder,\n} from \"discord.js\";\nimport {\n\tCommandInteraction,\n\tCommandMetadata,\n\tContextMenuMetadata,\n\tPermissionLevel,\n} from \"src/shared/typings/index.js\";\nimport TriviousClient from \"../client/trivious.client.js\";\nimport { hasPermission } from \"src/shared/utility/functions.js\";\nimport {\n\tChatInputCommandInteraction,\n\tContextMenuCommandInteraction,\n\tSubcommand,\n} from \"src/index.js\";\n\n/**\n * Base class for a Command.\n *\n * @export\n * @abstract\n * @class Command\n * @typedef {Command}\n */\nexport default abstract class Command {\n\tabstract data: SlashCommandBuilder | ContextMenuCommandBuilder;\n\tabstract metadata: CommandMetadata | ContextMenuMetadata;\n\n\t/**\n\t * Returns whether the command is a SlashCommand.\n\t *\n\t * @public\n\t * @param {Command} this\n\t * @returns {this is SlashCommand}\n\t */\n\tpublic isSlashCommand(this: Command): this is SlashCommand {\n\t\treturn this.data instanceof SlashCommandBuilder && this instanceof SlashCommand;\n\t}\n\n\t/**\n\t * Returns whether the command is a ContextMenuCommand.\n\t *\n\t * @public\n\t * @param {Command} this\n\t * @returns {this is ContextMenuCommand}\n\t */\n\tpublic isContextMenuCommand(this: Command): this is ContextMenuCommand {\n\t\treturn this.data instanceof ContextMenuCommandBuilder && this instanceof ContextMenuCommand;\n\t}\n\n\t/**\n\t * Returns JSON of the command builder.\n\t *\n\t * @public\n\t * @returns {*}\n\t */\n\tpublic toJSON() {\n\t\treturn this.data.toJSON();\n\t}\n\n\t/**\n\t * Reply to the interaction respecting command metadata and if the interaction has already been replied to.\n\t *\n\t * @public\n\t * @async\n\t * @param {CommandInteraction} interaction\n\t * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options\n\t * @returns {*}\n\t */\n\tpublic async reply(\n\t\tinteraction: CommandInteraction,\n\t\toptions: MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions\n\t) {\n\t\tif (interaction.replied) {\n\t\t\tawait interaction.editReply(options as InteractionEditReplyOptions);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newOptions = { ...options } as InteractionReplyOptions;\n\t\tif (this.metadata.ephemeralReply) newOptions.flags = [\"Ephemeral\"];\n\n\t\tawait interaction.reply(newOptions);\n\t}\n\n\t/**\n\t * Validate permissions for a user/member in a guild.\n\t *\n\t * @async\n\t * @param {CommandInteraction} interaction\n\t * @param {PermissionLevel} permission\n\t * @param {boolean} [doReply=true]\n\t * @returns {unknown}\n\t */\n\tasync validateGuildPermission(\n\t\tclient: TriviousClient,\n\t\tinteraction: CommandInteraction,\n\t\tpermission: PermissionLevel,\n\t\tdoReply: boolean = true\n\t) {\n\t\tconst isContextMenu = interaction.isContextMenuCommand();\n\t\tconst isChatInput = interaction.isChatInputCommand();\n\n\t\tconst requiresGuildCheck =\n\t\t\tisContextMenu || (isChatInput && (this.isSlashCommand() ? this.metadata.guildOnly : false));\n\t\tif (!requiresGuildCheck) return true;\n\n\t\tconst member = interaction.member as GuildMember;\n\t\tconst memberHasPermission = hasPermission(client, { permission, member });\n\n\t\tif (!memberHasPermission && doReply) {\n\t\t\tawait this.reply(interaction, {\n\t\t\t\tcontent: `You do not have permission to run this command, required permission: \\`${PermissionLevel[permission]}\\``,\n\t\t\t});\n\t\t}\n\n\t\treturn memberHasPermission;\n\t}\n}\n\n/**\n * Base SlashCommand.\n *\n * @export\n * @abstract\n * @class SlashCommand\n * @typedef {SlashCommand}\n * @extends {Command}\n */\nexport abstract class SlashCommand extends Command {\n\tabstract data: SlashCommandBuilder;\n\tabstract metadata: CommandMetadata;\n\t/**\n\t * Optional function to run if the SlashCommand has no subcommands or for extra fuctionality.\n\t *\n\t * @abstract\n\t * @type {?(\n\t * \t\tclient: TriviousClient,\n\t * \t\tinteraction: ChatInputCommandInteraction\n\t * \t) => Promise<void>}\n\t */\n\trun?: (client: TriviousClient, interaction: ChatInputCommandInteraction) => Promise<void>;\n\n\t/**\n\t * General handler for the command and its subcommand, if applicable.\n\t *\n\t * @public\n\t * @async\n\t * @param {TriviousClient} client\n\t * @param {ChatInputCommandInteraction} interaction\n\t * @returns {*}\n\t */\n\tpublic async execute(client: TriviousClient, interaction: ChatInputCommandInteraction) {\n\t\tconst { run, reply, metadata } = this;\n\t\tconst { options } = interaction;\n\n\t\tif (run) {\n\t\t\tconst memberHasPermission = await this.validateGuildPermission(\n\t\t\t\tclient,\n\t\t\t\tinteraction,\n\t\t\t\tmetadata.permission,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tif (memberHasPermission) await run(client, interaction);\n\t\t}\n\n\t\tconst subcommands = metadata.subcommands;\n\t\tif (subcommands.size <= 0) return;\n\n\t\tconst subcommand = metadata.subcommands.find(\n\t\t\tsubcmd => subcmd.data.name === options.getSubcommand()\n\t\t);\n\t\tif (!subcommand) {\n\t\t\tawait reply(interaction, {\n\t\t\t\tcontent: \"Ran subcommand is outdated or does not have a handler!\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst memberHasPermission = await this.validateGuildPermission(\n\t\t\tclient,\n\t\t\tinteraction,\n\t\t\tsubcommand.metadata.permission\n\t\t);\n\t\tif (!memberHasPermission) return;\n\n\t\tawait subcommand.execute(client, interaction);\n\t}\n}\n\n/**\n * Base CommandBuilder.\n *\n * @export\n * @class CommandBuilder\n * @typedef {CommandBuilder}\n * @extends {SlashCommandBuilder}\n */\nexport class CommandBuilder extends SlashCommandBuilder {\n\tprivate _active = true;\n\tprivate _guildOnly = false;\n\tprivate _ownerOnly = false;\n\tprivate _permission = PermissionLevel.USER;\n\tprivate _subcommands = new Collection<string, Subcommand>();\n\tprivate _ephemeralReply = false;\n\n\t/**\n\t * Set the command as disabled.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic disable(): this {\n\t\tthis._active = false;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the command as guild only.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setGuildOnly(): this {\n\t\tthis._guildOnly = true;\n\t\tthis._permission = PermissionLevel.USER;\n\t\tthis.setContexts(InteractionContextType.Guild);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the command as public only.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setOwnerOnly(): this {\n\t\tthis._permission = PermissionLevel.BOT_OWNER;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the permission level required to run the command.\n\t *\n\t * @public\n\t * @param {PermissionLevel} permission\n\t * @returns {this}\n\t */\n\tpublic setPermission(permission: PermissionLevel): this {\n\t\tif (!this._guildOnly) return this;\n\n\t\tthis._permission = permission;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the interaction as ephemeral.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setEphemeralReply(): this {\n\t\tthis._ephemeralReply = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Build the builder.\n\t *\n\t * @public\n\t * @returns {{ data: CommandBuilder; metadata: CommandMetadata; }}\n\t */\n\tpublic build() {\n\t\treturn {\n\t\t\tdata: this as CommandBuilder,\n\t\t\tmetadata: {\n\t\t\t\tactive: this._active,\n\t\t\t\tguildOnly: this._guildOnly,\n\t\t\t\townerOnly: this._ownerOnly,\n\t\t\t\tpermission: this._permission,\n\t\t\t\tsubcommands: this._subcommands,\n\t\t\t\tephemeralReply: this._ephemeralReply,\n\t\t\t} satisfies CommandMetadata,\n\t\t};\n\t}\n}\n\n/**\n * Base ContextMenuCommand.\n *\n * @export\n * @abstract\n * @class ContextMenuCommand\n * @typedef {ContextMenuCommand}\n * @extends {Command}\n */\nexport abstract class ContextMenuCommand extends Command {\n\tabstract data: ContextMenuCommandBuilder;\n\tabstract metadata: ContextMenuMetadata;\n\t/**\n\t * Function to run when the command is used.\n\t *\n\t * @abstract\n\t * @type {(\n\t * \t\tclient: TriviousClient,\n\t * \t\tinteraction: ContextMenuCommandInteraction\n\t * \t) => Promise<void>}\n\t */\n\tabstract run: (\n\t\tclient: TriviousClient,\n\t\tinteraction: ContextMenuCommandInteraction\n\t) => Promise<void>;\n\n\t/**\n\t * Base command handler.\n\t *\n\t * @public\n\t * @async\n\t * @param {TriviousClient} client\n\t * @param {ContextMenuCommandInteraction} interaction\n\t * @returns {*}\n\t */\n\tpublic async execute(client: TriviousClient, interaction: ContextMenuCommandInteraction) {\n\t\tconst { run, metadata } = this;\n\n\t\tconst memberHasPermission = await this.validateGuildPermission(\n\t\t\tclient,\n\t\t\tinteraction,\n\t\t\tmetadata.permission,\n\t\t\tfalse\n\t\t);\n\t\tif (memberHasPermission) await run(client, interaction);\n\t}\n}\n\n/**\n * Base ContextMenuBuilder.\n *\n * @export\n * @class ContextMenuBuilder\n * @typedef {ContextMenuBuilder}\n * @extends {ContextMenuCommandBuilder}\n */\nexport class ContextMenuBuilder extends ContextMenuCommandBuilder {\n\tprivate _active = true;\n\tprivate _ownerOnly = false;\n\tprivate _permission = PermissionLevel.USER;\n\tprivate _ephemeralReply = false;\n\n\t/**\n\t * Set the command as disabled.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic disable(): this {\n\t\tthis._active = false;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the command as owner only.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setOwnerOnly(): this {\n\t\tthis._permission = PermissionLevel.BOT_OWNER;\n\t\tthis._ownerOnly = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the permission level required to run the command.\n\t *\n\t * @public\n\t * @param {PermissionLevel} permission\n\t * @returns {this}\n\t */\n\tpublic setPermission(permission: PermissionLevel): this {\n\t\tthis._permission = permission;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the interaction as ephemeral.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setEphemeralReply(): this {\n\t\tthis._ephemeralReply = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Build the builder\n\t *\n\t * @public\n\t * @returns {{ data: ContextMenuBuilder; metadata: ContextMenuMetadata; }}\n\t */\n\tpublic build() {\n\t\treturn {\n\t\t\tdata: this as ContextMenuBuilder,\n\t\t\tmetadata: {\n\t\t\t\tactive: this._active,\n\t\t\t\townerOnly: this._ownerOnly,\n\t\t\t\tpermission: this._permission,\n\t\t\t\tephemeralReply: this._ephemeralReply,\n\t\t\t} satisfies ContextMenuMetadata,\n\t\t};\n\t}\n}\n"]}
@@ -0,0 +1,96 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var discord_js = require('discord.js');
6
+ var index_js = require('../../shared/typings/index.js');
7
+
8
+ class SubcommandBuilder extends discord_js.SlashCommandSubcommandBuilder {
9
+ _active = true;
10
+ _ownerOnly = false;
11
+ _permission = index_js.PermissionLevel.USER;
12
+ _ephemeralReply = false;
13
+ /**
14
+ * Set the subcommand as disabled.
15
+ *
16
+ * @public
17
+ * @returns {this}
18
+ */
19
+ disable() {
20
+ this._active = false;
21
+ return this;
22
+ }
23
+ /**
24
+ * Set the subcommand as owner only.
25
+ *
26
+ * @public
27
+ * @returns {this}
28
+ */
29
+ setOwnerOnly() {
30
+ this._permission = index_js.PermissionLevel.BOT_OWNER;
31
+ this._ownerOnly = true;
32
+ return this;
33
+ }
34
+ /**
35
+ * Set the permission level required to run the subcommand.
36
+ *
37
+ * @public
38
+ * @param {PermissionLevel} permission
39
+ * @returns {this}
40
+ */
41
+ setPermission(permission) {
42
+ this._permission = permission;
43
+ return this;
44
+ }
45
+ /**
46
+ * Set the interaction as ephemeral
47
+ *
48
+ * @public
49
+ * @returns {this}
50
+ */
51
+ setEphemeralReply() {
52
+ this._ephemeralReply = true;
53
+ return this;
54
+ }
55
+ /**
56
+ * Build the builder.
57
+ *
58
+ * @public
59
+ * @returns {{ data: SlashCommandSubcommandBuilder; metadata: SubcommandMetadata; }}
60
+ */
61
+ build() {
62
+ return {
63
+ data: this,
64
+ metadata: {
65
+ active: this._active,
66
+ ownerOnly: this._ownerOnly,
67
+ permission: this._permission,
68
+ ephemeralReply: this._ephemeralReply
69
+ }
70
+ };
71
+ }
72
+ }
73
+ class Subcommand {
74
+ /**
75
+ * Reply to the interaction respecting command metadata and if the interaction has already been replied to.
76
+ *
77
+ * @async
78
+ * @param {ChatInputCommandInteraction<CacheType>} interaction
79
+ * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options
80
+ * @returns {*}
81
+ */
82
+ async reply(interaction, options) {
83
+ if (interaction.replied) {
84
+ await interaction.editReply(options);
85
+ return;
86
+ }
87
+ const newOptions = { ...options };
88
+ if (this.metadata.ephemeralReply) newOptions.flags = ["Ephemeral"];
89
+ await interaction.reply(newOptions);
90
+ }
91
+ }
92
+
93
+ exports.SubcommandBuilder = SubcommandBuilder;
94
+ exports.default = Subcommand;
95
+ //# sourceMappingURL=subcommand.base.cjs.map
96
+ //# sourceMappingURL=subcommand.base.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/commands/subcommand.base.ts"],"names":["SlashCommandSubcommandBuilder","PermissionLevel"],"mappings":";;;;;;;AAmBO,MAAM,0BAA0BA,wCAAA,CAA8B;AAAA,EAC5D,OAAA,GAAU,IAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EACb,cAAcC,wBAAA,CAAgB,IAAA;AAAA,EAC9B,eAAA,GAAkB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,cAAcA,wBAAA,CAAgB,SAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,cAAc,UAAA,EAAmC;AACvD,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAA,GAAQ;AACd,IAAA,OAAO;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACT,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,gBAAgB,IAAA,CAAK;AAAA;AACtB,KACD;AAAA,EACD;AACD;AAUA,MAAO,UAAA,CAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BxC,MAAM,KAAA,CACL,WAAA,EACA,OAAA,EACC;AACD,IAAA,IAAI,YAAY,OAAA,EAAS;AACxB,MAAA,MAAM,WAAA,CAAY,UAAU,OAAsC,CAAA;AAClE,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,OAAA,EAAQ;AAChC,IAAA,IAAI,KAAK,QAAA,CAAS,cAAA,EAAgB,UAAA,CAAW,KAAA,GAAQ,CAAC,WAAW,CAAA;AAEjE,IAAA,MAAM,WAAA,CAAY,MAAM,UAAU,CAAA;AAAA,EACnC;AACD","file":"subcommand.base.cjs","sourcesContent":["import {\n\tCacheType,\n\tChatInputCommandInteraction,\n\tInteractionEditReplyOptions,\n\tInteractionReplyOptions,\n\tMessagePayload,\n\tSlashCommandSubcommandBuilder,\n} from \"discord.js\";\nimport { PermissionLevel, SubcommandMetadata } from \"src/shared/typings/index.js\";\nimport { TriviousClient } from \"src/index.js\";\n\n/**\n * Base SubcommandBuilder.\n *\n * @export\n * @class SubcommandBuilder\n * @typedef {SubcommandBuilder}\n * @extends {SlashCommandSubcommandBuilder}\n */\nexport class SubcommandBuilder extends SlashCommandSubcommandBuilder {\n\tprivate _active = true;\n\tprivate _ownerOnly = false;\n\tprivate _permission = PermissionLevel.USER;\n\tprivate _ephemeralReply = false;\n\n\t/**\n\t * Set the subcommand as disabled.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic disable(): this {\n\t\tthis._active = false;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the subcommand as owner only.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setOwnerOnly(): this {\n\t\tthis._permission = PermissionLevel.BOT_OWNER;\n\t\tthis._ownerOnly = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the permission level required to run the subcommand.\n\t *\n\t * @public\n\t * @param {PermissionLevel} permission\n\t * @returns {this}\n\t */\n\tpublic setPermission(permission: PermissionLevel): this {\n\t\tthis._permission = permission;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the interaction as ephemeral\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setEphemeralReply(): this {\n\t\tthis._ephemeralReply = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Build the builder.\n\t *\n\t * @public\n\t * @returns {{ data: SlashCommandSubcommandBuilder; metadata: SubcommandMetadata; }}\n\t */\n\tpublic build() {\n\t\treturn {\n\t\t\tdata: this as SlashCommandSubcommandBuilder,\n\t\t\tmetadata: {\n\t\t\t\tactive: this._active,\n\t\t\t\townerOnly: this._ownerOnly,\n\t\t\t\tpermission: this._permission,\n\t\t\t\tephemeralReply: this._ephemeralReply,\n\t\t\t} satisfies SubcommandMetadata,\n\t\t};\n\t}\n}\n\n/**\n * Base Subcommand\n *\n * @export\n * @abstract\n * @class Subcommand\n * @typedef {Subcommand}\n */\nexport default abstract class Subcommand {\n\tabstract data: SlashCommandSubcommandBuilder;\n\tabstract metadata: SubcommandMetadata;\n\t/**\n\t * Function to execute the subcommand.\n\t *\n\t * @abstract\n\t * @readonly\n\t * @type {(\n\t * \t\tclient: TriviousClient,\n\t * \t\tinteraction: ChatInputCommandInteraction<CacheType>\n\t * \t) => Promise<void>}\n\t */\n\tabstract readonly execute: (\n\t\tclient: TriviousClient,\n\t\tinteraction: ChatInputCommandInteraction<CacheType>\n\t) => Promise<void>;\n\n\t/**\n\t * Reply to the interaction respecting command metadata and if the interaction has already been replied to.\n\t *\n\t * @async\n\t * @param {ChatInputCommandInteraction<CacheType>} interaction\n\t * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options\n\t * @returns {*}\n\t */\n\tasync reply(\n\t\tinteraction: ChatInputCommandInteraction<CacheType>,\n\t\toptions: MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions\n\t) {\n\t\tif (interaction.replied) {\n\t\t\tawait interaction.editReply(options as InteractionEditReplyOptions);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newOptions = { ...options } as InteractionReplyOptions;\n\t\tif (this.metadata.ephemeralReply) newOptions.flags = [\"Ephemeral\"];\n\n\t\tawait interaction.reply(newOptions);\n\t}\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import 'discord.js';
2
+ export { n as SubcommandBuilder, m as default } from '../../index-BjPKCNAw.cjs';
3
+ import '../../shared/typings/registry.cjs';
@@ -0,0 +1,3 @@
1
+ import 'discord.js';
2
+ export { n as SubcommandBuilder, m as default } from '../../index-5IsAwOsi.js';
3
+ import '../../shared/typings/registry.js';
@@ -0,0 +1,91 @@
1
+ import { SlashCommandSubcommandBuilder } from 'discord.js';
2
+ import { PermissionLevel } from '../../shared/typings/index.js';
3
+
4
+ class SubcommandBuilder extends SlashCommandSubcommandBuilder {
5
+ _active = true;
6
+ _ownerOnly = false;
7
+ _permission = PermissionLevel.USER;
8
+ _ephemeralReply = false;
9
+ /**
10
+ * Set the subcommand as disabled.
11
+ *
12
+ * @public
13
+ * @returns {this}
14
+ */
15
+ disable() {
16
+ this._active = false;
17
+ return this;
18
+ }
19
+ /**
20
+ * Set the subcommand as owner only.
21
+ *
22
+ * @public
23
+ * @returns {this}
24
+ */
25
+ setOwnerOnly() {
26
+ this._permission = PermissionLevel.BOT_OWNER;
27
+ this._ownerOnly = true;
28
+ return this;
29
+ }
30
+ /**
31
+ * Set the permission level required to run the subcommand.
32
+ *
33
+ * @public
34
+ * @param {PermissionLevel} permission
35
+ * @returns {this}
36
+ */
37
+ setPermission(permission) {
38
+ this._permission = permission;
39
+ return this;
40
+ }
41
+ /**
42
+ * Set the interaction as ephemeral
43
+ *
44
+ * @public
45
+ * @returns {this}
46
+ */
47
+ setEphemeralReply() {
48
+ this._ephemeralReply = true;
49
+ return this;
50
+ }
51
+ /**
52
+ * Build the builder.
53
+ *
54
+ * @public
55
+ * @returns {{ data: SlashCommandSubcommandBuilder; metadata: SubcommandMetadata; }}
56
+ */
57
+ build() {
58
+ return {
59
+ data: this,
60
+ metadata: {
61
+ active: this._active,
62
+ ownerOnly: this._ownerOnly,
63
+ permission: this._permission,
64
+ ephemeralReply: this._ephemeralReply
65
+ }
66
+ };
67
+ }
68
+ }
69
+ class Subcommand {
70
+ /**
71
+ * Reply to the interaction respecting command metadata and if the interaction has already been replied to.
72
+ *
73
+ * @async
74
+ * @param {ChatInputCommandInteraction<CacheType>} interaction
75
+ * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options
76
+ * @returns {*}
77
+ */
78
+ async reply(interaction, options) {
79
+ if (interaction.replied) {
80
+ await interaction.editReply(options);
81
+ return;
82
+ }
83
+ const newOptions = { ...options };
84
+ if (this.metadata.ephemeralReply) newOptions.flags = ["Ephemeral"];
85
+ await interaction.reply(newOptions);
86
+ }
87
+ }
88
+
89
+ export { SubcommandBuilder, Subcommand as default };
90
+ //# sourceMappingURL=subcommand.base.js.map
91
+ //# sourceMappingURL=subcommand.base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/commands/subcommand.base.ts"],"names":[],"mappings":";;;AAmBO,MAAM,0BAA0B,6BAAA,CAA8B;AAAA,EAC5D,OAAA,GAAU,IAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EACb,cAAc,eAAA,CAAgB,IAAA;AAAA,EAC9B,eAAA,GAAkB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,cAAc,eAAA,CAAgB,SAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,cAAc,UAAA,EAAmC;AACvD,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAA,GAAQ;AACd,IAAA,OAAO;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACT,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,gBAAgB,IAAA,CAAK;AAAA;AACtB,KACD;AAAA,EACD;AACD;AAUA,MAAO,UAAA,CAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BxC,MAAM,KAAA,CACL,WAAA,EACA,OAAA,EACC;AACD,IAAA,IAAI,YAAY,OAAA,EAAS;AACxB,MAAA,MAAM,WAAA,CAAY,UAAU,OAAsC,CAAA;AAClE,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,OAAA,EAAQ;AAChC,IAAA,IAAI,KAAK,QAAA,CAAS,cAAA,EAAgB,UAAA,CAAW,KAAA,GAAQ,CAAC,WAAW,CAAA;AAEjE,IAAA,MAAM,WAAA,CAAY,MAAM,UAAU,CAAA;AAAA,EACnC;AACD","file":"subcommand.base.js","sourcesContent":["import {\n\tCacheType,\n\tChatInputCommandInteraction,\n\tInteractionEditReplyOptions,\n\tInteractionReplyOptions,\n\tMessagePayload,\n\tSlashCommandSubcommandBuilder,\n} from \"discord.js\";\nimport { PermissionLevel, SubcommandMetadata } from \"src/shared/typings/index.js\";\nimport { TriviousClient } from \"src/index.js\";\n\n/**\n * Base SubcommandBuilder.\n *\n * @export\n * @class SubcommandBuilder\n * @typedef {SubcommandBuilder}\n * @extends {SlashCommandSubcommandBuilder}\n */\nexport class SubcommandBuilder extends SlashCommandSubcommandBuilder {\n\tprivate _active = true;\n\tprivate _ownerOnly = false;\n\tprivate _permission = PermissionLevel.USER;\n\tprivate _ephemeralReply = false;\n\n\t/**\n\t * Set the subcommand as disabled.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic disable(): this {\n\t\tthis._active = false;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the subcommand as owner only.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setOwnerOnly(): this {\n\t\tthis._permission = PermissionLevel.BOT_OWNER;\n\t\tthis._ownerOnly = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the permission level required to run the subcommand.\n\t *\n\t * @public\n\t * @param {PermissionLevel} permission\n\t * @returns {this}\n\t */\n\tpublic setPermission(permission: PermissionLevel): this {\n\t\tthis._permission = permission;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the interaction as ephemeral\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setEphemeralReply(): this {\n\t\tthis._ephemeralReply = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Build the builder.\n\t *\n\t * @public\n\t * @returns {{ data: SlashCommandSubcommandBuilder; metadata: SubcommandMetadata; }}\n\t */\n\tpublic build() {\n\t\treturn {\n\t\t\tdata: this as SlashCommandSubcommandBuilder,\n\t\t\tmetadata: {\n\t\t\t\tactive: this._active,\n\t\t\t\townerOnly: this._ownerOnly,\n\t\t\t\tpermission: this._permission,\n\t\t\t\tephemeralReply: this._ephemeralReply,\n\t\t\t} satisfies SubcommandMetadata,\n\t\t};\n\t}\n}\n\n/**\n * Base Subcommand\n *\n * @export\n * @abstract\n * @class Subcommand\n * @typedef {Subcommand}\n */\nexport default abstract class Subcommand {\n\tabstract data: SlashCommandSubcommandBuilder;\n\tabstract metadata: SubcommandMetadata;\n\t/**\n\t * Function to execute the subcommand.\n\t *\n\t * @abstract\n\t * @readonly\n\t * @type {(\n\t * \t\tclient: TriviousClient,\n\t * \t\tinteraction: ChatInputCommandInteraction<CacheType>\n\t * \t) => Promise<void>}\n\t */\n\tabstract readonly execute: (\n\t\tclient: TriviousClient,\n\t\tinteraction: ChatInputCommandInteraction<CacheType>\n\t) => Promise<void>;\n\n\t/**\n\t * Reply to the interaction respecting command metadata and if the interaction has already been replied to.\n\t *\n\t * @async\n\t * @param {ChatInputCommandInteraction<CacheType>} interaction\n\t * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options\n\t * @returns {*}\n\t */\n\tasync reply(\n\t\tinteraction: ChatInputCommandInteraction<CacheType>,\n\t\toptions: MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions\n\t) {\n\t\tif (interaction.replied) {\n\t\t\tawait interaction.editReply(options as InteractionEditReplyOptions);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newOptions = { ...options } as InteractionReplyOptions;\n\t\tif (this.metadata.ephemeralReply) newOptions.flags = [\"Ephemeral\"];\n\n\t\tawait interaction.reply(newOptions);\n\t}\n}\n"]}
@@ -0,0 +1,111 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var index_js = require('../../shared/typings/index.js');
6
+ var functions_js = require('../../shared/utility/functions.js');
7
+
8
+ class ComponentBuilder {
9
+ _customId = "";
10
+ _permission = index_js.PermissionLevel.USER;
11
+ _ephemeralReply = false;
12
+ /**
13
+ * Set the customId for the component.
14
+ *
15
+ * @public
16
+ * @param {{
17
+ * type: ComponentType;
18
+ * data: string;
19
+ * tags?: ComponentCustomIdTag[];
20
+ * }} options
21
+ * @returns {this}
22
+ */
23
+ setCustomId(options) {
24
+ const { data, type, tags } = options;
25
+ this._customId = `${type}:${data}${tags ? `.${tags.join(".")}` : ""}`;
26
+ return this;
27
+ }
28
+ /**
29
+ * Set the permission required to use the component.
30
+ *
31
+ * @public
32
+ * @param {PermissionLevel} permission
33
+ * @returns {this}
34
+ */
35
+ setPermission(permission) {
36
+ this._permission = permission;
37
+ return this;
38
+ }
39
+ /**
40
+ * Set the interaction as ephemeral.
41
+ *
42
+ * @public
43
+ * @returns {this}
44
+ */
45
+ setEphemeralReply() {
46
+ this._ephemeralReply = true;
47
+ return this;
48
+ }
49
+ /**
50
+ * Builder the builder.
51
+ *
52
+ * @public
53
+ * @returns {{ metadata: ComponentMetadata; }}
54
+ */
55
+ build() {
56
+ return {
57
+ metadata: {
58
+ customId: this._customId,
59
+ permission: this._permission,
60
+ ephemeralReply: this._ephemeralReply
61
+ }
62
+ };
63
+ }
64
+ }
65
+ class Component {
66
+ /**
67
+ * Validate permissions for a user/member in a guild.
68
+ *
69
+ * @async
70
+ * @param {ComponentInteraction} interaction
71
+ * @param {PermissionLevel} permission
72
+ * @param {boolean} [doReply=true] Defaults to `true`
73
+ * @returns {unknown}
74
+ */
75
+ async validateGuildPermission(client, interaction, permission, doReply = true) {
76
+ if (interaction.guild) {
77
+ const member = interaction.member;
78
+ const memberHasPermission = functions_js.hasPermission(client, { permission, member });
79
+ if (!memberHasPermission) {
80
+ if (doReply)
81
+ await this.reply(interaction, {
82
+ content: `You do not have permission to run this command, required permission: \`${index_js.PermissionLevel[permission]}\``
83
+ });
84
+ return false;
85
+ }
86
+ }
87
+ return true;
88
+ }
89
+ /**
90
+ * Reply to the interaction respecting command metadata and if the interaction has already been replied to.
91
+ *
92
+ * @async
93
+ * @param {ComponentInteraction} interaction
94
+ * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options
95
+ * @returns {*}
96
+ */
97
+ async reply(interaction, options) {
98
+ if (interaction.replied) {
99
+ await interaction.editReply(options);
100
+ return;
101
+ }
102
+ const newOptions = { ...options };
103
+ if (this.metadata.ephemeralReply) newOptions.flags = ["Ephemeral"];
104
+ await interaction.reply(newOptions);
105
+ }
106
+ }
107
+
108
+ exports.ComponentBuilder = ComponentBuilder;
109
+ exports.default = Component;
110
+ //# sourceMappingURL=component.base.cjs.map
111
+ //# sourceMappingURL=component.base.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/components/component.base.ts"],"names":["PermissionLevel","hasPermission"],"mappings":";;;;;;;AAuBO,MAAM,gBAAA,CAAiB;AAAA,EACrB,SAAA,GAAY,EAAA;AAAA,EACZ,cAAcA,wBAAA,CAAgB,IAAA;AAAA,EAC9B,eAAA,GAAkB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanB,YAAY,OAAA,EAIV;AACR,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK,GAAI,OAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,IAAA,GAAO,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,KAAK,EAAE,CAAA,CAAA;AACnE,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,cAAc,UAAA,EAAmC;AACvD,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAA,GAAQ;AACd,IAAA,OAAO;AAAA,MACN,QAAA,EAAU;AAAA,QACT,UAAU,IAAA,CAAK,SAAA;AAAA,QACf,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,gBAAgB,IAAA,CAAK;AAAA;AACtB,KACD;AAAA,EACD;AACD;AAUA,MAAO,SAAA,CAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBvC,MAAM,uBAAA,CACL,MAAA,EACA,WAAA,EACA,UAAA,EACA,UAAmB,IAAA,EAClB;AACD,IAAA,IAAI,YAAY,KAAA,EAAO;AACtB,MAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,MAAA,MAAM,sBAAsBC,0BAAA,CAAc,MAAA,EAAQ,EAAE,UAAA,EAAY,QAAQ,CAAA;AAExE,MAAA,IAAI,CAAC,mBAAA,EAAqB;AACzB,QAAA,IAAI,OAAA;AACH,UAAA,MAAM,IAAA,CAAK,MAAM,WAAA,EAAa;AAAA,YAC7B,OAAA,EAAS,CAAA,uEAAA,EAA0ED,wBAAA,CAAgB,UAAU,CAAC,CAAA,EAAA;AAAA,WAC9G,CAAA;AACF,QAAA,OAAO,KAAA;AAAA,MACR;AAAA,IACD;AAEA,IAAA,OAAO,IAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KAAA,CACL,WAAA,EACA,OAAA,EACC;AACD,IAAA,IAAI,YAAY,OAAA,EAAS;AACxB,MAAA,MAAM,WAAA,CAAY,UAAU,OAAsC,CAAA;AAClE,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,OAAA,EAAQ;AAChC,IAAA,IAAI,KAAK,QAAA,CAAS,cAAA,EAAgB,UAAA,CAAW,KAAA,GAAQ,CAAC,WAAW,CAAA;AAEjE,IAAA,MAAM,WAAA,CAAY,MAAM,UAAU,CAAA;AAAA,EACnC;AACD","file":"component.base.cjs","sourcesContent":["import {\n\tComponentType,\n\tGuildMember,\n\tInteractionEditReplyOptions,\n\tInteractionReplyOptions,\n\tMessagePayload,\n} from \"discord.js\";\nimport {\n\tComponentCustomIdTag,\n\tComponentInteraction,\n\tComponentMetadata,\n\tPermissionLevel,\n} from \"src/shared/typings/index.js\";\nimport { hasPermission } from \"src/shared/utility/functions.js\";\nimport TriviousClient from \"../client/trivious.client.js\";\n\n/**\n * Base ComponentBuilder.\n *\n * @export\n * @class ComponentBuilder\n * @typedef {ComponentBuilder}\n */\nexport class ComponentBuilder {\n\tprivate _customId = \"\";\n\tprivate _permission = PermissionLevel.USER;\n\tprivate _ephemeralReply = false;\n\n\t/**\n\t * Set the customId for the component.\n\t *\n\t * @public\n\t * @param {{\n\t * \t\ttype: ComponentType;\n\t * \t\tdata: string;\n\t * \t\ttags?: ComponentCustomIdTag[];\n\t * \t}} options\n\t * @returns {this}\n\t */\n\tpublic setCustomId(options: {\n\t\ttype: ComponentType;\n\t\tdata: string;\n\t\ttags?: ComponentCustomIdTag[];\n\t}): this {\n\t\tconst { data, type, tags } = options;\n\t\tthis._customId = `${type}:${data}${tags ? `.${tags.join(\".\")}` : \"\"}`;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the permission required to use the component.\n\t *\n\t * @public\n\t * @param {PermissionLevel} permission\n\t * @returns {this}\n\t */\n\tpublic setPermission(permission: PermissionLevel): this {\n\t\tthis._permission = permission;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Set the interaction as ephemeral.\n\t *\n\t * @public\n\t * @returns {this}\n\t */\n\tpublic setEphemeralReply(): this {\n\t\tthis._ephemeralReply = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Builder the builder.\n\t *\n\t * @public\n\t * @returns {{ metadata: ComponentMetadata; }}\n\t */\n\tpublic build() {\n\t\treturn {\n\t\t\tmetadata: {\n\t\t\t\tcustomId: this._customId,\n\t\t\t\tpermission: this._permission,\n\t\t\t\tephemeralReply: this._ephemeralReply,\n\t\t\t} satisfies ComponentMetadata,\n\t\t};\n\t}\n}\n\n/**\n * Base Component.\n *\n * @export\n * @abstract\n * @class Component\n * @typedef {Component}\n */\nexport default abstract class Component {\n\tabstract metadata: ComponentMetadata;\n\t/**\n\t * Execute the component.\n\t *\n\t * @abstract\n\t * @type {(client: TriviousClient, interaction: ComponentInteraction) => Promise<void>}\n\t */\n\tabstract execute: (client: TriviousClient, interaction: ComponentInteraction) => Promise<void>;\n\n\t/**\n\t * Validate permissions for a user/member in a guild.\n\t *\n\t * @async\n\t * @param {ComponentInteraction} interaction\n\t * @param {PermissionLevel} permission\n\t * @param {boolean} [doReply=true] Defaults to `true`\n\t * @returns {unknown}\n\t */\n\tasync validateGuildPermission(\n\t\tclient: TriviousClient,\n\t\tinteraction: ComponentInteraction,\n\t\tpermission: PermissionLevel,\n\t\tdoReply: boolean = true\n\t) {\n\t\tif (interaction.guild) {\n\t\t\tconst member = interaction.member as GuildMember;\n\t\t\tconst memberHasPermission = hasPermission(client, { permission, member });\n\n\t\t\tif (!memberHasPermission) {\n\t\t\t\tif (doReply)\n\t\t\t\t\tawait this.reply(interaction, {\n\t\t\t\t\t\tcontent: `You do not have permission to run this command, required permission: \\`${PermissionLevel[permission]}\\``,\n\t\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Reply to the interaction respecting command metadata and if the interaction has already been replied to.\n\t *\n\t * @async\n\t * @param {ComponentInteraction} interaction\n\t * @param {(MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions)} options\n\t * @returns {*}\n\t */\n\tasync reply(\n\t\tinteraction: ComponentInteraction,\n\t\toptions: MessagePayload | InteractionEditReplyOptions | InteractionReplyOptions\n\t) {\n\t\tif (interaction.replied) {\n\t\t\tawait interaction.editReply(options as InteractionEditReplyOptions);\n\t\t\treturn;\n\t\t}\n\n\t\tconst newOptions = { ...options } as InteractionReplyOptions;\n\t\tif (this.metadata.ephemeralReply) newOptions.flags = [\"Ephemeral\"];\n\n\t\tawait interaction.reply(newOptions);\n\t}\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import 'discord.js';
2
+ export { v as ComponentBuilder, u as default } from '../../index-BjPKCNAw.cjs';
3
+ import '../../shared/typings/registry.cjs';