baff.js 0.0.0-stage → 0.1.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 (262) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +7 -0
  3. package/README.md +244 -3
  4. package/dist/cjs/builders/EmbedBuilder.d.ts +51 -0
  5. package/dist/cjs/builders/EmbedBuilder.js +150 -0
  6. package/dist/cjs/builders/SlashCommandBuilder.d.ts +69 -0
  7. package/dist/cjs/builders/SlashCommandBuilder.js +185 -0
  8. package/dist/cjs/builders/components/ActionRowBuilder.d.ts +14 -0
  9. package/dist/cjs/builders/components/ActionRowBuilder.js +45 -0
  10. package/dist/cjs/builders/components/ButtonBuilder.d.ts +19 -0
  11. package/dist/cjs/builders/components/ButtonBuilder.js +69 -0
  12. package/dist/cjs/builders/components/LayoutBuilders.d.ts +63 -0
  13. package/dist/cjs/builders/components/LayoutBuilders.js +179 -0
  14. package/dist/cjs/builders/components/ModalBuilder.d.ts +36 -0
  15. package/dist/cjs/builders/components/ModalBuilder.js +118 -0
  16. package/dist/cjs/builders/components/SelectMenuBuilder.d.ts +80 -0
  17. package/dist/cjs/builders/components/SelectMenuBuilder.js +192 -0
  18. package/dist/cjs/builders/components/shared.d.ts +16 -0
  19. package/dist/cjs/builders/components/shared.js +32 -0
  20. package/dist/cjs/builders/messagePayload.d.ts +35 -0
  21. package/dist/cjs/builders/messagePayload.js +88 -0
  22. package/dist/cjs/builders/validate.d.ts +12 -0
  23. package/dist/cjs/builders/validate.js +54 -0
  24. package/dist/cjs/client/Client.d.ts +63 -0
  25. package/dist/cjs/client/Client.js +152 -0
  26. package/dist/cjs/client/dispatch.d.ts +2 -0
  27. package/dist/cjs/client/dispatch.js +224 -0
  28. package/dist/cjs/client/events.d.ts +129 -0
  29. package/dist/cjs/client/events.js +2 -0
  30. package/dist/cjs/collectors/Collector.d.ts +37 -0
  31. package/dist/cjs/collectors/Collector.js +84 -0
  32. package/dist/cjs/collectors/InteractionCollector.d.ts +21 -0
  33. package/dist/cjs/collectors/InteractionCollector.js +44 -0
  34. package/dist/cjs/collectors/MessageCollector.d.ts +14 -0
  35. package/dist/cjs/collectors/MessageCollector.js +23 -0
  36. package/dist/cjs/errors/BaffError.d.ts +26 -0
  37. package/dist/cjs/errors/BaffError.js +39 -0
  38. package/dist/cjs/gateway/Gateway.d.ts +53 -0
  39. package/dist/cjs/gateway/Gateway.js +128 -0
  40. package/dist/cjs/http/handler.d.ts +11 -0
  41. package/dist/cjs/http/handler.js +72 -0
  42. package/dist/cjs/http/verify.d.ts +11 -0
  43. package/dist/cjs/http/verify.js +28 -0
  44. package/dist/cjs/index.d.ts +51 -0
  45. package/dist/cjs/index.js +185 -0
  46. package/dist/cjs/managers/CachedManager.d.ts +16 -0
  47. package/dist/cjs/managers/CachedManager.js +18 -0
  48. package/dist/cjs/managers/ChannelManager.d.ts +23 -0
  49. package/dist/cjs/managers/ChannelManager.js +85 -0
  50. package/dist/cjs/managers/CommandManager.d.ts +32 -0
  51. package/dist/cjs/managers/CommandManager.js +72 -0
  52. package/dist/cjs/managers/EventManager.d.ts +15 -0
  53. package/dist/cjs/managers/EventManager.js +36 -0
  54. package/dist/cjs/managers/ExpressionManagers.d.ts +36 -0
  55. package/dist/cjs/managers/ExpressionManagers.js +73 -0
  56. package/dist/cjs/managers/InviteManager.d.ts +17 -0
  57. package/dist/cjs/managers/InviteManager.js +26 -0
  58. package/dist/cjs/managers/MemberManager.d.ts +31 -0
  59. package/dist/cjs/managers/MemberManager.js +62 -0
  60. package/dist/cjs/managers/MessageManager.d.ts +32 -0
  61. package/dist/cjs/managers/MessageManager.js +79 -0
  62. package/dist/cjs/managers/RoleManager.d.ts +22 -0
  63. package/dist/cjs/managers/RoleManager.js +73 -0
  64. package/dist/cjs/managers/ServerChannelManager.d.ts +20 -0
  65. package/dist/cjs/managers/ServerChannelManager.js +30 -0
  66. package/dist/cjs/managers/ServerManager.d.ts +12 -0
  67. package/dist/cjs/managers/ServerManager.js +62 -0
  68. package/dist/cjs/managers/ThreadManager.d.ts +12 -0
  69. package/dist/cjs/managers/ThreadManager.js +20 -0
  70. package/dist/cjs/managers/UserManager.d.ts +11 -0
  71. package/dist/cjs/managers/UserManager.js +38 -0
  72. package/dist/cjs/managers/VoiceManager.d.ts +8 -0
  73. package/dist/cjs/managers/VoiceManager.js +17 -0
  74. package/dist/cjs/package.json +1 -0
  75. package/dist/cjs/rest/REST.d.ts +58 -0
  76. package/dist/cjs/rest/REST.js +193 -0
  77. package/dist/cjs/rest/Routes.d.ts +54 -0
  78. package/dist/cjs/rest/Routes.js +58 -0
  79. package/dist/cjs/rest/files.d.ts +19 -0
  80. package/dist/cjs/rest/files.js +37 -0
  81. package/dist/cjs/structures/Base.d.ts +13 -0
  82. package/dist/cjs/structures/Base.js +30 -0
  83. package/dist/cjs/structures/Message.d.ts +91 -0
  84. package/dist/cjs/structures/Message.js +200 -0
  85. package/dist/cjs/structures/Role.d.ts +34 -0
  86. package/dist/cjs/structures/Role.js +84 -0
  87. package/dist/cjs/structures/ScheduledEvent.d.ts +37 -0
  88. package/dist/cjs/structures/ScheduledEvent.js +73 -0
  89. package/dist/cjs/structures/Server.d.ts +68 -0
  90. package/dist/cjs/structures/Server.js +124 -0
  91. package/dist/cjs/structures/ServerAssets.d.ts +48 -0
  92. package/dist/cjs/structures/ServerAssets.js +104 -0
  93. package/dist/cjs/structures/ServerMember.d.ts +47 -0
  94. package/dist/cjs/structures/ServerMember.js +138 -0
  95. package/dist/cjs/structures/User.d.ts +35 -0
  96. package/dist/cjs/structures/User.js +87 -0
  97. package/dist/cjs/structures/Webhook.d.ts +30 -0
  98. package/dist/cjs/structures/Webhook.js +68 -0
  99. package/dist/cjs/structures/channels/BaseChannel.d.ts +49 -0
  100. package/dist/cjs/structures/channels/BaseChannel.js +81 -0
  101. package/dist/cjs/structures/channels/DMChannel.d.ts +9 -0
  102. package/dist/cjs/structures/channels/DMChannel.js +21 -0
  103. package/dist/cjs/structures/channels/ServerChannels.d.ts +57 -0
  104. package/dist/cjs/structures/channels/ServerChannels.js +138 -0
  105. package/dist/cjs/structures/channels/TextBasedChannel.d.ts +25 -0
  106. package/dist/cjs/structures/channels/TextBasedChannel.js +53 -0
  107. package/dist/cjs/structures/interactions/BaseInteraction.d.ts +74 -0
  108. package/dist/cjs/structures/interactions/BaseInteraction.js +221 -0
  109. package/dist/cjs/structures/interactions/CommandInteraction.d.ts +44 -0
  110. package/dist/cjs/structures/interactions/CommandInteraction.js +109 -0
  111. package/dist/cjs/structures/interactions/ComponentInteraction.d.ts +44 -0
  112. package/dist/cjs/structures/interactions/ComponentInteraction.js +64 -0
  113. package/dist/cjs/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
  114. package/dist/cjs/structures/interactions/ModalSubmitInteraction.js +42 -0
  115. package/dist/cjs/structures/interactions/createInteraction.d.ts +4 -0
  116. package/dist/cjs/structures/interactions/createInteraction.js +34 -0
  117. package/dist/cjs/types.d.ts +369 -0
  118. package/dist/cjs/types.js +2 -0
  119. package/dist/cjs/util/Collection.d.ts +32 -0
  120. package/dist/cjs/util/Collection.js +145 -0
  121. package/dist/cjs/util/Permissions.d.ts +87 -0
  122. package/dist/cjs/util/Permissions.js +113 -0
  123. package/dist/cjs/util/Snowflake.d.ts +20 -0
  124. package/dist/cjs/util/Snowflake.js +40 -0
  125. package/dist/cjs/util/TypedEmitter.d.ts +17 -0
  126. package/dist/cjs/util/TypedEmitter.js +5 -0
  127. package/dist/cjs/util/constants.d.ts +78 -0
  128. package/dist/cjs/util/constants.js +81 -0
  129. package/dist/cjs/util/emoji.d.ts +8 -0
  130. package/dist/cjs/util/emoji.js +10 -0
  131. package/dist/cjs/util/formatters.d.ts +29 -0
  132. package/dist/cjs/util/formatters.js +55 -0
  133. package/dist/esm/builders/EmbedBuilder.d.ts +51 -0
  134. package/dist/esm/builders/EmbedBuilder.js +145 -0
  135. package/dist/esm/builders/SlashCommandBuilder.d.ts +69 -0
  136. package/dist/esm/builders/SlashCommandBuilder.js +170 -0
  137. package/dist/esm/builders/components/ActionRowBuilder.d.ts +14 -0
  138. package/dist/esm/builders/components/ActionRowBuilder.js +41 -0
  139. package/dist/esm/builders/components/ButtonBuilder.d.ts +19 -0
  140. package/dist/esm/builders/components/ButtonBuilder.js +65 -0
  141. package/dist/esm/builders/components/LayoutBuilders.d.ts +63 -0
  142. package/dist/esm/builders/components/LayoutBuilders.js +169 -0
  143. package/dist/esm/builders/components/ModalBuilder.d.ts +36 -0
  144. package/dist/esm/builders/components/ModalBuilder.js +113 -0
  145. package/dist/esm/builders/components/SelectMenuBuilder.d.ts +80 -0
  146. package/dist/esm/builders/components/SelectMenuBuilder.js +183 -0
  147. package/dist/esm/builders/components/shared.d.ts +16 -0
  148. package/dist/esm/builders/components/shared.js +26 -0
  149. package/dist/esm/builders/messagePayload.d.ts +35 -0
  150. package/dist/esm/builders/messagePayload.js +83 -0
  151. package/dist/esm/builders/validate.d.ts +12 -0
  152. package/dist/esm/builders/validate.js +46 -0
  153. package/dist/esm/client/Client.d.ts +63 -0
  154. package/dist/esm/client/Client.js +147 -0
  155. package/dist/esm/client/dispatch.d.ts +2 -0
  156. package/dist/esm/client/dispatch.js +221 -0
  157. package/dist/esm/client/events.d.ts +129 -0
  158. package/dist/esm/client/events.js +1 -0
  159. package/dist/esm/collectors/Collector.d.ts +37 -0
  160. package/dist/esm/collectors/Collector.js +78 -0
  161. package/dist/esm/collectors/InteractionCollector.d.ts +21 -0
  162. package/dist/esm/collectors/InteractionCollector.js +40 -0
  163. package/dist/esm/collectors/MessageCollector.d.ts +14 -0
  164. package/dist/esm/collectors/MessageCollector.js +19 -0
  165. package/dist/esm/errors/BaffError.d.ts +26 -0
  166. package/dist/esm/errors/BaffError.js +33 -0
  167. package/dist/esm/gateway/Gateway.d.ts +53 -0
  168. package/dist/esm/gateway/Gateway.js +124 -0
  169. package/dist/esm/http/handler.d.ts +11 -0
  170. package/dist/esm/http/handler.js +68 -0
  171. package/dist/esm/http/verify.d.ts +11 -0
  172. package/dist/esm/http/verify.js +22 -0
  173. package/dist/esm/index.d.ts +51 -0
  174. package/dist/esm/index.js +49 -0
  175. package/dist/esm/managers/CachedManager.d.ts +16 -0
  176. package/dist/esm/managers/CachedManager.js +14 -0
  177. package/dist/esm/managers/ChannelManager.d.ts +23 -0
  178. package/dist/esm/managers/ChannelManager.js +81 -0
  179. package/dist/esm/managers/CommandManager.d.ts +32 -0
  180. package/dist/esm/managers/CommandManager.js +67 -0
  181. package/dist/esm/managers/EventManager.d.ts +15 -0
  182. package/dist/esm/managers/EventManager.js +32 -0
  183. package/dist/esm/managers/ExpressionManagers.d.ts +36 -0
  184. package/dist/esm/managers/ExpressionManagers.js +68 -0
  185. package/dist/esm/managers/InviteManager.d.ts +17 -0
  186. package/dist/esm/managers/InviteManager.js +22 -0
  187. package/dist/esm/managers/MemberManager.d.ts +31 -0
  188. package/dist/esm/managers/MemberManager.js +58 -0
  189. package/dist/esm/managers/MessageManager.d.ts +32 -0
  190. package/dist/esm/managers/MessageManager.js +75 -0
  191. package/dist/esm/managers/RoleManager.d.ts +22 -0
  192. package/dist/esm/managers/RoleManager.js +69 -0
  193. package/dist/esm/managers/ServerChannelManager.d.ts +20 -0
  194. package/dist/esm/managers/ServerChannelManager.js +26 -0
  195. package/dist/esm/managers/ServerManager.d.ts +12 -0
  196. package/dist/esm/managers/ServerManager.js +58 -0
  197. package/dist/esm/managers/ThreadManager.d.ts +12 -0
  198. package/dist/esm/managers/ThreadManager.js +16 -0
  199. package/dist/esm/managers/UserManager.d.ts +11 -0
  200. package/dist/esm/managers/UserManager.js +34 -0
  201. package/dist/esm/managers/VoiceManager.d.ts +8 -0
  202. package/dist/esm/managers/VoiceManager.js +13 -0
  203. package/dist/esm/package.json +1 -0
  204. package/dist/esm/rest/REST.d.ts +58 -0
  205. package/dist/esm/rest/REST.js +188 -0
  206. package/dist/esm/rest/Routes.d.ts +54 -0
  207. package/dist/esm/rest/Routes.js +55 -0
  208. package/dist/esm/rest/files.d.ts +19 -0
  209. package/dist/esm/rest/files.js +31 -0
  210. package/dist/esm/structures/Base.d.ts +13 -0
  211. package/dist/esm/structures/Base.js +25 -0
  212. package/dist/esm/structures/Message.d.ts +91 -0
  213. package/dist/esm/structures/Message.js +194 -0
  214. package/dist/esm/structures/Role.d.ts +34 -0
  215. package/dist/esm/structures/Role.js +79 -0
  216. package/dist/esm/structures/ScheduledEvent.d.ts +37 -0
  217. package/dist/esm/structures/ScheduledEvent.js +68 -0
  218. package/dist/esm/structures/Server.d.ts +68 -0
  219. package/dist/esm/structures/Server.js +120 -0
  220. package/dist/esm/structures/ServerAssets.d.ts +48 -0
  221. package/dist/esm/structures/ServerAssets.js +98 -0
  222. package/dist/esm/structures/ServerMember.d.ts +47 -0
  223. package/dist/esm/structures/ServerMember.js +133 -0
  224. package/dist/esm/structures/User.d.ts +35 -0
  225. package/dist/esm/structures/User.js +82 -0
  226. package/dist/esm/structures/Webhook.d.ts +30 -0
  227. package/dist/esm/structures/Webhook.js +63 -0
  228. package/dist/esm/structures/channels/BaseChannel.d.ts +49 -0
  229. package/dist/esm/structures/channels/BaseChannel.js +77 -0
  230. package/dist/esm/structures/channels/DMChannel.d.ts +9 -0
  231. package/dist/esm/structures/channels/DMChannel.js +17 -0
  232. package/dist/esm/structures/channels/ServerChannels.d.ts +57 -0
  233. package/dist/esm/structures/channels/ServerChannels.js +129 -0
  234. package/dist/esm/structures/channels/TextBasedChannel.d.ts +25 -0
  235. package/dist/esm/structures/channels/TextBasedChannel.js +49 -0
  236. package/dist/esm/structures/interactions/BaseInteraction.d.ts +74 -0
  237. package/dist/esm/structures/interactions/BaseInteraction.js +217 -0
  238. package/dist/esm/structures/interactions/CommandInteraction.d.ts +44 -0
  239. package/dist/esm/structures/interactions/CommandInteraction.js +104 -0
  240. package/dist/esm/structures/interactions/ComponentInteraction.d.ts +44 -0
  241. package/dist/esm/structures/interactions/ComponentInteraction.js +53 -0
  242. package/dist/esm/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
  243. package/dist/esm/structures/interactions/ModalSubmitInteraction.js +37 -0
  244. package/dist/esm/structures/interactions/createInteraction.d.ts +4 -0
  245. package/dist/esm/structures/interactions/createInteraction.js +31 -0
  246. package/dist/esm/types.d.ts +369 -0
  247. package/dist/esm/types.js +1 -0
  248. package/dist/esm/util/Collection.d.ts +32 -0
  249. package/dist/esm/util/Collection.js +141 -0
  250. package/dist/esm/util/Permissions.d.ts +87 -0
  251. package/dist/esm/util/Permissions.js +109 -0
  252. package/dist/esm/util/Snowflake.d.ts +20 -0
  253. package/dist/esm/util/Snowflake.js +37 -0
  254. package/dist/esm/util/TypedEmitter.d.ts +17 -0
  255. package/dist/esm/util/TypedEmitter.js +2 -0
  256. package/dist/esm/util/constants.d.ts +78 -0
  257. package/dist/esm/util/constants.js +78 -0
  258. package/dist/esm/util/emoji.d.ts +8 -0
  259. package/dist/esm/util/emoji.js +7 -0
  260. package/dist/esm/util/formatters.d.ts +29 -0
  261. package/dist/esm/util/formatters.js +34 -0
  262. package/package.json +58 -6
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Collector = exports.CollectorError = void 0;
4
+ exports.awaitCollector = awaitCollector;
5
+ const BaffError_js_1 = require("../errors/BaffError.js");
6
+ const Collection_js_1 = require("../util/Collection.js");
7
+ const TypedEmitter_js_1 = require("../util/TypedEmitter.js");
8
+ class CollectorError extends BaffError_js_1.BaffError {
9
+ collected;
10
+ reason;
11
+ constructor(collected, reason) {
12
+ super('COLLECTOR_ENDED', `The collector ended with reason "${reason}".`);
13
+ this.collected = collected;
14
+ this.reason = reason;
15
+ this.name = 'CollectorError';
16
+ }
17
+ }
18
+ exports.CollectorError = CollectorError;
19
+ class Collector extends TypedEmitter_js_1.TypedEmitter {
20
+ options;
21
+ collected = new Collection_js_1.Collection();
22
+ ended = false;
23
+ endReason = null;
24
+ processed = 0;
25
+ timer = null;
26
+ idleTimer = null;
27
+ constructor(options = {}) {
28
+ super();
29
+ this.options = options;
30
+ if (options.time)
31
+ this.timer = setTimeout(() => this.stop('time'), options.time);
32
+ this.resetIdle();
33
+ }
34
+ async handle(item) {
35
+ if (this.ended)
36
+ return;
37
+ this.processed++;
38
+ const pass = this.options.filter ? await this.options.filter(item, this.collected) : true;
39
+ if (this.ended)
40
+ return;
41
+ if (pass) {
42
+ this.collected.set(this.keyOf(item), item);
43
+ this.emit('collect', item);
44
+ this.resetIdle();
45
+ }
46
+ else {
47
+ this.emit('ignore', item);
48
+ }
49
+ if (this.options.max && this.collected.size >= this.options.max)
50
+ this.stop('limit');
51
+ else if (this.options.maxProcessed && this.processed >= this.options.maxProcessed)
52
+ this.stop('processedLimit');
53
+ }
54
+ stop(reason = 'user') {
55
+ if (this.ended)
56
+ return;
57
+ this.ended = true;
58
+ this.endReason = reason;
59
+ if (this.timer)
60
+ clearTimeout(this.timer);
61
+ if (this.idleTimer)
62
+ clearTimeout(this.idleTimer);
63
+ this.cleanup();
64
+ this.emit('end', this.collected, reason);
65
+ }
66
+ resetIdle() {
67
+ if (!this.options.idle)
68
+ return;
69
+ if (this.idleTimer)
70
+ clearTimeout(this.idleTimer);
71
+ this.idleTimer = setTimeout(() => this.stop('idle'), this.options.idle);
72
+ }
73
+ }
74
+ exports.Collector = Collector;
75
+ function awaitCollector(collector, errors = []) {
76
+ return new Promise((resolve, reject) => {
77
+ collector.once('end', (collected, reason) => {
78
+ if (errors.includes(reason))
79
+ reject(new CollectorError(collected, reason));
80
+ else
81
+ resolve(collected);
82
+ });
83
+ });
84
+ }
@@ -0,0 +1,21 @@
1
+ import type { Client } from '../client/Client.js';
2
+ import type { BaseInteraction } from '../structures/interactions/BaseInteraction.js';
3
+ import { Collector, type CollectorOptions } from './Collector.js';
4
+ export interface InteractionCollectorOptions extends CollectorOptions<BaseInteraction> {
5
+ channelId?: string;
6
+ serverId?: string;
7
+ messageId?: string;
8
+ customId?: string;
9
+ componentType?: number;
10
+ userId?: string;
11
+ interactionType?: 'component' | 'modal_submit' | 'command';
12
+ }
13
+ export declare class InteractionCollector extends Collector<BaseInteraction> {
14
+ private readonly client;
15
+ private readonly criteria;
16
+ private readonly listener;
17
+ constructor(client: Client, criteria?: InteractionCollectorOptions);
18
+ protected keyOf(interaction: BaseInteraction): string;
19
+ protected cleanup(): void;
20
+ private matches;
21
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InteractionCollector = void 0;
4
+ const Collector_js_1 = require("./Collector.js");
5
+ class InteractionCollector extends Collector_js_1.Collector {
6
+ client;
7
+ criteria;
8
+ listener = (interaction) => {
9
+ if (this.matches(interaction))
10
+ void this.handle(interaction);
11
+ };
12
+ constructor(client, criteria = {}) {
13
+ super(criteria);
14
+ this.client = client;
15
+ this.criteria = criteria;
16
+ client.on('interactionCreate', this.listener);
17
+ }
18
+ keyOf(interaction) {
19
+ return interaction.id;
20
+ }
21
+ cleanup() {
22
+ this.client.off('interactionCreate', this.listener);
23
+ }
24
+ matches(i) {
25
+ const c = this.criteria;
26
+ const kind = c.interactionType ?? 'component';
27
+ if (kind === 'component' ? !i.isMessageComponent() : kind === 'modal_submit' ? !i.isModalSubmit() : !i.isChatInputCommand())
28
+ return false;
29
+ if (c.channelId && i.channelId !== c.channelId)
30
+ return false;
31
+ if (c.serverId && i.serverId !== c.serverId)
32
+ return false;
33
+ if (c.userId && i.user.id !== c.userId)
34
+ return false;
35
+ if (c.messageId && i.message?.id !== c.messageId)
36
+ return false;
37
+ if (c.customId && (i.isMessageComponent() || i.isModalSubmit() ? i.customId : null) !== c.customId)
38
+ return false;
39
+ if (c.componentType !== undefined && (!i.isMessageComponent() || i.componentType !== c.componentType))
40
+ return false;
41
+ return true;
42
+ }
43
+ }
44
+ exports.InteractionCollector = InteractionCollector;
@@ -0,0 +1,14 @@
1
+ import type { TextBasedChannel } from '../structures/channels/TextBasedChannel.js';
2
+ import type { Message } from '../structures/Message.js';
3
+ import { Collector, type CollectorOptions } from './Collector.js';
4
+ export type MessageCollectorOptions = CollectorOptions<Message>;
5
+ export interface AwaitMessagesOptions extends MessageCollectorOptions {
6
+ errors?: string[];
7
+ }
8
+ export declare class MessageCollector extends Collector<Message> {
9
+ readonly channel: TextBasedChannel;
10
+ private readonly listener;
11
+ constructor(channel: TextBasedChannel, options?: MessageCollectorOptions);
12
+ protected keyOf(message: Message): string;
13
+ protected cleanup(): void;
14
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageCollector = void 0;
4
+ const Collector_js_1 = require("./Collector.js");
5
+ class MessageCollector extends Collector_js_1.Collector {
6
+ channel;
7
+ listener = (message) => {
8
+ if (message.channelId === this.channel.id)
9
+ void this.handle(message);
10
+ };
11
+ constructor(channel, options = {}) {
12
+ super(options);
13
+ this.channel = channel;
14
+ channel.client.on('messageCreate', this.listener);
15
+ }
16
+ keyOf(message) {
17
+ return message.id;
18
+ }
19
+ cleanup() {
20
+ this.channel.client.off('messageCreate', this.listener);
21
+ }
22
+ }
23
+ exports.MessageCollector = MessageCollector;
@@ -0,0 +1,26 @@
1
+ export declare class BaffError extends Error {
2
+ readonly code: string;
3
+ constructor(code: string, message: string, options?: {
4
+ cause?: unknown;
5
+ });
6
+ }
7
+ export interface APIErrorBody {
8
+ error?: {
9
+ code?: string;
10
+ message?: string;
11
+ field?: string | null;
12
+ limitedUntil?: string;
13
+ };
14
+ }
15
+ export declare class BaffAPIError extends BaffError {
16
+ readonly status: number;
17
+ readonly method: string;
18
+ readonly path: string;
19
+ readonly field: string | null;
20
+ readonly body: unknown;
21
+ constructor(status: number, method: string, path: string, body: unknown);
22
+ }
23
+ export declare class BaffRateLimitError extends BaffAPIError {
24
+ readonly retryAfter: number;
25
+ constructor(method: string, path: string, body: unknown, retryAfter: number);
26
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaffRateLimitError = exports.BaffAPIError = exports.BaffError = void 0;
4
+ class BaffError extends Error {
5
+ code;
6
+ constructor(code, message, options) {
7
+ super(message, options);
8
+ this.name = 'BaffError';
9
+ this.code = code;
10
+ }
11
+ }
12
+ exports.BaffError = BaffError;
13
+ class BaffAPIError extends BaffError {
14
+ status;
15
+ method;
16
+ path;
17
+ field;
18
+ body;
19
+ constructor(status, method, path, body) {
20
+ const detail = body?.error;
21
+ super(detail?.code ?? `HTTP_${status}`, detail?.message ?? `${method} ${path} failed with status ${status}.`);
22
+ this.name = 'BaffAPIError';
23
+ this.status = status;
24
+ this.method = method;
25
+ this.path = path;
26
+ this.field = detail?.field ?? null;
27
+ this.body = body;
28
+ }
29
+ }
30
+ exports.BaffAPIError = BaffAPIError;
31
+ class BaffRateLimitError extends BaffAPIError {
32
+ retryAfter;
33
+ constructor(method, path, body, retryAfter) {
34
+ super(429, method, path, body);
35
+ this.name = 'BaffRateLimitError';
36
+ this.retryAfter = retryAfter;
37
+ }
38
+ }
39
+ exports.BaffRateLimitError = BaffRateLimitError;
@@ -0,0 +1,53 @@
1
+ import { TypedEmitter } from '../util/TypedEmitter.js';
2
+ export interface WebSocketLike {
3
+ readyState: number;
4
+ close(code?: number, reason?: string): void;
5
+ onopen: ((event: unknown) => void) | null;
6
+ onmessage: ((event: {
7
+ data: unknown;
8
+ }) => void) | null;
9
+ onclose: ((event: {
10
+ code: number;
11
+ reason: string;
12
+ }) => void) | null;
13
+ onerror: ((event: unknown) => void) | null;
14
+ }
15
+ export type WebSocketConstructor = new (url: string, options?: {
16
+ headers?: Record<string, string>;
17
+ }) => WebSocketLike;
18
+ export interface GatewayOptions {
19
+ url?: string;
20
+ token: string;
21
+ WebSocket?: WebSocketConstructor;
22
+ reconnect?: boolean;
23
+ initialBackoff?: number;
24
+ maxBackoff?: number;
25
+ }
26
+ type GatewayEvents = {
27
+ dispatch: [event: string, data: unknown];
28
+ ready: [data: unknown];
29
+ reconnected: [data: unknown];
30
+ disconnect: [code: number, reason: string];
31
+ reconnecting: [attempt: number, delay: number];
32
+ debug: [message: string];
33
+ };
34
+ export declare class Gateway extends TypedEmitter<GatewayEvents> {
35
+ private readonly options;
36
+ private socket;
37
+ private timer;
38
+ private attempt;
39
+ private destroyed;
40
+ private everReady;
41
+ private readonly url;
42
+ private readonly WebSocketImpl;
43
+ private readonly reconnect;
44
+ private readonly initialBackoff;
45
+ private readonly maxBackoff;
46
+ constructor(options: GatewayOptions);
47
+ get connected(): boolean;
48
+ connect(): Promise<unknown>;
49
+ destroy(code?: number, reason?: string): void;
50
+ private open;
51
+ private scheduleReconnect;
52
+ }
53
+ export {};
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Gateway = void 0;
4
+ const BaffError_js_1 = require("../errors/BaffError.js");
5
+ const constants_js_1 = require("../util/constants.js");
6
+ const TypedEmitter_js_1 = require("../util/TypedEmitter.js");
7
+ const OPEN = 1;
8
+ class Gateway extends TypedEmitter_js_1.TypedEmitter {
9
+ options;
10
+ socket = null;
11
+ timer = null;
12
+ attempt = 0;
13
+ destroyed = false;
14
+ everReady = false;
15
+ url;
16
+ WebSocketImpl;
17
+ reconnect;
18
+ initialBackoff;
19
+ maxBackoff;
20
+ constructor(options) {
21
+ super();
22
+ this.options = options;
23
+ this.url = options.url ?? constants_js_1.DEFAULT_GATEWAY_URL;
24
+ this.reconnect = options.reconnect ?? true;
25
+ this.initialBackoff = options.initialBackoff ?? 1000;
26
+ this.maxBackoff = options.maxBackoff ?? 30_000;
27
+ this.WebSocketImpl = options.WebSocket ?? defaultWebSocket();
28
+ }
29
+ get connected() {
30
+ return this.socket?.readyState === OPEN;
31
+ }
32
+ connect() {
33
+ this.destroyed = false;
34
+ return new Promise((resolve, reject) => this.open(resolve, reject));
35
+ }
36
+ destroy(code = 1000, reason = 'client destroyed') {
37
+ this.destroyed = true;
38
+ if (this.timer)
39
+ clearTimeout(this.timer);
40
+ this.timer = null;
41
+ const socket = this.socket;
42
+ this.socket = null;
43
+ if (!socket)
44
+ return;
45
+ socket.onclose = socket.onerror = socket.onmessage = socket.onopen = null;
46
+ try {
47
+ socket.close(code, reason);
48
+ }
49
+ catch {
50
+ // already closed
51
+ }
52
+ }
53
+ open(resolve, reject) {
54
+ let socket;
55
+ try {
56
+ socket = new this.WebSocketImpl(this.url, { headers: { Authorization: `Bot ${this.options.token}` } });
57
+ }
58
+ catch (cause) {
59
+ const error = new BaffError_js_1.BaffError('GATEWAY_CONNECT', `Could not open the gateway: ${cause.message}`, { cause });
60
+ if (reject && !this.everReady)
61
+ return reject(error);
62
+ return this.scheduleReconnect(resolve, reject);
63
+ }
64
+ this.socket = socket;
65
+ let settled = false;
66
+ socket.onmessage = (event) => {
67
+ const frame = parseFrame(event.data);
68
+ if (!frame)
69
+ return;
70
+ if (frame.t === 'READY') {
71
+ const first = !this.everReady;
72
+ this.everReady = true;
73
+ this.attempt = 0;
74
+ settled = true;
75
+ this.emit(first ? 'ready' : 'reconnected', frame.d);
76
+ resolve?.(frame.d);
77
+ return;
78
+ }
79
+ this.emit('dispatch', frame.t, frame.d);
80
+ };
81
+ socket.onerror = () => {
82
+ this.emit('debug', 'socket error');
83
+ };
84
+ socket.onclose = (event) => {
85
+ if (this.socket !== socket)
86
+ return;
87
+ this.socket = null;
88
+ this.emit('disconnect', event.code, event.reason);
89
+ if (this.destroyed)
90
+ return;
91
+ if (!settled && !this.everReady && reject) {
92
+ reject(new BaffError_js_1.BaffError('GATEWAY_CONNECT', `The gateway closed the connection before READY (code ${event.code}). Check the token and the gateway URL.`));
93
+ return;
94
+ }
95
+ this.scheduleReconnect(resolve, reject);
96
+ };
97
+ }
98
+ scheduleReconnect(resolve, reject) {
99
+ if (!this.reconnect || this.destroyed)
100
+ return;
101
+ const delay = Math.min(this.initialBackoff * 2 ** this.attempt, this.maxBackoff);
102
+ this.attempt++;
103
+ this.emit('reconnecting', this.attempt, delay);
104
+ this.timer = setTimeout(() => {
105
+ this.timer = null;
106
+ if (!this.destroyed)
107
+ this.open(resolve, reject);
108
+ }, delay);
109
+ }
110
+ }
111
+ exports.Gateway = Gateway;
112
+ function parseFrame(data) {
113
+ const text = typeof data === 'string' ? data : data instanceof ArrayBuffer ? new TextDecoder().decode(data) : String(data);
114
+ try {
115
+ const frame = JSON.parse(text);
116
+ return typeof frame.t === 'string' ? { t: frame.t, d: frame.d } : null;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ function defaultWebSocket() {
123
+ const ctor = globalThis.WebSocket;
124
+ if (typeof ctor !== 'function') {
125
+ throw new BaffError_js_1.BaffError('NO_WEBSOCKET', 'This runtime has no global WebSocket. Use Node 22+, Bun or Deno, run Node 20 with --experimental-websocket, or pass the ws package as the WebSocket option.');
126
+ }
127
+ return ctor;
128
+ }
@@ -0,0 +1,11 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { Client } from '../client/Client.js';
3
+ import { type VerifyOptions } from './verify.js';
4
+ export interface InteractionsHandlerOptions extends VerifyOptions {
5
+ secret: string;
6
+ client?: Client;
7
+ answerWithinMs?: number;
8
+ }
9
+ export type InteractionsHandler = (request: Request) => Promise<Response>;
10
+ export declare function createInteractionsHandler(options: InteractionsHandlerOptions): InteractionsHandler;
11
+ export declare function toNodeListener(handler: InteractionsHandler): (req: IncomingMessage, res: ServerResponse) => void;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInteractionsHandler = createInteractionsHandler;
4
+ exports.toNodeListener = toNodeListener;
5
+ const Client_js_1 = require("../client/Client.js");
6
+ const createInteraction_js_1 = require("../structures/interactions/createInteraction.js");
7
+ const verify_js_1 = require("./verify.js");
8
+ function createInteractionsHandler(options) {
9
+ const client = options.client ?? new Client_js_1.Client();
10
+ const answerWithinMs = options.answerWithinMs ?? 2800;
11
+ return async (request) => {
12
+ if (request.method !== 'POST')
13
+ return new Response('method not allowed', { status: 405 });
14
+ const body = await request.text();
15
+ if (!(0, verify_js_1.verifyRequestHeaders)(request.headers, body, options.secret, options))
16
+ return new Response('bad signature', { status: 401 });
17
+ let raw;
18
+ try {
19
+ raw = JSON.parse(body);
20
+ }
21
+ catch {
22
+ return new Response('bad request', { status: 400 });
23
+ }
24
+ if (raw.type === 'ping')
25
+ return Response.json({ type: 'pong' });
26
+ client.setApplicationId(raw.applicationId);
27
+ let respond;
28
+ const answered = new Promise((resolve) => (respond = resolve));
29
+ const timeout = new Promise((resolve) => {
30
+ const timer = setTimeout(() => resolve(new Response(null, { status: 200 })), answerWithinMs);
31
+ void answered.then(() => clearTimeout(timer));
32
+ });
33
+ try {
34
+ const interaction = (0, createInteraction_js_1.createInteraction)(client, raw);
35
+ interaction._setSink((answer) => respond(Response.json(answer)));
36
+ client.emit('interactionCreate', interaction);
37
+ const response = await Promise.race([answered, timeout]);
38
+ interaction._setSink(null);
39
+ return response;
40
+ }
41
+ catch (error) {
42
+ client.emit('debug', `Interaction handler failed: ${error.message}`);
43
+ return new Response('internal error', { status: 500 });
44
+ }
45
+ };
46
+ }
47
+ function toNodeListener(handler) {
48
+ return (req, res) => {
49
+ const chunks = [];
50
+ req.on('data', (chunk) => chunks.push(chunk));
51
+ req.on('end', () => {
52
+ const headers = new Headers();
53
+ for (const [key, value] of Object.entries(req.headers)) {
54
+ if (Array.isArray(value))
55
+ value.forEach((v) => headers.append(key, v));
56
+ else if (value !== undefined)
57
+ headers.set(key, value);
58
+ }
59
+ const request = new Request(`http://${req.headers.host ?? 'localhost'}${req.url ?? '/'}`, {
60
+ method: req.method,
61
+ headers,
62
+ body: req.method === 'GET' || req.method === 'HEAD' ? undefined : Buffer.concat(chunks)
63
+ });
64
+ handler(request).then(async (response) => {
65
+ res.writeHead(response.status, Object.fromEntries(response.headers));
66
+ res.end(Buffer.from(await response.arrayBuffer()));
67
+ }, () => {
68
+ res.writeHead(500).end('internal error');
69
+ });
70
+ });
71
+ };
72
+ }
@@ -0,0 +1,11 @@
1
+ export declare const SIGNATURE_HEADERS: readonly ["x-bafflux-signature", "x-baff.gg-signature"];
2
+ export declare const TIMESTAMP_HEADERS: readonly ["x-bafflux-timestamp", "x-baff.gg-timestamp"];
3
+ export interface VerifyOptions {
4
+ toleranceSeconds?: number;
5
+ now?: () => number;
6
+ }
7
+ export declare function sign(secret: string, timestamp: string | number, body: string | Uint8Array): string;
8
+ export declare function verifyKey(body: string | Uint8Array, signature: string | null | undefined, timestamp: string | null | undefined, secret: string, options?: VerifyOptions): boolean;
9
+ export declare function verifyRequestHeaders(headers: {
10
+ get(name: string): string | null;
11
+ }, body: string | Uint8Array, secret: string, options?: VerifyOptions): boolean;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TIMESTAMP_HEADERS = exports.SIGNATURE_HEADERS = void 0;
4
+ exports.sign = sign;
5
+ exports.verifyKey = verifyKey;
6
+ exports.verifyRequestHeaders = verifyRequestHeaders;
7
+ const node_crypto_1 = require("node:crypto");
8
+ exports.SIGNATURE_HEADERS = ['x-bafflux-signature', 'x-baff.gg-signature'];
9
+ exports.TIMESTAMP_HEADERS = ['x-bafflux-timestamp', 'x-baff.gg-timestamp'];
10
+ function sign(secret, timestamp, body) {
11
+ return (0, node_crypto_1.createHmac)('sha256', secret).update(`${timestamp}.`).update(body).digest('hex');
12
+ }
13
+ function verifyKey(body, signature, timestamp, secret, options = {}) {
14
+ if (!signature || !timestamp || !secret)
15
+ return false;
16
+ if (!/^\d{1,12}$/.test(timestamp))
17
+ return false;
18
+ const now = (options.now ?? Date.now)() / 1000;
19
+ if (Math.abs(now - Number(timestamp)) > (options.toleranceSeconds ?? 300))
20
+ return false;
21
+ const expected = Buffer.from(sign(secret, timestamp, body), 'hex');
22
+ const given = Buffer.from(signature, 'hex');
23
+ return given.length === expected.length && (0, node_crypto_1.timingSafeEqual)(given, expected);
24
+ }
25
+ function verifyRequestHeaders(headers, body, secret, options) {
26
+ const find = (names) => names.map((name) => headers.get(name)).find((value) => value !== null) ?? null;
27
+ return verifyKey(body, find(exports.SIGNATURE_HEADERS), find(exports.TIMESTAMP_HEADERS), secret, options);
28
+ }
@@ -0,0 +1,51 @@
1
+ export { Client, ClientApplication, type ClientOptions } from './client/Client.js';
2
+ export type { ClientEvents, MemberRemoval, MentionEvent, MessageDeleteEvent, MessagePinEvent, PresenceEvent, ReactionEvent, ServerRemoval, TypingEvent } from './client/events.js';
3
+ export { REST, bucketKey, type HTTPMethod, type RateLimitInfo, type RequestOptions, type RESTOptions } from './rest/REST.js';
4
+ export { Routes } from './rest/Routes.js';
5
+ export { AttachmentBuilder, type FileData, type RawFile } from './rest/files.js';
6
+ export { Gateway, type GatewayOptions, type WebSocketConstructor, type WebSocketLike } from './gateway/Gateway.js';
7
+ export { BaffAPIError, BaffError, BaffRateLimitError } from './errors/BaffError.js';
8
+ export { Collection } from './util/Collection.js';
9
+ export { Snowflake, type DeconstructedSnowflake, type SnowflakeParts } from './util/Snowflake.js';
10
+ export { PermissionFlagsBits, PermissionsBitField, type PermissionResolvable, type PermissionString } from './util/Permissions.js';
11
+ export * from './util/formatters.js';
12
+ export { resolveEmoji, type EmojiResolvable } from './util/emoji.js';
13
+ export { ApplicationCommandOptionType, ButtonStyle, ChannelType, Colors, ComponentType, DEFAULT_API_URL, DEFAULT_GATEWAY_URL, MessageFlags, PresenceStatus, SeparatorSpacing, TextInputStyle, VERSION } from './util/constants.js';
14
+ export { EmbedBuilder, EmbedLimits, resolveColor, type ColorResolvable } from './builders/EmbedBuilder.js';
15
+ export { ActionRowBuilder } from './builders/components/ActionRowBuilder.js';
16
+ export { ButtonBuilder } from './builders/components/ButtonBuilder.js';
17
+ export { ChannelSelectMenuBuilder, MentionableSelectMenuBuilder, RoleSelectMenuBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, UserSelectMenuBuilder, type SelectOptionData } from './builders/components/SelectMenuBuilder.js';
18
+ export { ModalBuilder, TextInputBuilder } from './builders/components/ModalBuilder.js';
19
+ export { ContainerBuilder, MediaGalleryBuilder, MediaGalleryItemBuilder, SectionBuilder, SeparatorBuilder, TextDisplayBuilder, ThumbnailBuilder } from './builders/components/LayoutBuilders.js';
20
+ export { BooleanOption, ChannelOption, IntegerOption, NumberOption, PrefixCommandBuilder, RoleOption, SlashCommandBuilder, StringOption, SubcommandBuilder, SubcommandGroupBuilder, UserOption } from './builders/SlashCommandBuilder.js';
21
+ export { checkComponents, resolveEmbeds, resolveMessage, type MessageOptions, type PollData, type ResolvedMessage } from './builders/messagePayload.js';
22
+ export { Collector, CollectorError, awaitCollector, type CollectorOptions } from './collectors/Collector.js';
23
+ export { InteractionCollector, type InteractionCollectorOptions } from './collectors/InteractionCollector.js';
24
+ export { MessageCollector, type AwaitMessagesOptions, type MessageCollectorOptions } from './collectors/MessageCollector.js';
25
+ export { createInteractionsHandler, toNodeListener, type InteractionsHandler, type InteractionsHandlerOptions } from './http/handler.js';
26
+ export { sign as signInteractionBody, verifyKey, verifyRequestHeaders, type VerifyOptions } from './http/verify.js';
27
+ export { CachedManager, type FetchOptions } from './managers/CachedManager.js';
28
+ export { ApplicationCommand, ApplicationCommandManager } from './managers/CommandManager.js';
29
+ export { MessageManager, type FetchMessagesOptions } from './managers/MessageManager.js';
30
+ export { MemberManager, type Ban } from './managers/MemberManager.js';
31
+ export { RoleManager } from './managers/RoleManager.js';
32
+ export { ServerChannelManager, type CreateChannelOptions } from './managers/ServerChannelManager.js';
33
+ export { InviteManager, type CreateInviteOptions } from './managers/InviteManager.js';
34
+ export { BaseChannel, type ChannelEditData } from './structures/channels/BaseChannel.js';
35
+ export { DMChannel } from './structures/channels/DMChannel.js';
36
+ export { CategoryChannel, ForumChannel, TextChannel, ThreadChannel, VoiceChannel, createChannel, type Channel, type ServerChannel } from './structures/channels/ServerChannels.js';
37
+ export { TextBasedChannel } from './structures/channels/TextBasedChannel.js';
38
+ export { BaseInteraction, type InteractionReplyOptions } from './structures/interactions/BaseInteraction.js';
39
+ export { ChatInputCommandInteraction, CommandInteractionOptions } from './structures/interactions/CommandInteraction.js';
40
+ export { ButtonInteraction, ChannelSelectMenuInteraction, MentionableSelectMenuInteraction, MessageComponentInteraction, RoleSelectMenuInteraction, SelectMenuInteraction, StringSelectMenuInteraction, UserSelectMenuInteraction } from './structures/interactions/ComponentInteraction.js';
41
+ export { ModalSubmitFields, ModalSubmitInteraction } from './structures/interactions/ModalSubmitInteraction.js';
42
+ export { createInteraction } from './structures/interactions/createInteraction.js';
43
+ export { Message, MessageMentions, MessageReaction } from './structures/Message.js';
44
+ export { Role, type RoleEditData } from './structures/Role.js';
45
+ export { ScheduledEvent, type ScheduledEventData } from './structures/ScheduledEvent.js';
46
+ export { Server, type AuditLogEntry, type AuditLogQuery, type ServerEditData } from './structures/Server.js';
47
+ export { Emoji, Invite, Sticker } from './structures/ServerAssets.js';
48
+ export { MemberRoleManager, ServerMember } from './structures/ServerMember.js';
49
+ export { ClientUser, User } from './structures/User.js';
50
+ export { Webhook, WebhookClient, type WebhookMessageOptions } from './structures/Webhook.js';
51
+ export type * from './types.js';