baff.js 0.0.0-stage → 0.1.1

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 +25 -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 +53 -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 +115 -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 +49 -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 +111 -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 +57 -5
@@ -0,0 +1,32 @@
1
+ import { type MessageOptions } from '../builders/messagePayload.js';
2
+ import type { TextBasedChannel } from '../structures/channels/TextBasedChannel.js';
3
+ import { Message } from '../structures/Message.js';
4
+ import type { APIMessage } from '../types.js';
5
+ import { Collection } from '../util/Collection.js';
6
+ import { type EmojiResolvable } from '../util/emoji.js';
7
+ export interface FetchMessagesOptions {
8
+ limit?: number;
9
+ before?: string;
10
+ after?: string;
11
+ around?: string;
12
+ }
13
+ export declare class MessageManager {
14
+ readonly channel: TextBasedChannel;
15
+ readonly cache: Collection<string, Message>;
16
+ constructor(channel: TextBasedChannel);
17
+ private get client();
18
+ _add(data: APIMessage): Message;
19
+ _remove(id: string): Message | null;
20
+ private trim;
21
+ fetch(id: string, options?: {
22
+ force?: boolean;
23
+ }): Promise<Message>;
24
+ fetch(options?: FetchMessagesOptions): Promise<Collection<string, Message>>;
25
+ fetchPinned(): Promise<Collection<string, Message>>;
26
+ send(options: string | MessageOptions): Promise<Message>;
27
+ edit(id: string, options: string | MessageOptions): Promise<Message>;
28
+ delete(id: string): Promise<void>;
29
+ react(id: string, emoji: EmojiResolvable): Promise<void>;
30
+ pin(id: string): Promise<void>;
31
+ unpin(id: string): Promise<void>;
32
+ }
@@ -0,0 +1,75 @@
1
+ import { resolveMessage } from '../builders/messagePayload.js';
2
+ import { BaffAPIError } from '../errors/BaffError.js';
3
+ import { Routes } from '../rest/Routes.js';
4
+ import { Message } from '../structures/Message.js';
5
+ import { Collection } from '../util/Collection.js';
6
+ import { resolveEmoji } from '../util/emoji.js';
7
+ export class MessageManager {
8
+ channel;
9
+ cache = new Collection();
10
+ constructor(channel) {
11
+ this.channel = channel;
12
+ }
13
+ get client() {
14
+ return this.channel.client;
15
+ }
16
+ _add(data) {
17
+ const existing = this.cache.get(data.id);
18
+ const message = existing ? existing._patch(data) : new Message(this.client, data);
19
+ this.cache.delete(message.id);
20
+ this.cache.set(message.id, message);
21
+ this.trim();
22
+ return message;
23
+ }
24
+ _remove(id) {
25
+ const message = this.cache.get(id) ?? null;
26
+ this.cache.delete(id);
27
+ return message;
28
+ }
29
+ trim() {
30
+ const limit = this.client.options.messageCacheLimit;
31
+ while (this.cache.size > limit)
32
+ this.cache.delete(this.cache.firstKey());
33
+ }
34
+ async fetch(arg = {}, options = {}) {
35
+ if (typeof arg === 'string') {
36
+ const cached = this.cache.get(arg);
37
+ if (cached && !options.force)
38
+ return cached;
39
+ const list = await this.client.rest.get(Routes.channelMessages(this.channel.id), { query: { around: arg, limit: 1 } });
40
+ const found = list.find((m) => m.id === arg);
41
+ if (!found)
42
+ throw new BaffAPIError(404, 'GET', Routes.channelMessage(this.channel.id, arg), { error: { code: 'unknown_message', message: 'Message not found.' } });
43
+ return this._add(found);
44
+ }
45
+ const list = await this.client.rest.get(Routes.channelMessages(this.channel.id), { query: { ...arg } });
46
+ return new Collection(list.map((data) => [data.id, this._add(data)]));
47
+ }
48
+ async fetchPinned() {
49
+ const list = await this.client.rest.get(Routes.channelPins(this.channel.id));
50
+ return new Collection(list.map((data) => [data.id, this._add(data)]));
51
+ }
52
+ async send(options) {
53
+ const { body, files } = resolveMessage(options);
54
+ const data = await this.client.rest.post(Routes.channelMessages(this.channel.id), { body, files });
55
+ return this._add({ serverId: this.channel.serverId, ...data });
56
+ }
57
+ async edit(id, options) {
58
+ const { body } = resolveMessage(options);
59
+ const data = await this.client.rest.patch(Routes.channelMessage(this.channel.id, id), { body });
60
+ return this._add({ serverId: this.channel.serverId, ...data });
61
+ }
62
+ async delete(id) {
63
+ await this.client.rest.delete(Routes.channelMessage(this.channel.id, id));
64
+ this._remove(id);
65
+ }
66
+ async react(id, emoji) {
67
+ await this.client.rest.put(Routes.messageReaction(this.channel.id, id, resolveEmoji(emoji)));
68
+ }
69
+ async pin(id) {
70
+ await this.client.rest.put(Routes.channelPin(this.channel.id, id));
71
+ }
72
+ async unpin(id) {
73
+ await this.client.rest.delete(Routes.channelPin(this.channel.id, id));
74
+ }
75
+ }
@@ -0,0 +1,22 @@
1
+ import type { Client } from '../client/Client.js';
2
+ import { Role, type RoleEditData } from '../structures/Role.js';
3
+ import type { APIRole } from '../types.js';
4
+ import { Collection } from '../util/Collection.js';
5
+ import { CachedManager } from './CachedManager.js';
6
+ export declare class RoleManager extends CachedManager<Role> {
7
+ readonly serverId: string;
8
+ constructor(client: Client, serverId: string);
9
+ _add(data: APIRole): Role;
10
+ _setAll(list: APIRole[]): {
11
+ created: Role[];
12
+ updated: [Role, Role][];
13
+ deleted: Role[];
14
+ };
15
+ get everyone(): Role | null;
16
+ get highest(): Role | null;
17
+ fetch(): Promise<Collection<string, Role>>;
18
+ create(data?: RoleEditData): Promise<Role>;
19
+ edit(role: string | Role, data: RoleEditData): Promise<Role>;
20
+ delete(role: string | Role): Promise<void>;
21
+ reorder(ids: string[]): Promise<void>;
22
+ }
@@ -0,0 +1,69 @@
1
+ import { Routes } from '../rest/Routes.js';
2
+ import { Role, roleEditBody } from '../structures/Role.js';
3
+ import { CachedManager } from './CachedManager.js';
4
+ export class RoleManager extends CachedManager {
5
+ serverId;
6
+ constructor(client, serverId) {
7
+ super(client);
8
+ this.serverId = serverId;
9
+ }
10
+ _add(data) {
11
+ const existing = this.cache.get(data.id);
12
+ if (existing)
13
+ return existing._patch(data);
14
+ const role = new Role(this.client, this.serverId, data);
15
+ this.cache.set(role.id, role);
16
+ return role;
17
+ }
18
+ _setAll(list) {
19
+ const created = [];
20
+ const updated = [];
21
+ const seen = new Set();
22
+ for (const data of list) {
23
+ seen.add(data.id);
24
+ const existing = this.cache.get(data.id);
25
+ if (!existing)
26
+ created.push(this._add(data));
27
+ else
28
+ updated.push([existing._clone(), this._add(data)]);
29
+ }
30
+ const deleted = [];
31
+ for (const [id, role] of [...this.cache]) {
32
+ if (!seen.has(id)) {
33
+ this.cache.delete(id);
34
+ deleted.push(role);
35
+ }
36
+ }
37
+ return { created, updated, deleted };
38
+ }
39
+ get everyone() {
40
+ return this.cache.get(this.serverId) ?? null;
41
+ }
42
+ get highest() {
43
+ return this.cache.toSorted((a, b) => b.position - a.position).first() ?? null;
44
+ }
45
+ async fetch() {
46
+ this._setAll(await this.client.rest.get(Routes.serverRoles(this.serverId)));
47
+ return this.cache;
48
+ }
49
+ async create(data = {}) {
50
+ const created = await this.client.rest.post(Routes.serverRoles(this.serverId), { body: data.name ? { name: data.name } : {} });
51
+ const role = this._add(created);
52
+ const { name: _name, ...rest } = data;
53
+ return Object.keys(rest).length ? role.edit(rest) : role;
54
+ }
55
+ async edit(role, data) {
56
+ const target = typeof role === 'string' ? this.cache.get(role) : role;
57
+ if (target)
58
+ return target.edit(data);
59
+ return this._add(await this.client.rest.patch(Routes.serverRole(this.serverId, role), { body: roleEditBody(data) }));
60
+ }
61
+ async delete(role) {
62
+ const id = this.resolveId(role);
63
+ await this.client.rest.delete(Routes.serverRole(this.serverId, id));
64
+ this.cache.delete(id);
65
+ }
66
+ async reorder(ids) {
67
+ await this.client.rest.put(Routes.serverRoles(this.serverId), { body: { ids } });
68
+ }
69
+ }
@@ -0,0 +1,20 @@
1
+ import type { Client } from '../client/Client.js';
2
+ import type { Channel, ServerChannel } from '../structures/channels/ServerChannels.js';
3
+ import type { ChannelKind } from '../types.js';
4
+ import type { Collection } from '../util/Collection.js';
5
+ export interface CreateChannelOptions {
6
+ name: string;
7
+ kind?: Exclude<ChannelKind, 'thread' | 'dm' | 'group_dm' | 'stage'>;
8
+ parentId?: string | null;
9
+ }
10
+ export declare class ServerChannelManager {
11
+ private readonly client;
12
+ readonly serverId: string;
13
+ constructor(client: Client, serverId: string);
14
+ get cache(): Collection<string, ServerChannel>;
15
+ create(options: CreateChannelOptions): Promise<ServerChannel>;
16
+ delete(channel: string | {
17
+ id: string;
18
+ }): Promise<void>;
19
+ resolve(id: string): Channel | null;
20
+ }
@@ -0,0 +1,26 @@
1
+ import { Routes } from '../rest/Routes.js';
2
+ export class ServerChannelManager {
3
+ client;
4
+ serverId;
5
+ constructor(client, serverId) {
6
+ this.client = client;
7
+ this.serverId = serverId;
8
+ }
9
+ get cache() {
10
+ return this.client.channels.forServer(this.serverId);
11
+ }
12
+ async create(options) {
13
+ const data = await this.client.rest.post(Routes.serverChannels(this.serverId), {
14
+ body: { name: options.name, kind: options.kind ?? 'text', parentId: options.parentId ?? null }
15
+ });
16
+ return this.client.channels._upsert({ ...data, serverId: this.serverId });
17
+ }
18
+ async delete(channel) {
19
+ const id = typeof channel === 'string' ? channel : channel.id;
20
+ await this.client.rest.delete(Routes.channel(id));
21
+ this.client.channels._remove(id);
22
+ }
23
+ resolve(id) {
24
+ return this.cache.get(id) ?? null;
25
+ }
26
+ }
@@ -0,0 +1,12 @@
1
+ import { Server } from '../structures/Server.js';
2
+ import type { APIServer, APIServerSummary } from '../types.js';
3
+ import { Collection } from '../util/Collection.js';
4
+ import { CachedManager, type FetchOptions } from './CachedManager.js';
5
+ export declare class ServerManager extends CachedManager<Server> {
6
+ _add(data: APIServerSummary | APIServer): Server;
7
+ _remove(id: string): Server | null;
8
+ fetch(): Promise<Collection<string, Server>>;
9
+ fetch(id: string, options?: FetchOptions): Promise<Server>;
10
+ fetch(id: undefined, options: FetchOptions): Promise<Collection<string, Server>>;
11
+ leave(id: string): Promise<void>;
12
+ }
@@ -0,0 +1,58 @@
1
+ import { Routes } from '../rest/Routes.js';
2
+ import { Server } from '../structures/Server.js';
3
+ import { Collection } from '../util/Collection.js';
4
+ import { CachedManager } from './CachedManager.js';
5
+ const isDetail = (data) => 'channels' in data && 'roles' in data;
6
+ export class ServerManager extends CachedManager {
7
+ _add(data) {
8
+ let server = this.cache.get(data.id);
9
+ if (!server) {
10
+ server = new Server(this.client, data);
11
+ this.cache.set(server.id, server);
12
+ }
13
+ else {
14
+ server._patch(data);
15
+ }
16
+ if (isDetail(data))
17
+ server._applyDetail(data);
18
+ return server;
19
+ }
20
+ _remove(id) {
21
+ const server = this.cache.get(id) ?? null;
22
+ this.cache.delete(id);
23
+ for (const channel of server?.channels.cache.values() ?? [])
24
+ this.client.channels._remove(channel.id);
25
+ return server;
26
+ }
27
+ async fetch(id, options = {}) {
28
+ if (id !== undefined) {
29
+ const cached = this.cache.get(id);
30
+ if (cached?.detailed && !options.force)
31
+ return cached;
32
+ return this._add(await this.client.rest.get(Routes.server(id)));
33
+ }
34
+ const list = await this.client.rest.get(Routes.servers());
35
+ const out = new Collection();
36
+ const queue = [...list];
37
+ const worker = async () => {
38
+ for (let next = queue.shift(); next; next = queue.shift()) {
39
+ try {
40
+ out.set(next.id, this._add(await this.client.rest.get(Routes.server(next.id))));
41
+ }
42
+ catch (error) {
43
+ this.client.emit('debug', `Could not load server ${next.id}: ${error.message}`);
44
+ out.set(next.id, this._add(next));
45
+ }
46
+ }
47
+ };
48
+ await Promise.all(Array.from({ length: Math.min(4, queue.length) }, worker));
49
+ for (const id of this.cache.keys())
50
+ if (!list.some((s) => s.id === id))
51
+ this._remove(id);
52
+ return out;
53
+ }
54
+ async leave(id) {
55
+ await this.client.rest.delete(Routes.serverLeave(id));
56
+ this._remove(id);
57
+ }
58
+ }
@@ -0,0 +1,12 @@
1
+ import type { TextChannel, ThreadChannel } from '../structures/channels/ServerChannels.js';
2
+ import { Collection } from '../util/Collection.js';
3
+ export declare class ThreadManager {
4
+ private readonly channel;
5
+ constructor(channel: TextChannel);
6
+ create(options: {
7
+ name: string;
8
+ messageId?: string;
9
+ autoArchiveMinutes?: 60 | 1440 | 4320 | 10080;
10
+ }): Promise<ThreadChannel>;
11
+ fetch(): Promise<Collection<string, ThreadChannel>>;
12
+ }
@@ -0,0 +1,16 @@
1
+ import { Routes } from '../rest/Routes.js';
2
+ import { Collection } from '../util/Collection.js';
3
+ export class ThreadManager {
4
+ channel;
5
+ constructor(channel) {
6
+ this.channel = channel;
7
+ }
8
+ async create(options) {
9
+ const data = await this.channel.client.rest.post(Routes.channelThreads(this.channel.id), { body: options });
10
+ return this.channel.client.channels._addThread(data);
11
+ }
12
+ async fetch() {
13
+ const list = await this.channel.client.rest.get(Routes.channelThreads(this.channel.id));
14
+ return new Collection(list.map((data) => [data.id, this.channel.client.channels._addThread(data)]));
15
+ }
16
+ }
@@ -0,0 +1,11 @@
1
+ import type { DMChannel } from '../structures/channels/DMChannel.js';
2
+ import { User } from '../structures/User.js';
3
+ import type { APIUser } from '../types.js';
4
+ import { CachedManager, type FetchOptions } from './CachedManager.js';
5
+ export declare class UserManager extends CachedManager<User> {
6
+ private readonly tags;
7
+ _add(data: APIUser): User;
8
+ fetchTags(): Promise<void>;
9
+ fetch(id: string, options?: FetchOptions): Promise<User>;
10
+ createDM(userId: string): Promise<DMChannel>;
11
+ }
@@ -0,0 +1,34 @@
1
+ import { Routes } from '../rest/Routes.js';
2
+ import { User } from '../structures/User.js';
3
+ import { CachedManager } from './CachedManager.js';
4
+ export class UserManager extends CachedManager {
5
+ tags = new Map();
6
+ _add(data) {
7
+ const known = data.tag === undefined ? this.tags.get(data.id) : undefined;
8
+ const patch = known ? { ...data, tag: known } : data;
9
+ const existing = this.cache.get(data.id);
10
+ if (existing)
11
+ return existing._patch(patch);
12
+ const user = new User(this.client, patch);
13
+ this.cache.set(user.id, user);
14
+ return user;
15
+ }
16
+ async fetchTags() {
17
+ const list = await this.client.rest.get(Routes.userTags());
18
+ for (const { id, tag } of list) {
19
+ this.tags.set(id, tag);
20
+ this.cache.get(id)?._patch({ tag });
21
+ }
22
+ }
23
+ async fetch(id, options = {}) {
24
+ const cached = this.cache.get(id);
25
+ if (cached && !options.force)
26
+ return cached;
27
+ const profile = await this.client.rest.get(Routes.userProfile(id));
28
+ return this._add(profile.user);
29
+ }
30
+ async createDM(userId) {
31
+ const data = await this.client.rest.post(Routes.dms(), { body: { recipientId: userId } });
32
+ return this.client.channels._addDM(data);
33
+ }
34
+ }
@@ -0,0 +1,8 @@
1
+ import type { Client } from '../client/Client.js';
2
+ import type { APIVoiceJoin } from '../types.js';
3
+ export declare class VoiceManager {
4
+ private readonly client;
5
+ constructor(client: Client);
6
+ join(channelId: string): Promise<APIVoiceJoin>;
7
+ leave(serverId?: string): Promise<void>;
8
+ }
@@ -0,0 +1,13 @@
1
+ import { Routes } from '../rest/Routes.js';
2
+ export class VoiceManager {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ join(channelId) {
8
+ return this.client.rest.post(Routes.channelVoice(channelId));
9
+ }
10
+ async leave(serverId) {
11
+ await this.client.rest.delete(Routes.voice(), { query: { serverId } });
12
+ }
13
+ }
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,58 @@
1
+ import { TypedEmitter } from '../util/TypedEmitter.js';
2
+ import { type RawFile } from './files.js';
3
+ export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
4
+ export type QueryValue = string | number | boolean | undefined | null | readonly (string | number)[];
5
+ export interface RESTOptions {
6
+ api?: string;
7
+ token?: string;
8
+ timeout?: number;
9
+ retries?: number;
10
+ maxRateLimitRetries?: number;
11
+ userAgent?: string;
12
+ fetch?: typeof fetch;
13
+ }
14
+ export interface RequestOptions {
15
+ query?: Record<string, QueryValue>;
16
+ body?: unknown;
17
+ files?: readonly RawFile[];
18
+ auth?: boolean;
19
+ signal?: AbortSignal;
20
+ raw?: boolean;
21
+ }
22
+ export interface RateLimitInfo {
23
+ method: HTTPMethod;
24
+ path: string;
25
+ retryAfter: number;
26
+ global: boolean;
27
+ }
28
+ type RESTEvents = {
29
+ rateLimited: [RateLimitInfo];
30
+ debug: [string];
31
+ };
32
+ export declare function bucketKey(method: HTTPMethod, path: string): string;
33
+ export declare class REST extends TypedEmitter<RESTEvents> {
34
+ readonly api: string;
35
+ token: string | null;
36
+ private readonly timeout;
37
+ private readonly retries;
38
+ private readonly maxRateLimitRetries;
39
+ private readonly userAgent;
40
+ private readonly fetchImpl;
41
+ private readonly buckets;
42
+ private readonly sent;
43
+ private globalBlockedUntil;
44
+ constructor(options?: RESTOptions);
45
+ setToken(token: string): this;
46
+ get<T = unknown>(path: string, options?: RequestOptions): Promise<T>;
47
+ post<T = unknown>(path: string, options?: RequestOptions): Promise<T>;
48
+ put<T = unknown>(path: string, options?: RequestOptions): Promise<T>;
49
+ patch<T = unknown>(path: string, options?: RequestOptions): Promise<T>;
50
+ delete<T = unknown>(path: string, options?: RequestOptions): Promise<T>;
51
+ request<T = unknown>(method: HTTPMethod, path: string, options?: RequestOptions): Promise<T>;
52
+ private send;
53
+ private waitTurn;
54
+ private url;
55
+ private init;
56
+ private backoff;
57
+ }
58
+ export {};
@@ -0,0 +1,188 @@
1
+ import { BaffAPIError, BaffError, BaffRateLimitError } from '../errors/BaffError.js';
2
+ import { DEFAULT_API_URL, VERSION } from '../util/constants.js';
3
+ import { TypedEmitter } from '../util/TypedEmitter.js';
4
+ import { buildForm } from './files.js';
5
+ const MESSAGE_WINDOW = { limit: 5, ms: 5000 };
6
+ const IDEMPOTENT = new Set(['GET', 'PUT', 'DELETE']);
7
+ const MAJOR = new Set(['channels', 'servers', 'webhooks', 'interactions', 'applications']);
8
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
9
+ export function bucketKey(method, path) {
10
+ const parts = path.split('?')[0].split('/').filter(Boolean);
11
+ const out = [];
12
+ for (let i = 0; i < parts.length; i++) {
13
+ const part = parts[i];
14
+ const previous = parts[i - 1];
15
+ const isId = /^\d{5,}$/.test(part) || /^[0-9a-f]{32,}$/i.test(part);
16
+ out.push(isId && !(previous && MAJOR.has(previous)) ? ':id' : part);
17
+ }
18
+ return `${method} /${out.join('/')}`;
19
+ }
20
+ function isMessageSend(method, path) {
21
+ return method === 'POST' && (/^\/channels\/\d+\/messages$/.test(path) || /^\/interactions\/[^/]+\/[^/]+\/followup$/.test(path));
22
+ }
23
+ class Bucket {
24
+ blockedUntil = 0;
25
+ tail = Promise.resolve();
26
+ run(task) {
27
+ const result = this.tail.then(task, task);
28
+ this.tail = result.catch(() => undefined);
29
+ return result;
30
+ }
31
+ }
32
+ export class REST extends TypedEmitter {
33
+ api;
34
+ token;
35
+ timeout;
36
+ retries;
37
+ maxRateLimitRetries;
38
+ userAgent;
39
+ fetchImpl;
40
+ buckets = new Map();
41
+ sent = [];
42
+ globalBlockedUntil = 0;
43
+ constructor(options = {}) {
44
+ super();
45
+ this.api = (options.api ?? DEFAULT_API_URL).replace(/\/+$/, '');
46
+ this.token = options.token ?? null;
47
+ this.timeout = options.timeout ?? 15_000;
48
+ this.retries = options.retries ?? 3;
49
+ this.maxRateLimitRetries = options.maxRateLimitRetries ?? 5;
50
+ this.userAgent = options.userAgent ?? `baff.js/${VERSION} (+https://docs.baff.gg)`;
51
+ this.fetchImpl = options.fetch ?? ((...args) => globalThis.fetch(...args));
52
+ }
53
+ setToken(token) {
54
+ this.token = token.replace(/^Bot\s+/i, '').trim();
55
+ return this;
56
+ }
57
+ get(path, options) {
58
+ return this.request('GET', path, options);
59
+ }
60
+ post(path, options) {
61
+ return this.request('POST', path, options);
62
+ }
63
+ put(path, options) {
64
+ return this.request('PUT', path, options);
65
+ }
66
+ patch(path, options) {
67
+ return this.request('PATCH', path, options);
68
+ }
69
+ delete(path, options) {
70
+ return this.request('DELETE', path, options);
71
+ }
72
+ request(method, path, options = {}) {
73
+ const key = bucketKey(method, path);
74
+ let bucket = this.buckets.get(key);
75
+ if (!bucket)
76
+ this.buckets.set(key, (bucket = new Bucket()));
77
+ return bucket.run(() => this.send(method, path, options, bucket));
78
+ }
79
+ async send(method, path, options, bucket) {
80
+ const url = this.url(path, options.query);
81
+ const useAuth = options.auth !== false;
82
+ if (useAuth && !this.token)
83
+ throw new BaffError('NO_TOKEN', 'No token set. Pass one to Client or call login(token).');
84
+ let failures = 0;
85
+ let limited = 0;
86
+ for (;;) {
87
+ await this.waitTurn(method, path, bucket);
88
+ let res;
89
+ try {
90
+ res = await this.fetchImpl(url, this.init(method, options, useAuth));
91
+ }
92
+ catch (cause) {
93
+ if (options.signal?.aborted)
94
+ throw cause;
95
+ if (failures < this.retries && IDEMPOTENT.has(method)) {
96
+ await sleep(this.backoff(failures++));
97
+ continue;
98
+ }
99
+ throw new BaffError('NETWORK', `${method} ${path} failed: ${cause.message}`, { cause });
100
+ }
101
+ const text = await res.text();
102
+ const data = parse(text);
103
+ if (res.ok)
104
+ return (options.raw ? text : data);
105
+ if (res.status === 429) {
106
+ const retryAfter = retryAfterOf(res, data, limited);
107
+ const code = data?.error?.code;
108
+ if (code === 'slowmode' || ++limited > this.maxRateLimitRetries)
109
+ throw new BaffRateLimitError(method, path, data, retryAfter);
110
+ bucket.blockedUntil = Date.now() + retryAfter * 1000;
111
+ this.emit('rateLimited', { method, path, retryAfter, global: false });
112
+ continue;
113
+ }
114
+ if (res.status >= 500 && failures < this.retries && IDEMPOTENT.has(method)) {
115
+ await sleep(this.backoff(failures++));
116
+ continue;
117
+ }
118
+ throw new BaffAPIError(res.status, method, path, data);
119
+ }
120
+ }
121
+ async waitTurn(method, path, bucket) {
122
+ const wait = Math.max(bucket.blockedUntil, this.globalBlockedUntil) - Date.now();
123
+ if (wait > 0)
124
+ await sleep(wait);
125
+ if (!isMessageSend(method, path))
126
+ return;
127
+ for (;;) {
128
+ const now = Date.now();
129
+ while (this.sent.length && now - this.sent[0] >= MESSAGE_WINDOW.ms)
130
+ this.sent.shift();
131
+ if (this.sent.length < MESSAGE_WINDOW.limit)
132
+ break;
133
+ await sleep(this.sent[0] + MESSAGE_WINDOW.ms - now + 5);
134
+ }
135
+ this.sent.push(Date.now());
136
+ }
137
+ url(path, query) {
138
+ const params = new URLSearchParams();
139
+ for (const [key, value] of Object.entries(query ?? {})) {
140
+ if (value === undefined || value === null)
141
+ continue;
142
+ params.set(key, Array.isArray(value) ? value.join(',') : String(value));
143
+ }
144
+ const qs = params.toString();
145
+ return `${this.api}${path}${qs ? `?${qs}` : ''}`;
146
+ }
147
+ init(method, options, auth) {
148
+ const headers = { 'user-agent': this.userAgent };
149
+ if (auth)
150
+ headers.authorization = `Bot ${this.token}`;
151
+ let body;
152
+ if (options.body instanceof FormData) {
153
+ body = options.body;
154
+ }
155
+ else if (options.files?.length) {
156
+ body = buildForm(options.body ?? {}, options.files);
157
+ }
158
+ else if (options.body !== undefined) {
159
+ headers['content-type'] = 'application/json';
160
+ body = JSON.stringify(options.body);
161
+ }
162
+ const timeout = AbortSignal.timeout(this.timeout);
163
+ const signal = options.signal ? AbortSignal.any([timeout, options.signal]) : timeout;
164
+ return { method, headers, body, signal };
165
+ }
166
+ backoff(attempt) {
167
+ return Math.min(250 * 2 ** attempt, 4000) + Math.floor(Math.random() * 100);
168
+ }
169
+ }
170
+ function parse(text) {
171
+ if (!text)
172
+ return undefined;
173
+ try {
174
+ return JSON.parse(text);
175
+ }
176
+ catch {
177
+ return text;
178
+ }
179
+ }
180
+ function retryAfterOf(res, data, attempt) {
181
+ const header = Number(res.headers.get('retry-after'));
182
+ if (Number.isFinite(header) && header > 0)
183
+ return header;
184
+ const body = data?.error?.retryAfter;
185
+ if (typeof body === 'number' && body > 0)
186
+ return body;
187
+ return Math.min(1 + attempt, 5);
188
+ }