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,129 @@
1
+ import type { Channel } from '../structures/channels/ServerChannels.js';
2
+ import type { ThreadChannel } from '../structures/channels/ServerChannels.js';
3
+ import type { DMChannel } from '../structures/channels/DMChannel.js';
4
+ import type { TextBasedChannel } from '../structures/channels/TextBasedChannel.js';
5
+ import type { BaseInteraction } from '../structures/interactions/BaseInteraction.js';
6
+ import type { Message } from '../structures/Message.js';
7
+ import type { Role } from '../structures/Role.js';
8
+ import type { ScheduledEvent } from '../structures/ScheduledEvent.js';
9
+ import type { Server } from '../structures/Server.js';
10
+ import type { ServerMember } from '../structures/ServerMember.js';
11
+ import type { User } from '../structures/User.js';
12
+ import type { APIVoiceState } from '../types.js';
13
+ import type { Client } from './Client.js';
14
+ export interface ServerRemoval {
15
+ id: string;
16
+ reason: string | null;
17
+ server: Server | null;
18
+ }
19
+ export interface MessageDeleteEvent {
20
+ id: string;
21
+ channelId: string;
22
+ channel: TextBasedChannel;
23
+ message: Message | null;
24
+ }
25
+ export interface ReactionEvent {
26
+ channelId: string;
27
+ messageId: string;
28
+ userId: string;
29
+ emoji: string;
30
+ channel: TextBasedChannel;
31
+ message: Message | null;
32
+ user: User | null;
33
+ }
34
+ export interface MessagePinEvent {
35
+ channelId: string;
36
+ messageId: string;
37
+ pinned: boolean;
38
+ channel: TextBasedChannel;
39
+ }
40
+ export interface TypingEvent {
41
+ channelId: string;
42
+ userId: string;
43
+ channel: TextBasedChannel;
44
+ user: User | null;
45
+ }
46
+ export interface MentionEvent {
47
+ channelId: string;
48
+ messageId: string;
49
+ serverId: string | null;
50
+ }
51
+ export interface MemberRemoval {
52
+ serverId: string;
53
+ userId: string;
54
+ member: ServerMember | null;
55
+ user: User | null;
56
+ }
57
+ export interface PresenceEvent {
58
+ userId: string;
59
+ status: string;
60
+ customStatus: string | null;
61
+ user: User | null;
62
+ }
63
+ export type ClientEvents = {
64
+ ready: [client: Client];
65
+ reconnected: [client: Client];
66
+ reconnecting: [attempt: number, delayMs: number];
67
+ disconnect: [code: number, reason: string];
68
+ raw: [packet: {
69
+ t: string;
70
+ d: unknown;
71
+ }];
72
+ debug: [message: string];
73
+ error: [error: Error];
74
+ serverCreate: [server: Server];
75
+ serverUpdate: [before: Server, after: Server];
76
+ serverRemove: [removal: ServerRemoval];
77
+ channelCreate: [channel: Channel];
78
+ channelUpdate: [before: Channel, after: Channel];
79
+ channelDelete: [channel: Channel];
80
+ roleCreate: [role: Role];
81
+ roleUpdate: [before: Role, after: Role];
82
+ roleDelete: [role: Role];
83
+ threadCreate: [thread: ThreadChannel];
84
+ threadUpdate: [before: ThreadChannel, after: ThreadChannel];
85
+ messageCreate: [message: Message];
86
+ messageUpdate: [before: Message | null, after: Message];
87
+ messageDelete: [event: MessageDeleteEvent];
88
+ messageReactionAdd: [event: ReactionEvent];
89
+ messageReactionRemove: [event: ReactionEvent];
90
+ messagePin: [event: MessagePinEvent];
91
+ typingStart: [event: TypingEvent];
92
+ mention: [event: MentionEvent];
93
+ pollVote: [data: Record<string, unknown>];
94
+ memberAdd: [member: ServerMember];
95
+ memberRemove: [removal: MemberRemoval];
96
+ memberUpdate: [before: ServerMember | null, after: ServerMember];
97
+ presenceUpdate: [event: PresenceEvent];
98
+ userUpdate: [before: User | null, after: User];
99
+ clanTagUpdate: [data: Record<string, unknown>];
100
+ dmOpen: [channel: DMChannel];
101
+ voiceStateUpdate: [before: APIVoiceState | null, after: APIVoiceState];
102
+ soundboardPlay: [data: Record<string, unknown>];
103
+ callAlone: [data: Record<string, unknown>];
104
+ stageInstanceCreate: [data: Record<string, unknown>];
105
+ stageInstanceUpdate: [data: Record<string, unknown>];
106
+ stageInstanceDelete: [data: Record<string, unknown>];
107
+ voiceChannelStatusUpdate: [data: Record<string, unknown>];
108
+ serverStickersUpdate: [data: Record<string, unknown>];
109
+ serverSoundboardUpdate: [data: Record<string, unknown>];
110
+ serverEventCreate: [event: ScheduledEvent];
111
+ serverEventUpdate: [event: ScheduledEvent];
112
+ serverEventDelete: [data: {
113
+ serverId: string;
114
+ id: string;
115
+ }];
116
+ serverEventUserAdd: [data: {
117
+ serverId: string;
118
+ eventId: string;
119
+ userId: string;
120
+ interestedCount: number;
121
+ }];
122
+ serverEventUserRemove: [data: {
123
+ serverId: string;
124
+ eventId: string;
125
+ userId: string;
126
+ interestedCount: number;
127
+ }];
128
+ interactionCreate: [interaction: BaseInteraction];
129
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ import { BaffError } from '../errors/BaffError.js';
2
+ import { Collection } from '../util/Collection.js';
3
+ import { TypedEmitter } from '../util/TypedEmitter.js';
4
+ export interface CollectorOptions<V> {
5
+ filter?: (item: V, collected: Collection<string, V>) => boolean | Promise<boolean>;
6
+ time?: number;
7
+ idle?: number;
8
+ max?: number;
9
+ maxProcessed?: number;
10
+ }
11
+ type CollectorEvents<V> = {
12
+ collect: [item: V];
13
+ ignore: [item: V];
14
+ end: [collected: Collection<string, V>, reason: string];
15
+ };
16
+ export declare class CollectorError extends BaffError {
17
+ readonly collected: Collection<string, unknown>;
18
+ readonly reason: string;
19
+ constructor(collected: Collection<string, unknown>, reason: string);
20
+ }
21
+ export declare abstract class Collector<V> extends TypedEmitter<CollectorEvents<V>> {
22
+ protected readonly options: CollectorOptions<V>;
23
+ readonly collected: Collection<string, V>;
24
+ ended: boolean;
25
+ endReason: string | null;
26
+ private processed;
27
+ private timer;
28
+ private idleTimer;
29
+ constructor(options?: CollectorOptions<V>);
30
+ protected abstract keyOf(item: V): string;
31
+ protected handle(item: V): Promise<void>;
32
+ stop(reason?: string): void;
33
+ protected abstract cleanup(): void;
34
+ private resetIdle;
35
+ }
36
+ export declare function awaitCollector<V>(collector: Collector<V>, errors?: string[]): Promise<Collection<string, V>>;
37
+ export {};
@@ -0,0 +1,78 @@
1
+ import { BaffError } from '../errors/BaffError.js';
2
+ import { Collection } from '../util/Collection.js';
3
+ import { TypedEmitter } from '../util/TypedEmitter.js';
4
+ export class CollectorError extends BaffError {
5
+ collected;
6
+ reason;
7
+ constructor(collected, reason) {
8
+ super('COLLECTOR_ENDED', `The collector ended with reason "${reason}".`);
9
+ this.collected = collected;
10
+ this.reason = reason;
11
+ this.name = 'CollectorError';
12
+ }
13
+ }
14
+ export class Collector extends TypedEmitter {
15
+ options;
16
+ collected = new Collection();
17
+ ended = false;
18
+ endReason = null;
19
+ processed = 0;
20
+ timer = null;
21
+ idleTimer = null;
22
+ constructor(options = {}) {
23
+ super();
24
+ this.options = options;
25
+ if (options.time)
26
+ this.timer = setTimeout(() => this.stop('time'), options.time);
27
+ this.resetIdle();
28
+ }
29
+ async handle(item) {
30
+ if (this.ended)
31
+ return;
32
+ this.processed++;
33
+ const pass = this.options.filter ? await this.options.filter(item, this.collected) : true;
34
+ if (this.ended)
35
+ return;
36
+ if (pass) {
37
+ this.collected.set(this.keyOf(item), item);
38
+ this.emit('collect', item);
39
+ this.resetIdle();
40
+ }
41
+ else {
42
+ this.emit('ignore', item);
43
+ }
44
+ if (this.options.max && this.collected.size >= this.options.max)
45
+ this.stop('limit');
46
+ else if (this.options.maxProcessed && this.processed >= this.options.maxProcessed)
47
+ this.stop('processedLimit');
48
+ }
49
+ stop(reason = 'user') {
50
+ if (this.ended)
51
+ return;
52
+ this.ended = true;
53
+ this.endReason = reason;
54
+ if (this.timer)
55
+ clearTimeout(this.timer);
56
+ if (this.idleTimer)
57
+ clearTimeout(this.idleTimer);
58
+ this.cleanup();
59
+ this.emit('end', this.collected, reason);
60
+ }
61
+ resetIdle() {
62
+ if (!this.options.idle)
63
+ return;
64
+ if (this.idleTimer)
65
+ clearTimeout(this.idleTimer);
66
+ this.idleTimer = setTimeout(() => this.stop('idle'), this.options.idle);
67
+ }
68
+ }
69
+ export function awaitCollector(collector, errors = []) {
70
+ return new Promise((resolve, reject) => {
71
+ collector.once('end', (collected, reason) => {
72
+ if (errors.includes(reason))
73
+ reject(new CollectorError(collected, reason));
74
+ else
75
+ resolve(collected);
76
+ });
77
+ });
78
+ }
@@ -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,40 @@
1
+ import { Collector } from './Collector.js';
2
+ export class InteractionCollector extends Collector {
3
+ client;
4
+ criteria;
5
+ listener = (interaction) => {
6
+ if (this.matches(interaction))
7
+ void this.handle(interaction);
8
+ };
9
+ constructor(client, criteria = {}) {
10
+ super(criteria);
11
+ this.client = client;
12
+ this.criteria = criteria;
13
+ client.on('interactionCreate', this.listener);
14
+ }
15
+ keyOf(interaction) {
16
+ return interaction.id;
17
+ }
18
+ cleanup() {
19
+ this.client.off('interactionCreate', this.listener);
20
+ }
21
+ matches(i) {
22
+ const c = this.criteria;
23
+ const kind = c.interactionType ?? 'component';
24
+ if (kind === 'component' ? !i.isMessageComponent() : kind === 'modal_submit' ? !i.isModalSubmit() : !i.isChatInputCommand())
25
+ return false;
26
+ if (c.channelId && i.channelId !== c.channelId)
27
+ return false;
28
+ if (c.serverId && i.serverId !== c.serverId)
29
+ return false;
30
+ if (c.userId && i.user.id !== c.userId)
31
+ return false;
32
+ if (c.messageId && i.message?.id !== c.messageId)
33
+ return false;
34
+ if (c.customId && (i.isMessageComponent() || i.isModalSubmit() ? i.customId : null) !== c.customId)
35
+ return false;
36
+ if (c.componentType !== undefined && (!i.isMessageComponent() || i.componentType !== c.componentType))
37
+ return false;
38
+ return true;
39
+ }
40
+ }
@@ -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,19 @@
1
+ import { Collector } from './Collector.js';
2
+ export class MessageCollector extends Collector {
3
+ channel;
4
+ listener = (message) => {
5
+ if (message.channelId === this.channel.id)
6
+ void this.handle(message);
7
+ };
8
+ constructor(channel, options = {}) {
9
+ super(options);
10
+ this.channel = channel;
11
+ channel.client.on('messageCreate', this.listener);
12
+ }
13
+ keyOf(message) {
14
+ return message.id;
15
+ }
16
+ cleanup() {
17
+ this.channel.client.off('messageCreate', this.listener);
18
+ }
19
+ }
@@ -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,33 @@
1
+ export class BaffError extends Error {
2
+ code;
3
+ constructor(code, message, options) {
4
+ super(message, options);
5
+ this.name = 'BaffError';
6
+ this.code = code;
7
+ }
8
+ }
9
+ export class BaffAPIError extends BaffError {
10
+ status;
11
+ method;
12
+ path;
13
+ field;
14
+ body;
15
+ constructor(status, method, path, body) {
16
+ const detail = body?.error;
17
+ super(detail?.code ?? `HTTP_${status}`, detail?.message ?? `${method} ${path} failed with status ${status}.`);
18
+ this.name = 'BaffAPIError';
19
+ this.status = status;
20
+ this.method = method;
21
+ this.path = path;
22
+ this.field = detail?.field ?? null;
23
+ this.body = body;
24
+ }
25
+ }
26
+ export class BaffRateLimitError extends BaffAPIError {
27
+ retryAfter;
28
+ constructor(method, path, body, retryAfter) {
29
+ super(429, method, path, body);
30
+ this.name = 'BaffRateLimitError';
31
+ this.retryAfter = retryAfter;
32
+ }
33
+ }
@@ -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,124 @@
1
+ import { BaffError } from '../errors/BaffError.js';
2
+ import { DEFAULT_GATEWAY_URL } from '../util/constants.js';
3
+ import { TypedEmitter } from '../util/TypedEmitter.js';
4
+ const OPEN = 1;
5
+ export class Gateway extends TypedEmitter {
6
+ options;
7
+ socket = null;
8
+ timer = null;
9
+ attempt = 0;
10
+ destroyed = false;
11
+ everReady = false;
12
+ url;
13
+ WebSocketImpl;
14
+ reconnect;
15
+ initialBackoff;
16
+ maxBackoff;
17
+ constructor(options) {
18
+ super();
19
+ this.options = options;
20
+ this.url = options.url ?? DEFAULT_GATEWAY_URL;
21
+ this.reconnect = options.reconnect ?? true;
22
+ this.initialBackoff = options.initialBackoff ?? 1000;
23
+ this.maxBackoff = options.maxBackoff ?? 30_000;
24
+ this.WebSocketImpl = options.WebSocket ?? defaultWebSocket();
25
+ }
26
+ get connected() {
27
+ return this.socket?.readyState === OPEN;
28
+ }
29
+ connect() {
30
+ this.destroyed = false;
31
+ return new Promise((resolve, reject) => this.open(resolve, reject));
32
+ }
33
+ destroy(code = 1000, reason = 'client destroyed') {
34
+ this.destroyed = true;
35
+ if (this.timer)
36
+ clearTimeout(this.timer);
37
+ this.timer = null;
38
+ const socket = this.socket;
39
+ this.socket = null;
40
+ if (!socket)
41
+ return;
42
+ socket.onclose = socket.onerror = socket.onmessage = socket.onopen = null;
43
+ try {
44
+ socket.close(code, reason);
45
+ }
46
+ catch {
47
+ // already closed
48
+ }
49
+ }
50
+ open(resolve, reject) {
51
+ let socket;
52
+ try {
53
+ socket = new this.WebSocketImpl(this.url, { headers: { Authorization: `Bot ${this.options.token}` } });
54
+ }
55
+ catch (cause) {
56
+ const error = new BaffError('GATEWAY_CONNECT', `Could not open the gateway: ${cause.message}`, { cause });
57
+ if (reject && !this.everReady)
58
+ return reject(error);
59
+ return this.scheduleReconnect(resolve, reject);
60
+ }
61
+ this.socket = socket;
62
+ let settled = false;
63
+ socket.onmessage = (event) => {
64
+ const frame = parseFrame(event.data);
65
+ if (!frame)
66
+ return;
67
+ if (frame.t === 'READY') {
68
+ const first = !this.everReady;
69
+ this.everReady = true;
70
+ this.attempt = 0;
71
+ settled = true;
72
+ this.emit(first ? 'ready' : 'reconnected', frame.d);
73
+ resolve?.(frame.d);
74
+ return;
75
+ }
76
+ this.emit('dispatch', frame.t, frame.d);
77
+ };
78
+ socket.onerror = () => {
79
+ this.emit('debug', 'socket error');
80
+ };
81
+ socket.onclose = (event) => {
82
+ if (this.socket !== socket)
83
+ return;
84
+ this.socket = null;
85
+ this.emit('disconnect', event.code, event.reason);
86
+ if (this.destroyed)
87
+ return;
88
+ if (!settled && !this.everReady && reject) {
89
+ reject(new BaffError('GATEWAY_CONNECT', `The gateway closed the connection before READY (code ${event.code}). Check the token and the gateway URL.`));
90
+ return;
91
+ }
92
+ this.scheduleReconnect(resolve, reject);
93
+ };
94
+ }
95
+ scheduleReconnect(resolve, reject) {
96
+ if (!this.reconnect || this.destroyed)
97
+ return;
98
+ const delay = Math.min(this.initialBackoff * 2 ** this.attempt, this.maxBackoff);
99
+ this.attempt++;
100
+ this.emit('reconnecting', this.attempt, delay);
101
+ this.timer = setTimeout(() => {
102
+ this.timer = null;
103
+ if (!this.destroyed)
104
+ this.open(resolve, reject);
105
+ }, delay);
106
+ }
107
+ }
108
+ function parseFrame(data) {
109
+ const text = typeof data === 'string' ? data : data instanceof ArrayBuffer ? new TextDecoder().decode(data) : String(data);
110
+ try {
111
+ const frame = JSON.parse(text);
112
+ return typeof frame.t === 'string' ? { t: frame.t, d: frame.d } : null;
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ function defaultWebSocket() {
119
+ const ctor = globalThis.WebSocket;
120
+ if (typeof ctor !== 'function') {
121
+ throw new 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.');
122
+ }
123
+ return ctor;
124
+ }
@@ -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,68 @@
1
+ import { Client } from '../client/Client.js';
2
+ import { createInteraction } from '../structures/interactions/createInteraction.js';
3
+ import { verifyRequestHeaders } from './verify.js';
4
+ export function createInteractionsHandler(options) {
5
+ const client = options.client ?? new Client();
6
+ const answerWithinMs = options.answerWithinMs ?? 2800;
7
+ return async (request) => {
8
+ if (request.method !== 'POST')
9
+ return new Response('method not allowed', { status: 405 });
10
+ const body = await request.text();
11
+ if (!verifyRequestHeaders(request.headers, body, options.secret, options))
12
+ return new Response('bad signature', { status: 401 });
13
+ let raw;
14
+ try {
15
+ raw = JSON.parse(body);
16
+ }
17
+ catch {
18
+ return new Response('bad request', { status: 400 });
19
+ }
20
+ if (raw.type === 'ping')
21
+ return Response.json({ type: 'pong' });
22
+ client.setApplicationId(raw.applicationId);
23
+ let respond;
24
+ const answered = new Promise((resolve) => (respond = resolve));
25
+ const timeout = new Promise((resolve) => {
26
+ const timer = setTimeout(() => resolve(new Response(null, { status: 200 })), answerWithinMs);
27
+ void answered.then(() => clearTimeout(timer));
28
+ });
29
+ try {
30
+ const interaction = createInteraction(client, raw);
31
+ interaction._setSink((answer) => respond(Response.json(answer)));
32
+ client.emit('interactionCreate', interaction);
33
+ const response = await Promise.race([answered, timeout]);
34
+ interaction._setSink(null);
35
+ return response;
36
+ }
37
+ catch (error) {
38
+ client.emit('debug', `Interaction handler failed: ${error.message}`);
39
+ return new Response('internal error', { status: 500 });
40
+ }
41
+ };
42
+ }
43
+ export function toNodeListener(handler) {
44
+ return (req, res) => {
45
+ const chunks = [];
46
+ req.on('data', (chunk) => chunks.push(chunk));
47
+ req.on('end', () => {
48
+ const headers = new Headers();
49
+ for (const [key, value] of Object.entries(req.headers)) {
50
+ if (Array.isArray(value))
51
+ value.forEach((v) => headers.append(key, v));
52
+ else if (value !== undefined)
53
+ headers.set(key, value);
54
+ }
55
+ const request = new Request(`http://${req.headers.host ?? 'localhost'}${req.url ?? '/'}`, {
56
+ method: req.method,
57
+ headers,
58
+ body: req.method === 'GET' || req.method === 'HEAD' ? undefined : Buffer.concat(chunks)
59
+ });
60
+ handler(request).then(async (response) => {
61
+ res.writeHead(response.status, Object.fromEntries(response.headers));
62
+ res.end(Buffer.from(await response.arrayBuffer()));
63
+ }, () => {
64
+ res.writeHead(500).end('internal error');
65
+ });
66
+ });
67
+ };
68
+ }
@@ -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;