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.
- package/CHANGELOG.md +20 -0
- package/LICENSE +7 -0
- package/README.md +244 -3
- package/dist/cjs/builders/EmbedBuilder.d.ts +51 -0
- package/dist/cjs/builders/EmbedBuilder.js +150 -0
- package/dist/cjs/builders/SlashCommandBuilder.d.ts +69 -0
- package/dist/cjs/builders/SlashCommandBuilder.js +185 -0
- package/dist/cjs/builders/components/ActionRowBuilder.d.ts +14 -0
- package/dist/cjs/builders/components/ActionRowBuilder.js +45 -0
- package/dist/cjs/builders/components/ButtonBuilder.d.ts +19 -0
- package/dist/cjs/builders/components/ButtonBuilder.js +69 -0
- package/dist/cjs/builders/components/LayoutBuilders.d.ts +63 -0
- package/dist/cjs/builders/components/LayoutBuilders.js +179 -0
- package/dist/cjs/builders/components/ModalBuilder.d.ts +36 -0
- package/dist/cjs/builders/components/ModalBuilder.js +118 -0
- package/dist/cjs/builders/components/SelectMenuBuilder.d.ts +80 -0
- package/dist/cjs/builders/components/SelectMenuBuilder.js +192 -0
- package/dist/cjs/builders/components/shared.d.ts +16 -0
- package/dist/cjs/builders/components/shared.js +32 -0
- package/dist/cjs/builders/messagePayload.d.ts +35 -0
- package/dist/cjs/builders/messagePayload.js +88 -0
- package/dist/cjs/builders/validate.d.ts +12 -0
- package/dist/cjs/builders/validate.js +54 -0
- package/dist/cjs/client/Client.d.ts +63 -0
- package/dist/cjs/client/Client.js +152 -0
- package/dist/cjs/client/dispatch.d.ts +2 -0
- package/dist/cjs/client/dispatch.js +224 -0
- package/dist/cjs/client/events.d.ts +129 -0
- package/dist/cjs/client/events.js +2 -0
- package/dist/cjs/collectors/Collector.d.ts +37 -0
- package/dist/cjs/collectors/Collector.js +84 -0
- package/dist/cjs/collectors/InteractionCollector.d.ts +21 -0
- package/dist/cjs/collectors/InteractionCollector.js +44 -0
- package/dist/cjs/collectors/MessageCollector.d.ts +14 -0
- package/dist/cjs/collectors/MessageCollector.js +23 -0
- package/dist/cjs/errors/BaffError.d.ts +26 -0
- package/dist/cjs/errors/BaffError.js +39 -0
- package/dist/cjs/gateway/Gateway.d.ts +53 -0
- package/dist/cjs/gateway/Gateway.js +128 -0
- package/dist/cjs/http/handler.d.ts +11 -0
- package/dist/cjs/http/handler.js +72 -0
- package/dist/cjs/http/verify.d.ts +11 -0
- package/dist/cjs/http/verify.js +28 -0
- package/dist/cjs/index.d.ts +51 -0
- package/dist/cjs/index.js +185 -0
- package/dist/cjs/managers/CachedManager.d.ts +16 -0
- package/dist/cjs/managers/CachedManager.js +18 -0
- package/dist/cjs/managers/ChannelManager.d.ts +23 -0
- package/dist/cjs/managers/ChannelManager.js +85 -0
- package/dist/cjs/managers/CommandManager.d.ts +32 -0
- package/dist/cjs/managers/CommandManager.js +72 -0
- package/dist/cjs/managers/EventManager.d.ts +15 -0
- package/dist/cjs/managers/EventManager.js +36 -0
- package/dist/cjs/managers/ExpressionManagers.d.ts +36 -0
- package/dist/cjs/managers/ExpressionManagers.js +73 -0
- package/dist/cjs/managers/InviteManager.d.ts +17 -0
- package/dist/cjs/managers/InviteManager.js +26 -0
- package/dist/cjs/managers/MemberManager.d.ts +31 -0
- package/dist/cjs/managers/MemberManager.js +62 -0
- package/dist/cjs/managers/MessageManager.d.ts +32 -0
- package/dist/cjs/managers/MessageManager.js +79 -0
- package/dist/cjs/managers/RoleManager.d.ts +22 -0
- package/dist/cjs/managers/RoleManager.js +73 -0
- package/dist/cjs/managers/ServerChannelManager.d.ts +20 -0
- package/dist/cjs/managers/ServerChannelManager.js +30 -0
- package/dist/cjs/managers/ServerManager.d.ts +12 -0
- package/dist/cjs/managers/ServerManager.js +62 -0
- package/dist/cjs/managers/ThreadManager.d.ts +12 -0
- package/dist/cjs/managers/ThreadManager.js +20 -0
- package/dist/cjs/managers/UserManager.d.ts +11 -0
- package/dist/cjs/managers/UserManager.js +38 -0
- package/dist/cjs/managers/VoiceManager.d.ts +8 -0
- package/dist/cjs/managers/VoiceManager.js +17 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/rest/REST.d.ts +58 -0
- package/dist/cjs/rest/REST.js +193 -0
- package/dist/cjs/rest/Routes.d.ts +54 -0
- package/dist/cjs/rest/Routes.js +58 -0
- package/dist/cjs/rest/files.d.ts +19 -0
- package/dist/cjs/rest/files.js +37 -0
- package/dist/cjs/structures/Base.d.ts +13 -0
- package/dist/cjs/structures/Base.js +30 -0
- package/dist/cjs/structures/Message.d.ts +91 -0
- package/dist/cjs/structures/Message.js +200 -0
- package/dist/cjs/structures/Role.d.ts +34 -0
- package/dist/cjs/structures/Role.js +84 -0
- package/dist/cjs/structures/ScheduledEvent.d.ts +37 -0
- package/dist/cjs/structures/ScheduledEvent.js +73 -0
- package/dist/cjs/structures/Server.d.ts +68 -0
- package/dist/cjs/structures/Server.js +124 -0
- package/dist/cjs/structures/ServerAssets.d.ts +48 -0
- package/dist/cjs/structures/ServerAssets.js +104 -0
- package/dist/cjs/structures/ServerMember.d.ts +47 -0
- package/dist/cjs/structures/ServerMember.js +138 -0
- package/dist/cjs/structures/User.d.ts +35 -0
- package/dist/cjs/structures/User.js +87 -0
- package/dist/cjs/structures/Webhook.d.ts +30 -0
- package/dist/cjs/structures/Webhook.js +68 -0
- package/dist/cjs/structures/channels/BaseChannel.d.ts +49 -0
- package/dist/cjs/structures/channels/BaseChannel.js +81 -0
- package/dist/cjs/structures/channels/DMChannel.d.ts +9 -0
- package/dist/cjs/structures/channels/DMChannel.js +21 -0
- package/dist/cjs/structures/channels/ServerChannels.d.ts +57 -0
- package/dist/cjs/structures/channels/ServerChannels.js +138 -0
- package/dist/cjs/structures/channels/TextBasedChannel.d.ts +25 -0
- package/dist/cjs/structures/channels/TextBasedChannel.js +53 -0
- package/dist/cjs/structures/interactions/BaseInteraction.d.ts +74 -0
- package/dist/cjs/structures/interactions/BaseInteraction.js +221 -0
- package/dist/cjs/structures/interactions/CommandInteraction.d.ts +44 -0
- package/dist/cjs/structures/interactions/CommandInteraction.js +109 -0
- package/dist/cjs/structures/interactions/ComponentInteraction.d.ts +44 -0
- package/dist/cjs/structures/interactions/ComponentInteraction.js +64 -0
- package/dist/cjs/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
- package/dist/cjs/structures/interactions/ModalSubmitInteraction.js +42 -0
- package/dist/cjs/structures/interactions/createInteraction.d.ts +4 -0
- package/dist/cjs/structures/interactions/createInteraction.js +34 -0
- package/dist/cjs/types.d.ts +369 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/util/Collection.d.ts +32 -0
- package/dist/cjs/util/Collection.js +145 -0
- package/dist/cjs/util/Permissions.d.ts +87 -0
- package/dist/cjs/util/Permissions.js +113 -0
- package/dist/cjs/util/Snowflake.d.ts +20 -0
- package/dist/cjs/util/Snowflake.js +40 -0
- package/dist/cjs/util/TypedEmitter.d.ts +17 -0
- package/dist/cjs/util/TypedEmitter.js +5 -0
- package/dist/cjs/util/constants.d.ts +78 -0
- package/dist/cjs/util/constants.js +81 -0
- package/dist/cjs/util/emoji.d.ts +8 -0
- package/dist/cjs/util/emoji.js +10 -0
- package/dist/cjs/util/formatters.d.ts +29 -0
- package/dist/cjs/util/formatters.js +55 -0
- package/dist/esm/builders/EmbedBuilder.d.ts +51 -0
- package/dist/esm/builders/EmbedBuilder.js +145 -0
- package/dist/esm/builders/SlashCommandBuilder.d.ts +69 -0
- package/dist/esm/builders/SlashCommandBuilder.js +170 -0
- package/dist/esm/builders/components/ActionRowBuilder.d.ts +14 -0
- package/dist/esm/builders/components/ActionRowBuilder.js +41 -0
- package/dist/esm/builders/components/ButtonBuilder.d.ts +19 -0
- package/dist/esm/builders/components/ButtonBuilder.js +65 -0
- package/dist/esm/builders/components/LayoutBuilders.d.ts +63 -0
- package/dist/esm/builders/components/LayoutBuilders.js +169 -0
- package/dist/esm/builders/components/ModalBuilder.d.ts +36 -0
- package/dist/esm/builders/components/ModalBuilder.js +113 -0
- package/dist/esm/builders/components/SelectMenuBuilder.d.ts +80 -0
- package/dist/esm/builders/components/SelectMenuBuilder.js +183 -0
- package/dist/esm/builders/components/shared.d.ts +16 -0
- package/dist/esm/builders/components/shared.js +26 -0
- package/dist/esm/builders/messagePayload.d.ts +35 -0
- package/dist/esm/builders/messagePayload.js +83 -0
- package/dist/esm/builders/validate.d.ts +12 -0
- package/dist/esm/builders/validate.js +46 -0
- package/dist/esm/client/Client.d.ts +63 -0
- package/dist/esm/client/Client.js +147 -0
- package/dist/esm/client/dispatch.d.ts +2 -0
- package/dist/esm/client/dispatch.js +221 -0
- package/dist/esm/client/events.d.ts +129 -0
- package/dist/esm/client/events.js +1 -0
- package/dist/esm/collectors/Collector.d.ts +37 -0
- package/dist/esm/collectors/Collector.js +78 -0
- package/dist/esm/collectors/InteractionCollector.d.ts +21 -0
- package/dist/esm/collectors/InteractionCollector.js +40 -0
- package/dist/esm/collectors/MessageCollector.d.ts +14 -0
- package/dist/esm/collectors/MessageCollector.js +19 -0
- package/dist/esm/errors/BaffError.d.ts +26 -0
- package/dist/esm/errors/BaffError.js +33 -0
- package/dist/esm/gateway/Gateway.d.ts +53 -0
- package/dist/esm/gateway/Gateway.js +124 -0
- package/dist/esm/http/handler.d.ts +11 -0
- package/dist/esm/http/handler.js +68 -0
- package/dist/esm/http/verify.d.ts +11 -0
- package/dist/esm/http/verify.js +22 -0
- package/dist/esm/index.d.ts +51 -0
- package/dist/esm/index.js +49 -0
- package/dist/esm/managers/CachedManager.d.ts +16 -0
- package/dist/esm/managers/CachedManager.js +14 -0
- package/dist/esm/managers/ChannelManager.d.ts +23 -0
- package/dist/esm/managers/ChannelManager.js +81 -0
- package/dist/esm/managers/CommandManager.d.ts +32 -0
- package/dist/esm/managers/CommandManager.js +67 -0
- package/dist/esm/managers/EventManager.d.ts +15 -0
- package/dist/esm/managers/EventManager.js +32 -0
- package/dist/esm/managers/ExpressionManagers.d.ts +36 -0
- package/dist/esm/managers/ExpressionManagers.js +68 -0
- package/dist/esm/managers/InviteManager.d.ts +17 -0
- package/dist/esm/managers/InviteManager.js +22 -0
- package/dist/esm/managers/MemberManager.d.ts +31 -0
- package/dist/esm/managers/MemberManager.js +58 -0
- package/dist/esm/managers/MessageManager.d.ts +32 -0
- package/dist/esm/managers/MessageManager.js +75 -0
- package/dist/esm/managers/RoleManager.d.ts +22 -0
- package/dist/esm/managers/RoleManager.js +69 -0
- package/dist/esm/managers/ServerChannelManager.d.ts +20 -0
- package/dist/esm/managers/ServerChannelManager.js +26 -0
- package/dist/esm/managers/ServerManager.d.ts +12 -0
- package/dist/esm/managers/ServerManager.js +58 -0
- package/dist/esm/managers/ThreadManager.d.ts +12 -0
- package/dist/esm/managers/ThreadManager.js +16 -0
- package/dist/esm/managers/UserManager.d.ts +11 -0
- package/dist/esm/managers/UserManager.js +34 -0
- package/dist/esm/managers/VoiceManager.d.ts +8 -0
- package/dist/esm/managers/VoiceManager.js +13 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/rest/REST.d.ts +58 -0
- package/dist/esm/rest/REST.js +188 -0
- package/dist/esm/rest/Routes.d.ts +54 -0
- package/dist/esm/rest/Routes.js +55 -0
- package/dist/esm/rest/files.d.ts +19 -0
- package/dist/esm/rest/files.js +31 -0
- package/dist/esm/structures/Base.d.ts +13 -0
- package/dist/esm/structures/Base.js +25 -0
- package/dist/esm/structures/Message.d.ts +91 -0
- package/dist/esm/structures/Message.js +194 -0
- package/dist/esm/structures/Role.d.ts +34 -0
- package/dist/esm/structures/Role.js +79 -0
- package/dist/esm/structures/ScheduledEvent.d.ts +37 -0
- package/dist/esm/structures/ScheduledEvent.js +68 -0
- package/dist/esm/structures/Server.d.ts +68 -0
- package/dist/esm/structures/Server.js +120 -0
- package/dist/esm/structures/ServerAssets.d.ts +48 -0
- package/dist/esm/structures/ServerAssets.js +98 -0
- package/dist/esm/structures/ServerMember.d.ts +47 -0
- package/dist/esm/structures/ServerMember.js +133 -0
- package/dist/esm/structures/User.d.ts +35 -0
- package/dist/esm/structures/User.js +82 -0
- package/dist/esm/structures/Webhook.d.ts +30 -0
- package/dist/esm/structures/Webhook.js +63 -0
- package/dist/esm/structures/channels/BaseChannel.d.ts +49 -0
- package/dist/esm/structures/channels/BaseChannel.js +77 -0
- package/dist/esm/structures/channels/DMChannel.d.ts +9 -0
- package/dist/esm/structures/channels/DMChannel.js +17 -0
- package/dist/esm/structures/channels/ServerChannels.d.ts +57 -0
- package/dist/esm/structures/channels/ServerChannels.js +129 -0
- package/dist/esm/structures/channels/TextBasedChannel.d.ts +25 -0
- package/dist/esm/structures/channels/TextBasedChannel.js +49 -0
- package/dist/esm/structures/interactions/BaseInteraction.d.ts +74 -0
- package/dist/esm/structures/interactions/BaseInteraction.js +217 -0
- package/dist/esm/structures/interactions/CommandInteraction.d.ts +44 -0
- package/dist/esm/structures/interactions/CommandInteraction.js +104 -0
- package/dist/esm/structures/interactions/ComponentInteraction.d.ts +44 -0
- package/dist/esm/structures/interactions/ComponentInteraction.js +53 -0
- package/dist/esm/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
- package/dist/esm/structures/interactions/ModalSubmitInteraction.js +37 -0
- package/dist/esm/structures/interactions/createInteraction.d.ts +4 -0
- package/dist/esm/structures/interactions/createInteraction.js +31 -0
- package/dist/esm/types.d.ts +369 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/util/Collection.d.ts +32 -0
- package/dist/esm/util/Collection.js +141 -0
- package/dist/esm/util/Permissions.d.ts +87 -0
- package/dist/esm/util/Permissions.js +109 -0
- package/dist/esm/util/Snowflake.d.ts +20 -0
- package/dist/esm/util/Snowflake.js +37 -0
- package/dist/esm/util/TypedEmitter.d.ts +17 -0
- package/dist/esm/util/TypedEmitter.js +2 -0
- package/dist/esm/util/constants.d.ts +78 -0
- package/dist/esm/util/constants.js +78 -0
- package/dist/esm/util/emoji.d.ts +8 -0
- package/dist/esm/util/emoji.js +7 -0
- package/dist/esm/util/formatters.d.ts +29 -0
- package/dist/esm/util/formatters.js +34 -0
- package/package.json +58 -6
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AttachmentBuilder, type RawFile } from '../rest/files.js';
|
|
2
|
+
import type { APIComponent, APIEmbed } from '../types.js';
|
|
3
|
+
import { EmbedBuilder } from './EmbedBuilder.js';
|
|
4
|
+
import { type Serializable } from './validate.js';
|
|
5
|
+
export interface PollData {
|
|
6
|
+
question: string;
|
|
7
|
+
answers: {
|
|
8
|
+
text: string;
|
|
9
|
+
emoji?: string;
|
|
10
|
+
}[];
|
|
11
|
+
duration?: number;
|
|
12
|
+
allowMultiselect?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface MessageOptions {
|
|
15
|
+
content?: string;
|
|
16
|
+
embeds?: (EmbedBuilder | APIEmbed)[];
|
|
17
|
+
components?: (Serializable | APIComponent)[];
|
|
18
|
+
files?: (AttachmentBuilder | RawFile)[];
|
|
19
|
+
flags?: number;
|
|
20
|
+
ephemeral?: boolean;
|
|
21
|
+
replyTo?: string;
|
|
22
|
+
mentionReply?: boolean;
|
|
23
|
+
stickers?: string[];
|
|
24
|
+
poll?: PollData;
|
|
25
|
+
nonce?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ResolvedMessage {
|
|
28
|
+
body: Record<string, unknown>;
|
|
29
|
+
files: RawFile[];
|
|
30
|
+
}
|
|
31
|
+
export declare function checkComponents(list: APIComponent[], v2: boolean): void;
|
|
32
|
+
export declare function resolveEmbeds(embeds: (EmbedBuilder | APIEmbed)[]): APIEmbed[];
|
|
33
|
+
export declare function resolveMessage(input: string | MessageOptions, options?: {
|
|
34
|
+
allowEphemeral?: boolean;
|
|
35
|
+
}): ResolvedMessage;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { BaffError } from '../errors/BaffError.js';
|
|
2
|
+
import { AttachmentBuilder } from '../rest/files.js';
|
|
3
|
+
import { ComponentType, MessageFlags } from '../util/constants.js';
|
|
4
|
+
import { EmbedBuilder, EmbedLimits } from './EmbedBuilder.js';
|
|
5
|
+
import { resolveJSON } from './validate.js';
|
|
6
|
+
const V2_ONLY = new Set([ComponentType.Section, ComponentType.TextDisplay, ComponentType.MediaGallery, ComponentType.Separator, ComponentType.Container]);
|
|
7
|
+
const MAX_COMPONENTS = 40;
|
|
8
|
+
const MAX_ROWS = 5;
|
|
9
|
+
const MAX_TEXT = 4000;
|
|
10
|
+
export function checkComponents(list, v2) {
|
|
11
|
+
const code = 'INVALID_COMPONENT';
|
|
12
|
+
if (!v2 && list.length > MAX_ROWS)
|
|
13
|
+
throw new BaffError(code, `A message can have up to ${MAX_ROWS} action rows (or use the IsComponentsV2 flag).`);
|
|
14
|
+
let total = 0;
|
|
15
|
+
let textLength = 0;
|
|
16
|
+
const ids = new Set();
|
|
17
|
+
const visit = (component) => {
|
|
18
|
+
total++;
|
|
19
|
+
if (typeof component.custom_id === 'string') {
|
|
20
|
+
if (ids.has(component.custom_id))
|
|
21
|
+
throw new BaffError(code, `Custom id "${component.custom_id}" is used twice in one message.`);
|
|
22
|
+
ids.add(component.custom_id);
|
|
23
|
+
}
|
|
24
|
+
if (component.type === ComponentType.TextDisplay)
|
|
25
|
+
textLength += [...String(component.content)].length;
|
|
26
|
+
for (const child of component.components ?? [])
|
|
27
|
+
visit(child);
|
|
28
|
+
if (component.accessory)
|
|
29
|
+
visit(component.accessory);
|
|
30
|
+
};
|
|
31
|
+
list.forEach(visit);
|
|
32
|
+
if (total > MAX_COMPONENTS)
|
|
33
|
+
throw new BaffError(code, `A message can have up to ${MAX_COMPONENTS} components in total (nested ones included); this has ${total}.`);
|
|
34
|
+
if (textLength > MAX_TEXT)
|
|
35
|
+
throw new BaffError(code, `Text displays can have up to ${MAX_TEXT} characters in total; this has ${textLength}.`);
|
|
36
|
+
}
|
|
37
|
+
export function resolveEmbeds(embeds) {
|
|
38
|
+
if (embeds.length > EmbedLimits.embeds)
|
|
39
|
+
throw new BaffError('INVALID_EMBED', `A message can have up to ${EmbedLimits.embeds} embeds.`);
|
|
40
|
+
const out = embeds.map((embed) => (embed instanceof EmbedBuilder ? embed.toJSON() : new EmbedBuilder(embed).toJSON()));
|
|
41
|
+
const total = embeds.reduce((sum, embed) => sum + (embed instanceof EmbedBuilder ? embed : new EmbedBuilder(embed)).length, 0);
|
|
42
|
+
if (total > EmbedLimits.total)
|
|
43
|
+
throw new BaffError('INVALID_EMBED', `Embeds can have up to ${EmbedLimits.total} characters in total; these have ${total}.`);
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
export function resolveMessage(input, options = {}) {
|
|
47
|
+
const message = typeof input === 'string' ? { content: input } : input;
|
|
48
|
+
const body = {};
|
|
49
|
+
let flags = message.flags ?? 0;
|
|
50
|
+
if (message.content !== undefined)
|
|
51
|
+
body.content = message.content;
|
|
52
|
+
if (message.embeds)
|
|
53
|
+
body.embeds = resolveEmbeds(message.embeds);
|
|
54
|
+
if (message.components) {
|
|
55
|
+
const components = message.components.map((c) => resolveJSON(c));
|
|
56
|
+
if (components.some((c) => V2_ONLY.has(c.type)))
|
|
57
|
+
flags |= MessageFlags.IsComponentsV2;
|
|
58
|
+
checkComponents(components, (flags & MessageFlags.IsComponentsV2) !== 0);
|
|
59
|
+
body.components = components;
|
|
60
|
+
}
|
|
61
|
+
if ((flags & MessageFlags.IsComponentsV2) !== 0 && (body.content || body.embeds?.length)) {
|
|
62
|
+
throw new BaffError('INVALID_COMPONENT', 'A message with the IsComponentsV2 flag can not have content or embeds: put the text in text displays.');
|
|
63
|
+
}
|
|
64
|
+
if (message.ephemeral) {
|
|
65
|
+
if (!options.allowEphemeral)
|
|
66
|
+
throw new BaffError('INVALID_MESSAGE', 'ephemeral only works on interaction replies.');
|
|
67
|
+
body.ephemeral = true;
|
|
68
|
+
}
|
|
69
|
+
if (flags)
|
|
70
|
+
body.flags = flags;
|
|
71
|
+
if (message.replyTo)
|
|
72
|
+
body.replyTo = message.replyTo;
|
|
73
|
+
if (message.mentionReply !== undefined)
|
|
74
|
+
body.mentionReply = message.mentionReply;
|
|
75
|
+
if (message.stickers?.length)
|
|
76
|
+
body.stickerIds = message.stickers;
|
|
77
|
+
if (message.poll)
|
|
78
|
+
body.poll = message.poll;
|
|
79
|
+
if (message.nonce)
|
|
80
|
+
body.nonce = message.nonce;
|
|
81
|
+
const files = (message.files ?? []).map((f) => (f instanceof AttachmentBuilder ? f.toFile() : f));
|
|
82
|
+
return { body, files };
|
|
83
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function fail(code: string, path: string, message: string): never;
|
|
2
|
+
export declare function text(code: string, path: string, value: unknown, max: number, options?: {
|
|
3
|
+
min?: number;
|
|
4
|
+
optional?: boolean;
|
|
5
|
+
}): string | undefined;
|
|
6
|
+
export declare function url(code: string, path: string, value: unknown, optional?: boolean): string | undefined;
|
|
7
|
+
export declare function range(code: string, path: string, value: number, min: number, max: number): number;
|
|
8
|
+
export interface Serializable {
|
|
9
|
+
toJSON(): unknown;
|
|
10
|
+
}
|
|
11
|
+
export declare function isSerializable(value: unknown): value is Serializable;
|
|
12
|
+
export declare function resolveJSON<T>(value: T | Serializable): T;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { BaffError } from '../errors/BaffError.js';
|
|
2
|
+
export function fail(code, path, message) {
|
|
3
|
+
throw new BaffError(code, `${path} ${message}`);
|
|
4
|
+
}
|
|
5
|
+
export function text(code, path, value, max, options = {}) {
|
|
6
|
+
if (value === undefined || value === null || value === '') {
|
|
7
|
+
if (options.optional)
|
|
8
|
+
return undefined;
|
|
9
|
+
return fail(code, path, `is required (${options.min ?? 1}-${max} characters).`);
|
|
10
|
+
}
|
|
11
|
+
if (typeof value !== 'string')
|
|
12
|
+
return fail(code, path, 'must be a string.');
|
|
13
|
+
if ((options.min ?? 1) > value.length || [...value].length > max)
|
|
14
|
+
return fail(code, path, `must be ${options.min ?? 1}-${max} characters.`);
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
export function url(code, path, value, optional = true) {
|
|
18
|
+
if (value === undefined || value === null) {
|
|
19
|
+
if (optional)
|
|
20
|
+
return undefined;
|
|
21
|
+
return fail(code, path, 'is required.');
|
|
22
|
+
}
|
|
23
|
+
if (typeof value !== 'string' || value.length > 2048)
|
|
24
|
+
return fail(code, path, 'must be an http:// or https:// URL.');
|
|
25
|
+
let parsed;
|
|
26
|
+
try {
|
|
27
|
+
parsed = new URL(value);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return fail(code, path, 'must be an http:// or https:// URL.');
|
|
31
|
+
}
|
|
32
|
+
if (!/^https?:$/.test(parsed.protocol) || parsed.username || parsed.password)
|
|
33
|
+
return fail(code, path, 'must be an http:// or https:// URL.');
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
export function range(code, path, value, min, max) {
|
|
37
|
+
if (!Number.isInteger(value) || value < min || value > max)
|
|
38
|
+
return fail(code, path, `must be a whole number from ${min} to ${max}.`);
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
export function isSerializable(value) {
|
|
42
|
+
return typeof value === 'object' && value !== null && typeof value.toJSON === 'function';
|
|
43
|
+
}
|
|
44
|
+
export function resolveJSON(value) {
|
|
45
|
+
return (isSerializable(value) ? value.toJSON() : value);
|
|
46
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type WebSocketConstructor } from '../gateway/Gateway.js';
|
|
2
|
+
import { ApplicationCommandManager } from '../managers/CommandManager.js';
|
|
3
|
+
import { ChannelManager } from '../managers/ChannelManager.js';
|
|
4
|
+
import { ServerManager } from '../managers/ServerManager.js';
|
|
5
|
+
import { UserManager } from '../managers/UserManager.js';
|
|
6
|
+
import { VoiceManager } from '../managers/VoiceManager.js';
|
|
7
|
+
import { REST, type RESTOptions } from '../rest/REST.js';
|
|
8
|
+
import { Invite } from '../structures/ServerAssets.js';
|
|
9
|
+
import { ClientUser } from '../structures/User.js';
|
|
10
|
+
import { type PermissionResolvable } from '../util/Permissions.js';
|
|
11
|
+
import { TypedEmitter } from '../util/TypedEmitter.js';
|
|
12
|
+
import type { ClientEvents } from './events.js';
|
|
13
|
+
export interface ClientOptions {
|
|
14
|
+
token?: string;
|
|
15
|
+
applicationId?: string;
|
|
16
|
+
api?: string;
|
|
17
|
+
gateway?: string;
|
|
18
|
+
appUrl?: string;
|
|
19
|
+
WebSocket?: WebSocketConstructor;
|
|
20
|
+
fetch?: typeof fetch;
|
|
21
|
+
rest?: Omit<RESTOptions, 'token' | 'api' | 'fetch'>;
|
|
22
|
+
reconnect?: boolean;
|
|
23
|
+
initialBackoff?: number;
|
|
24
|
+
maxBackoff?: number;
|
|
25
|
+
messageCacheLimit?: number;
|
|
26
|
+
fetchServersOnReady?: boolean;
|
|
27
|
+
fetchMembersOnReady?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare class ClientApplication {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly commands: ApplicationCommandManager;
|
|
32
|
+
constructor(client: Client, id: string);
|
|
33
|
+
}
|
|
34
|
+
export declare class Client extends TypedEmitter<ClientEvents> {
|
|
35
|
+
readonly options: Required<Omit<ClientOptions, 'token' | 'applicationId' | 'WebSocket' | 'fetch' | 'rest' | 'appUrl'>> & Pick<ClientOptions, 'WebSocket'>;
|
|
36
|
+
readonly rest: REST;
|
|
37
|
+
readonly appUrl: string;
|
|
38
|
+
readonly users: UserManager;
|
|
39
|
+
readonly servers: ServerManager;
|
|
40
|
+
readonly channels: ChannelManager;
|
|
41
|
+
readonly voice: VoiceManager;
|
|
42
|
+
user: ClientUser | null;
|
|
43
|
+
application: ClientApplication | null;
|
|
44
|
+
readyAt: Date | null;
|
|
45
|
+
private gateway;
|
|
46
|
+
constructor(options?: ClientOptions);
|
|
47
|
+
get token(): string | null;
|
|
48
|
+
get applicationId(): string | null;
|
|
49
|
+
get uptime(): number | null;
|
|
50
|
+
isReady(): boolean;
|
|
51
|
+
setApplicationId(id: string): void;
|
|
52
|
+
requireApplication(): ClientApplication;
|
|
53
|
+
requireApplicationId(): string;
|
|
54
|
+
fetchSelf(): Promise<ClientUser>;
|
|
55
|
+
login(token?: string): Promise<string>;
|
|
56
|
+
destroy(): Promise<void>;
|
|
57
|
+
generateInvite(options?: {
|
|
58
|
+
permissions?: PermissionResolvable;
|
|
59
|
+
applicationId?: string;
|
|
60
|
+
}): string;
|
|
61
|
+
fetchInvite(code: string): Promise<Invite>;
|
|
62
|
+
private sync;
|
|
63
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { BaffError } from '../errors/BaffError.js';
|
|
2
|
+
import { Gateway } from '../gateway/Gateway.js';
|
|
3
|
+
import { ApplicationCommandManager } from '../managers/CommandManager.js';
|
|
4
|
+
import { ChannelManager } from '../managers/ChannelManager.js';
|
|
5
|
+
import { ServerManager } from '../managers/ServerManager.js';
|
|
6
|
+
import { UserManager } from '../managers/UserManager.js';
|
|
7
|
+
import { VoiceManager } from '../managers/VoiceManager.js';
|
|
8
|
+
import { REST } from '../rest/REST.js';
|
|
9
|
+
import { Routes } from '../rest/Routes.js';
|
|
10
|
+
import { Invite } from '../structures/ServerAssets.js';
|
|
11
|
+
import { ClientUser } from '../structures/User.js';
|
|
12
|
+
import { DEFAULT_API_URL, DEFAULT_GATEWAY_URL } from '../util/constants.js';
|
|
13
|
+
import { PermissionsBitField } from '../util/Permissions.js';
|
|
14
|
+
import { TypedEmitter } from '../util/TypedEmitter.js';
|
|
15
|
+
import { dispatch } from './dispatch.js';
|
|
16
|
+
export class ClientApplication {
|
|
17
|
+
id;
|
|
18
|
+
commands;
|
|
19
|
+
constructor(client, id) {
|
|
20
|
+
this.id = id;
|
|
21
|
+
this.commands = new ApplicationCommandManager(client, () => id);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class Client extends TypedEmitter {
|
|
25
|
+
options;
|
|
26
|
+
rest;
|
|
27
|
+
appUrl;
|
|
28
|
+
users = new UserManager(this);
|
|
29
|
+
servers = new ServerManager(this);
|
|
30
|
+
channels = new ChannelManager(this);
|
|
31
|
+
voice = new VoiceManager(this);
|
|
32
|
+
user = null;
|
|
33
|
+
application = null;
|
|
34
|
+
readyAt = null;
|
|
35
|
+
gateway = null;
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
super({ captureRejections: true });
|
|
38
|
+
const api = (options.api ?? DEFAULT_API_URL).replace(/\/+$/, '');
|
|
39
|
+
this.options = {
|
|
40
|
+
api,
|
|
41
|
+
gateway: options.gateway ?? DEFAULT_GATEWAY_URL,
|
|
42
|
+
WebSocket: options.WebSocket,
|
|
43
|
+
reconnect: options.reconnect ?? true,
|
|
44
|
+
initialBackoff: options.initialBackoff ?? 1000,
|
|
45
|
+
maxBackoff: options.maxBackoff ?? 30_000,
|
|
46
|
+
messageCacheLimit: options.messageCacheLimit ?? 200,
|
|
47
|
+
fetchServersOnReady: options.fetchServersOnReady ?? true,
|
|
48
|
+
fetchMembersOnReady: options.fetchMembersOnReady ?? false
|
|
49
|
+
};
|
|
50
|
+
this.appUrl = (options.appUrl ?? api.replace(/\/api$/, '')).replace(/\/+$/, '');
|
|
51
|
+
this.rest = new REST({ ...options.rest, api, token: options.token, fetch: options.fetch });
|
|
52
|
+
this.rest.on('rateLimited', (info) => this.emit('debug', `Rate limited on ${info.method} ${info.path}; waiting ${info.retryAfter}s.`));
|
|
53
|
+
if (options.applicationId)
|
|
54
|
+
this.setApplicationId(options.applicationId);
|
|
55
|
+
}
|
|
56
|
+
get token() {
|
|
57
|
+
return this.rest.token;
|
|
58
|
+
}
|
|
59
|
+
get applicationId() {
|
|
60
|
+
return this.application?.id ?? null;
|
|
61
|
+
}
|
|
62
|
+
get uptime() {
|
|
63
|
+
return this.readyAt ? Date.now() - this.readyAt.getTime() : null;
|
|
64
|
+
}
|
|
65
|
+
isReady() {
|
|
66
|
+
return this.readyAt !== null;
|
|
67
|
+
}
|
|
68
|
+
setApplicationId(id) {
|
|
69
|
+
if (this.application?.id !== id)
|
|
70
|
+
this.application = new ClientApplication(this, id);
|
|
71
|
+
}
|
|
72
|
+
requireApplication() {
|
|
73
|
+
if (!this.application) {
|
|
74
|
+
throw new BaffError('NO_APPLICATION_ID', 'The application id is unknown. Pass applicationId to Client: baff.gg does not tell bots their application id.');
|
|
75
|
+
}
|
|
76
|
+
return this.application;
|
|
77
|
+
}
|
|
78
|
+
requireApplicationId() {
|
|
79
|
+
return this.requireApplication().id;
|
|
80
|
+
}
|
|
81
|
+
async fetchSelf() {
|
|
82
|
+
const data = await this.rest.get(Routes.me());
|
|
83
|
+
if (this.user)
|
|
84
|
+
this.user._patch(data);
|
|
85
|
+
else
|
|
86
|
+
this.user = new ClientUser(this, data);
|
|
87
|
+
this.users.cache.set(this.user.id, this.user);
|
|
88
|
+
return this.user;
|
|
89
|
+
}
|
|
90
|
+
async login(token) {
|
|
91
|
+
if (token)
|
|
92
|
+
this.rest.setToken(token);
|
|
93
|
+
if (!this.rest.token)
|
|
94
|
+
throw new BaffError('NO_TOKEN', 'No token provided. Pass it to Client or login().');
|
|
95
|
+
await this.fetchSelf();
|
|
96
|
+
const gateway = new Gateway({
|
|
97
|
+
token: this.rest.token,
|
|
98
|
+
url: this.options.gateway,
|
|
99
|
+
WebSocket: this.options.WebSocket,
|
|
100
|
+
reconnect: this.options.reconnect,
|
|
101
|
+
initialBackoff: this.options.initialBackoff,
|
|
102
|
+
maxBackoff: this.options.maxBackoff
|
|
103
|
+
});
|
|
104
|
+
this.gateway = gateway;
|
|
105
|
+
gateway.on('dispatch', (event, data) => dispatch(this, event, data));
|
|
106
|
+
gateway.on('debug', (message) => this.emit('debug', message));
|
|
107
|
+
gateway.on('disconnect', (code, reason) => this.emit('disconnect', code, reason));
|
|
108
|
+
gateway.on('reconnecting', (attempt, delay) => this.emit('reconnecting', attempt, delay));
|
|
109
|
+
gateway.on('reconnected', () => {
|
|
110
|
+
this.sync().then(() => this.emit('reconnected', this), (error) => this.emit('debug', `Resync after reconnect failed: ${error.message}`));
|
|
111
|
+
});
|
|
112
|
+
try {
|
|
113
|
+
await gateway.connect();
|
|
114
|
+
await this.sync();
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
gateway.destroy();
|
|
118
|
+
this.gateway = null;
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
this.readyAt = new Date();
|
|
122
|
+
this.emit('ready', this);
|
|
123
|
+
return this.rest.token;
|
|
124
|
+
}
|
|
125
|
+
async destroy() {
|
|
126
|
+
this.gateway?.destroy();
|
|
127
|
+
this.gateway = null;
|
|
128
|
+
this.readyAt = null;
|
|
129
|
+
}
|
|
130
|
+
generateInvite(options = {}) {
|
|
131
|
+
const id = options.applicationId ?? this.requireApplicationId();
|
|
132
|
+
const permissions = new PermissionsBitField(options.permissions ?? 0n);
|
|
133
|
+
return `${this.appUrl}/oauth2/authorize?client_id=${id}&permissions=${permissions}`;
|
|
134
|
+
}
|
|
135
|
+
async fetchInvite(code) {
|
|
136
|
+
return new Invite(this, await this.rest.get(Routes.invite(code), { auth: false }));
|
|
137
|
+
}
|
|
138
|
+
async sync() {
|
|
139
|
+
if (!this.options.fetchServersOnReady)
|
|
140
|
+
return;
|
|
141
|
+
await this.users.fetchTags().catch((error) => this.emit('debug', `Could not load user tags: ${error.message}`));
|
|
142
|
+
const servers = await this.servers.fetch();
|
|
143
|
+
if (this.options.fetchMembersOnReady) {
|
|
144
|
+
await Promise.all(servers.map((server) => server.members.fetch().catch((error) => this.emit('debug', `Members of ${server.id}: ${error.message}`))));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { MessageReaction } from '../structures/Message.js';
|
|
2
|
+
import { ThreadChannel } from '../structures/channels/ServerChannels.js';
|
|
3
|
+
import { createInteraction } from '../structures/interactions/createInteraction.js';
|
|
4
|
+
import { ScheduledEvent } from '../structures/ScheduledEvent.js';
|
|
5
|
+
const handlers = {
|
|
6
|
+
SERVER_CREATE(client, d) {
|
|
7
|
+
client.emit('serverCreate', client.servers._add(d));
|
|
8
|
+
},
|
|
9
|
+
SERVER_UPDATE(client, d) {
|
|
10
|
+
const server = client.servers.cache.get(d.id);
|
|
11
|
+
if (!server)
|
|
12
|
+
return void client.servers._add(d);
|
|
13
|
+
const before = server._clone();
|
|
14
|
+
client.emit('serverUpdate', before, server._patch(d));
|
|
15
|
+
},
|
|
16
|
+
SERVER_REMOVE(client, d) {
|
|
17
|
+
const server = client.servers._remove(d.serverId);
|
|
18
|
+
client.emit('serverRemove', { id: d.serverId, reason: d.reason ?? null, server });
|
|
19
|
+
},
|
|
20
|
+
SERVER_CHANNELS_UPDATE(client, d) {
|
|
21
|
+
const { created, updated, deleted } = client.channels._replaceServer(d.serverId, d.channels);
|
|
22
|
+
created.forEach((c) => client.emit('channelCreate', c));
|
|
23
|
+
updated.forEach(([before, after]) => client.emit('channelUpdate', before, after));
|
|
24
|
+
deleted.forEach((c) => client.emit('channelDelete', c));
|
|
25
|
+
},
|
|
26
|
+
SERVER_ROLES_UPDATE(client, d) {
|
|
27
|
+
const server = client.servers.cache.get(d.serverId);
|
|
28
|
+
if (!server)
|
|
29
|
+
return;
|
|
30
|
+
const { created, updated, deleted } = server.roles._setAll(d.roles);
|
|
31
|
+
created.forEach((r) => client.emit('roleCreate', r));
|
|
32
|
+
updated.forEach(([before, after]) => client.emit('roleUpdate', before, after));
|
|
33
|
+
deleted.forEach((r) => client.emit('roleDelete', r));
|
|
34
|
+
},
|
|
35
|
+
THREAD_UPDATE(client, d) {
|
|
36
|
+
const data = { ...d.channel, serverId: d.serverId };
|
|
37
|
+
const existing = client.channels.cache.get(data.id);
|
|
38
|
+
if (!(existing instanceof ThreadChannel))
|
|
39
|
+
return void client.emit('threadCreate', client.channels._addThread(data));
|
|
40
|
+
const before = existing._clone();
|
|
41
|
+
client.emit('threadUpdate', before, client.channels._addThread(data));
|
|
42
|
+
},
|
|
43
|
+
MESSAGE_CREATE(client, d) {
|
|
44
|
+
const channel = client.channels._textChannel(d.channelId, d.serverId ?? null);
|
|
45
|
+
channel.lastMessageId = d.id;
|
|
46
|
+
client.emit('messageCreate', channel.messages._add(d));
|
|
47
|
+
},
|
|
48
|
+
MESSAGE_UPDATE(client, d) {
|
|
49
|
+
const channel = client.channels._textChannel(d.channelId, d.serverId ?? null);
|
|
50
|
+
const cached = channel.messages.cache.get(d.id);
|
|
51
|
+
const before = cached ? cached._clone() : null;
|
|
52
|
+
client.emit('messageUpdate', before, channel.messages._add(d));
|
|
53
|
+
},
|
|
54
|
+
MESSAGE_DELETE(client, d) {
|
|
55
|
+
const channel = client.channels._textChannel(d.channelId, null);
|
|
56
|
+
client.emit('messageDelete', { id: d.id, channelId: d.channelId, channel, message: channel.messages._remove(d.id) });
|
|
57
|
+
},
|
|
58
|
+
MESSAGE_REACTION_ADD(client, d) {
|
|
59
|
+
const event = reactionEvent(client, d);
|
|
60
|
+
const message = event.message;
|
|
61
|
+
if (message) {
|
|
62
|
+
const own = d.userId === client.user?.id;
|
|
63
|
+
const existing = message.reactions.get(d.emoji);
|
|
64
|
+
if (existing) {
|
|
65
|
+
existing.count++;
|
|
66
|
+
existing.me ||= own;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
message.reactions.set(d.emoji, new MessageReaction(message, d.emoji, 1, own));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
client.emit('messageReactionAdd', event);
|
|
73
|
+
},
|
|
74
|
+
MESSAGE_REACTION_REMOVE(client, d) {
|
|
75
|
+
const event = reactionEvent(client, d);
|
|
76
|
+
const reaction = event.message?.reactions.get(d.emoji);
|
|
77
|
+
if (reaction) {
|
|
78
|
+
reaction.count = Math.max(0, reaction.count - 1);
|
|
79
|
+
if (d.userId === client.user?.id)
|
|
80
|
+
reaction.me = false;
|
|
81
|
+
if (reaction.count === 0)
|
|
82
|
+
event.message?.reactions.delete(d.emoji);
|
|
83
|
+
}
|
|
84
|
+
client.emit('messageReactionRemove', event);
|
|
85
|
+
},
|
|
86
|
+
MESSAGE_PIN(client, d) {
|
|
87
|
+
const channel = client.channels._textChannel(d.channelId, null);
|
|
88
|
+
const message = channel.messages.cache.get(d.messageId);
|
|
89
|
+
if (message)
|
|
90
|
+
message.pinned = d.pinned;
|
|
91
|
+
client.emit('messagePin', { channelId: d.channelId, messageId: d.messageId, pinned: d.pinned, channel });
|
|
92
|
+
},
|
|
93
|
+
TYPING_START(client, d) {
|
|
94
|
+
client.emit('typingStart', {
|
|
95
|
+
channelId: d.channelId,
|
|
96
|
+
userId: d.userId,
|
|
97
|
+
channel: client.channels._textChannel(d.channelId, null),
|
|
98
|
+
user: client.users.cache.get(d.userId) ?? null
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
MENTION(client, d) {
|
|
102
|
+
client.emit('mention', { channelId: d.channelId, messageId: d.messageId, serverId: d.serverId ?? null });
|
|
103
|
+
},
|
|
104
|
+
POLL_VOTE(client, d) {
|
|
105
|
+
client.emit('pollVote', d);
|
|
106
|
+
},
|
|
107
|
+
MEMBER_ADD(client, d) {
|
|
108
|
+
const server = client.servers.cache.get(d.serverId);
|
|
109
|
+
if (server)
|
|
110
|
+
client.emit('memberAdd', server.members._add(d.member));
|
|
111
|
+
},
|
|
112
|
+
MEMBER_REMOVE(client, d) {
|
|
113
|
+
const server = client.servers.cache.get(d.serverId);
|
|
114
|
+
const member = server?.members.cache.get(d.userId) ?? null;
|
|
115
|
+
server?.members.cache.delete(d.userId);
|
|
116
|
+
client.emit('memberRemove', { serverId: d.serverId, userId: d.userId, member, user: member?.user ?? client.users.cache.get(d.userId) ?? null });
|
|
117
|
+
},
|
|
118
|
+
MEMBER_UPDATE(client, d) {
|
|
119
|
+
const server = client.servers.cache.get(d.serverId);
|
|
120
|
+
if (!server)
|
|
121
|
+
return;
|
|
122
|
+
const cached = server.members.cache.get(d.userId);
|
|
123
|
+
const user = client.users.cache.get(d.userId) ?? { id: d.userId, username: '' };
|
|
124
|
+
const before = cached ? cached._clone() : null;
|
|
125
|
+
const after = cached ?? server.members._add({ user, roles: [], nick: null });
|
|
126
|
+
after._patch(d);
|
|
127
|
+
client.emit('memberUpdate', before, after);
|
|
128
|
+
},
|
|
129
|
+
PRESENCE_UPDATE(client, d) {
|
|
130
|
+
const user = client.users.cache.get(d.userId) ?? null;
|
|
131
|
+
user?._patch({ status: d.status, customStatus: d.customStatus ?? null });
|
|
132
|
+
client.emit('presenceUpdate', { userId: d.userId, status: d.status, customStatus: d.customStatus ?? null, user });
|
|
133
|
+
},
|
|
134
|
+
USER_UPDATE(client, d) {
|
|
135
|
+
const cached = client.users.cache.get(d.id);
|
|
136
|
+
const before = cached ? cached._clone() : null;
|
|
137
|
+
client.emit('userUpdate', before, client.users._add(d));
|
|
138
|
+
},
|
|
139
|
+
CLAN_TAG_UPDATE(client, d) {
|
|
140
|
+
client.emit('clanTagUpdate', d);
|
|
141
|
+
},
|
|
142
|
+
DM_OPEN(client, d) {
|
|
143
|
+
client.emit('dmOpen', client.channels._addDM(d));
|
|
144
|
+
},
|
|
145
|
+
VOICE_STATE_UPDATE(client, d) {
|
|
146
|
+
const state = d;
|
|
147
|
+
const states = state.serverId ? client.servers.cache.get(state.serverId)?.voiceStates : undefined;
|
|
148
|
+
const before = states?.get(state.userId) ?? null;
|
|
149
|
+
if (state.channelId)
|
|
150
|
+
states?.set(state.userId, state);
|
|
151
|
+
else
|
|
152
|
+
states?.delete(state.userId);
|
|
153
|
+
client.emit('voiceStateUpdate', before, state);
|
|
154
|
+
},
|
|
155
|
+
SOUNDBOARD_PLAY: (client, d) => void client.emit('soundboardPlay', d),
|
|
156
|
+
CALL_ALONE: (client, d) => void client.emit('callAlone', d),
|
|
157
|
+
STAGE_INSTANCE_CREATE: (client, d) => void client.emit('stageInstanceCreate', d),
|
|
158
|
+
STAGE_INSTANCE_UPDATE: (client, d) => void client.emit('stageInstanceUpdate', d),
|
|
159
|
+
STAGE_INSTANCE_DELETE: (client, d) => void client.emit('stageInstanceDelete', d),
|
|
160
|
+
VOICE_CHANNEL_STATUS_UPDATE: (client, d) => void client.emit('voiceChannelStatusUpdate', d),
|
|
161
|
+
SERVER_SOUNDBOARD_UPDATE: (client, d) => void client.emit('serverSoundboardUpdate', d),
|
|
162
|
+
SERVER_STICKERS_UPDATE(client, d) {
|
|
163
|
+
client.servers.cache.get(d.serverId)?.stickers._setAll(d.stickers);
|
|
164
|
+
client.emit('serverStickersUpdate', d);
|
|
165
|
+
},
|
|
166
|
+
SERVER_EVENT_CREATE(client, d) {
|
|
167
|
+
const server = client.servers.cache.get(d.serverId);
|
|
168
|
+
client.emit('serverEventCreate', server ? server.events._add(d) : new ScheduledEvent(client, d));
|
|
169
|
+
},
|
|
170
|
+
SERVER_EVENT_UPDATE(client, d) {
|
|
171
|
+
const server = client.servers.cache.get(d.serverId);
|
|
172
|
+
client.emit('serverEventUpdate', server ? server.events._add(d) : new ScheduledEvent(client, d));
|
|
173
|
+
},
|
|
174
|
+
SERVER_EVENT_DELETE(client, d) {
|
|
175
|
+
client.servers.cache.get(d.serverId)?.events.cache.delete(d.id);
|
|
176
|
+
client.emit('serverEventDelete', { serverId: d.serverId, id: d.id });
|
|
177
|
+
},
|
|
178
|
+
SERVER_EVENT_USER_ADD(client, d) {
|
|
179
|
+
const event = client.servers.cache.get(d.serverId)?.events.cache.get(d.eventId);
|
|
180
|
+
if (event)
|
|
181
|
+
event.interestedCount = d.interestedCount;
|
|
182
|
+
client.emit('serverEventUserAdd', { serverId: d.serverId, eventId: d.eventId, userId: d.userId, interestedCount: d.interestedCount });
|
|
183
|
+
},
|
|
184
|
+
SERVER_EVENT_USER_REMOVE(client, d) {
|
|
185
|
+
const event = client.servers.cache.get(d.serverId)?.events.cache.get(d.eventId);
|
|
186
|
+
if (event)
|
|
187
|
+
event.interestedCount = d.interestedCount;
|
|
188
|
+
client.emit('serverEventUserRemove', { serverId: d.serverId, eventId: d.eventId, userId: d.userId, interestedCount: d.interestedCount });
|
|
189
|
+
},
|
|
190
|
+
INTERACTION_CREATE(client, d) {
|
|
191
|
+
const raw = d;
|
|
192
|
+
if (raw.type === 'ping')
|
|
193
|
+
return;
|
|
194
|
+
client.setApplicationId(raw.applicationId);
|
|
195
|
+
client.emit('interactionCreate', createInteraction(client, raw));
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
function reactionEvent(client, d) {
|
|
199
|
+
const channel = client.channels._textChannel(d.channelId, null);
|
|
200
|
+
return {
|
|
201
|
+
channelId: d.channelId,
|
|
202
|
+
messageId: d.messageId,
|
|
203
|
+
userId: d.userId,
|
|
204
|
+
emoji: d.emoji,
|
|
205
|
+
channel,
|
|
206
|
+
message: channel.messages.cache.get(d.messageId) ?? null,
|
|
207
|
+
user: client.users.cache.get(d.userId) ?? null
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
export function dispatch(client, event, data) {
|
|
211
|
+
client.emit('raw', { t: event, d: data });
|
|
212
|
+
try {
|
|
213
|
+
handlers[event]?.(client, data);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (client.listenerCount('error') > 0)
|
|
217
|
+
client.emit('error', error);
|
|
218
|
+
else
|
|
219
|
+
queueMicrotask(() => { throw error; });
|
|
220
|
+
}
|
|
221
|
+
}
|