chapterjs 0.1.2 → 0.2.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/dist/assets/asset.d.ts +46 -0
- package/dist/assets/asset.js +86 -0
- package/dist/assets/public.d.ts +19 -0
- package/dist/assets/public.js +120 -0
- package/dist/cache/cache.d.ts +62 -0
- package/dist/cache/cache.js +80 -0
- package/dist/cache/store.d.ts +45 -0
- package/dist/cache/store.js +53 -0
- package/dist/cli/build.d.ts +41 -0
- package/dist/cli/build.js +205 -0
- package/dist/cli/cli.js +108 -25
- package/dist/cli/cluster.d.ts +70 -0
- package/dist/cli/cluster.js +213 -0
- package/dist/cli/dev.d.ts +18 -1
- package/dist/cli/dev.js +253 -198
- package/dist/cli/env.d.ts +31 -0
- package/dist/cli/env.js +93 -0
- package/dist/cli/log.d.ts +13 -0
- package/dist/cli/log.js +17 -0
- package/dist/cli/node-version.d.ts +8 -0
- package/dist/cli/node-version.js +13 -0
- package/dist/cli/preflight.d.ts +36 -0
- package/dist/cli/preflight.js +122 -0
- package/dist/cli/project.d.ts +135 -0
- package/dist/cli/project.js +517 -0
- package/dist/cli/start.d.ts +25 -0
- package/dist/cli/start.js +225 -0
- package/dist/commands/autocomplete.d.ts +13 -0
- package/dist/commands/autocomplete.js +159 -0
- package/dist/commands/command.d.ts +360 -0
- package/dist/commands/command.js +28 -0
- package/dist/commands/declaration.d.ts +77 -0
- package/dist/commands/declaration.js +492 -0
- package/dist/commands/register.d.ts +18 -0
- package/dist/commands/register.js +42 -0
- package/dist/commands/router.d.ts +20 -0
- package/dist/commands/router.js +228 -0
- package/dist/commands/tree.d.ts +47 -0
- package/dist/commands/tree.js +216 -0
- package/dist/commands/twins.d.ts +15 -0
- package/dist/commands/twins.js +78 -0
- package/dist/components/button.d.ts +79 -0
- package/dist/components/button.js +106 -0
- package/dist/components/component.d.ts +140 -0
- package/dist/components/component.js +39 -0
- package/dist/components/custom-id.d.ts +72 -0
- package/dist/components/custom-id.js +128 -0
- package/dist/components/declaration.d.ts +42 -0
- package/dist/components/declaration.js +342 -0
- package/dist/components/declared.d.ts +29 -0
- package/dist/components/declared.js +49 -0
- package/dist/components/embed.d.ts +29 -0
- package/dist/components/embed.js +11 -0
- package/dist/components/instance.d.ts +100 -0
- package/dist/components/instance.js +86 -0
- package/dist/components/layout.d.ts +103 -0
- package/dist/components/layout.js +279 -0
- package/dist/components/modal.d.ts +245 -0
- package/dist/components/modal.js +398 -0
- package/dist/components/options.d.ts +41 -0
- package/dist/components/options.js +101 -0
- package/dist/components/render.d.ts +12 -0
- package/dist/components/render.js +58 -0
- package/dist/components/router.d.ts +19 -0
- package/dist/components/router.js +251 -0
- package/dist/components/select.d.ts +146 -0
- package/dist/components/select.js +179 -0
- package/dist/core/bot.d.ts +99 -0
- package/dist/core/bot.js +174 -0
- package/dist/core/memory.d.ts +66 -0
- package/dist/core/memory.js +115 -0
- package/dist/discord/api.d.ts +112 -0
- package/dist/discord/api.js +115 -0
- package/dist/discord/cdn.d.ts +67 -0
- package/dist/discord/cdn.js +100 -0
- package/dist/discord/codes.d.ts +171 -0
- package/dist/discord/codes.js +421 -0
- package/dist/discord/endpoint.d.ts +56 -0
- package/dist/discord/endpoint.js +53 -0
- package/dist/discord/endpoints.d.ts +1529 -0
- package/dist/discord/endpoints.js +1139 -0
- package/dist/discord/formatting.d.ts +67 -0
- package/dist/discord/formatting.js +87 -0
- package/dist/discord/index.d.ts +10 -0
- package/dist/discord/index.js +13 -0
- package/dist/discord/intents.d.ts +48 -0
- package/dist/discord/intents.js +128 -0
- package/dist/discord/permissions.d.ts +94 -0
- package/dist/discord/permissions.js +185 -0
- package/dist/discord/snowflake.d.ts +21 -0
- package/dist/discord/snowflake.js +36 -0
- package/dist/discord/types/application-command.d.ts +332 -0
- package/dist/discord/types/application-command.js +48 -0
- package/dist/discord/types/application-role-connection-metadata.d.ts +42 -0
- package/dist/discord/types/application-role-connection-metadata.js +22 -0
- package/dist/discord/types/application.d.ts +208 -0
- package/dist/discord/types/application.js +48 -0
- package/dist/discord/types/audit-log.d.ts +255 -0
- package/dist/discord/types/audit-log.js +144 -0
- package/dist/discord/types/auto-moderation.d.ts +167 -0
- package/dist/discord/types/auto-moderation.js +52 -0
- package/dist/discord/types/channel.d.ts +557 -0
- package/dist/discord/types/channel.js +88 -0
- package/dist/discord/types/common.d.ts +54 -0
- package/dist/discord/types/common.js +38 -0
- package/dist/discord/types/component.d.ts +775 -0
- package/dist/discord/types/component.js +76 -0
- package/dist/discord/types/emoji.d.ts +74 -0
- package/dist/discord/types/emoji.js +1 -0
- package/dist/discord/types/entitlement.d.ts +84 -0
- package/dist/discord/types/entitlement.js +22 -0
- package/dist/discord/types/gateway-events.d.ts +1148 -0
- package/dist/discord/types/gateway-events.js +54 -0
- package/dist/discord/types/gateway.d.ts +38 -0
- package/dist/discord/types/gateway.js +1 -0
- package/dist/discord/types/guild-scheduled-event.d.ts +257 -0
- package/dist/discord/types/guild-scheduled-event.js +68 -0
- package/dist/discord/types/guild-template.d.ts +51 -0
- package/dist/discord/types/guild-template.js +1 -0
- package/dist/discord/types/guild.d.ts +910 -0
- package/dist/discord/types/guild.js +153 -0
- package/dist/discord/types/index.d.ts +31 -0
- package/dist/discord/types/index.js +31 -0
- package/dist/discord/types/interaction.d.ts +321 -0
- package/dist/discord/types/interaction.js +47 -0
- package/dist/discord/types/invite.d.ts +158 -0
- package/dist/discord/types/invite.js +39 -0
- package/dist/discord/types/message.d.ts +834 -0
- package/dist/discord/types/message.js +159 -0
- package/dist/discord/types/oauth2.d.ts +22 -0
- package/dist/discord/types/oauth2.js +1 -0
- package/dist/discord/types/permissions.d.ts +183 -0
- package/dist/discord/types/permissions.js +118 -0
- package/dist/discord/types/poll.d.ts +106 -0
- package/dist/discord/types/poll.js +8 -0
- package/dist/discord/types/sku.d.ts +47 -0
- package/dist/discord/types/sku.js +26 -0
- package/dist/discord/types/soundboard.d.ts +71 -0
- package/dist/discord/types/soundboard.js +1 -0
- package/dist/discord/types/stage-instance.d.ts +58 -0
- package/dist/discord/types/stage-instance.js +10 -0
- package/dist/discord/types/sticker.d.ts +115 -0
- package/dist/discord/types/sticker.js +20 -0
- package/dist/discord/types/subscription.d.ts +54 -0
- package/dist/discord/types/subscription.js +12 -0
- package/dist/discord/types/team.d.ts +55 -0
- package/dist/discord/types/team.js +21 -0
- package/dist/discord/types/user.d.ts +273 -0
- package/dist/discord/types/user.js +83 -0
- package/dist/discord/types/voice.d.ts +72 -0
- package/dist/discord/types/voice.js +1 -0
- package/dist/discord/types/webhook.d.ts +184 -0
- package/dist/discord/types/webhook.js +12 -0
- package/dist/events/declaration.d.ts +16 -0
- package/dist/events/declaration.js +80 -0
- package/dist/events/event.d.ts +45 -0
- package/dist/events/event.js +34 -0
- package/dist/events/registry.d.ts +697 -0
- package/dist/events/registry.js +839 -0
- package/dist/events/router.d.ts +46 -0
- package/dist/events/router.js +133 -0
- package/dist/gateway/errors.d.ts +18 -0
- package/dist/gateway/errors.js +47 -0
- package/dist/gateway/gateway.d.ts +64 -0
- package/dist/gateway/gateway.js +117 -0
- package/dist/gateway/identify-queue.d.ts +25 -0
- package/dist/gateway/identify-queue.js +29 -0
- package/dist/gateway/shard.d.ts +94 -0
- package/dist/gateway/shard.js +414 -0
- package/dist/gateway/state.d.ts +11 -0
- package/dist/gateway/state.js +184 -0
- package/dist/index.d.ts +57 -18
- package/dist/index.js +40 -12
- package/dist/interactions/cooldown.d.ts +33 -0
- package/dist/interactions/cooldown.js +74 -0
- package/dist/interactions/dispatch.d.ts +91 -0
- package/dist/interactions/dispatch.js +110 -0
- package/dist/loader/generated.d.ts +10 -0
- package/dist/loader/generated.js +80 -0
- package/dist/loader/hot.d.ts +13 -0
- package/dist/loader/hot.js +85 -0
- package/dist/loader/loader.d.ts +85 -0
- package/dist/loader/loader.js +119 -0
- package/dist/loader/locate.d.ts +10 -0
- package/dist/loader/locate.js +36 -0
- package/dist/loader/watch.d.ts +17 -0
- package/dist/loader/watch.js +66 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +5 -0
- package/dist/messages/commands.d.ts +23 -0
- package/dist/messages/commands.js +142 -0
- package/dist/messages/declaration.d.ts +89 -0
- package/dist/messages/declaration.js +455 -0
- package/dist/messages/messages.d.ts +241 -0
- package/dist/messages/messages.js +31 -0
- package/dist/messages/phrases.d.ts +23 -0
- package/dist/messages/phrases.js +44 -0
- package/dist/messages/translate.d.ts +100 -0
- package/dist/messages/translate.js +249 -0
- package/dist/presence/declaration.d.ts +19 -0
- package/dist/presence/declaration.js +118 -0
- package/dist/presence/presence.d.ts +57 -0
- package/dist/presence/presence.js +27 -0
- package/dist/rest/errors.d.ts +55 -0
- package/dist/rest/errors.js +92 -0
- package/dist/rest/rate-limiter.d.ts +46 -0
- package/dist/rest/rate-limiter.js +153 -0
- package/dist/rest/rest.d.ts +63 -0
- package/dist/rest/rest.js +194 -0
- package/dist/structures/base.d.ts +48 -0
- package/dist/structures/base.js +84 -0
- package/dist/structures/channel.d.ts +380 -0
- package/dist/structures/channel.js +627 -0
- package/dist/structures/context.d.ts +30 -0
- package/dist/structures/context.js +7 -0
- package/dist/structures/emoji.d.ts +46 -0
- package/dist/structures/emoji.js +65 -0
- package/dist/structures/entities.d.ts +62 -0
- package/dist/structures/entities.js +226 -0
- package/dist/structures/guild.d.ts +348 -0
- package/dist/structures/guild.js +466 -0
- package/dist/structures/interaction.d.ts +197 -0
- package/dist/structures/interaction.js +396 -0
- package/dist/structures/invite.d.ts +38 -0
- package/dist/structures/invite.js +57 -0
- package/dist/structures/known.d.ts +28 -0
- package/dist/structures/known.js +58 -0
- package/dist/structures/member.d.ts +140 -0
- package/dist/structures/member.js +260 -0
- package/dist/structures/message.d.ts +197 -0
- package/dist/structures/message.js +268 -0
- package/dist/structures/payload.d.ts +91 -0
- package/dist/structures/payload.js +184 -0
- package/dist/structures/role.d.ts +69 -0
- package/dist/structures/role.js +112 -0
- package/dist/structures/user.d.ts +59 -0
- package/dist/structures/user.js +94 -0
- package/dist/structures/webhook.d.ts +46 -0
- package/dist/structures/webhook.js +79 -0
- package/dist/tasks/declaration.d.ts +16 -0
- package/dist/tasks/declaration.js +56 -0
- package/dist/tasks/schedule.d.ts +54 -0
- package/dist/tasks/schedule.js +236 -0
- package/dist/tasks/scheduler.d.ts +35 -0
- package/dist/tasks/scheduler.js +107 -0
- package/dist/tasks/task.d.ts +75 -0
- package/dist/tasks/task.js +27 -0
- package/dist/util/case.d.ts +13 -0
- package/dist/util/case.js +54 -0
- package/dist/util/duration.d.ts +8 -0
- package/dist/util/duration.js +29 -0
- package/dist/util/websocket.d.ts +9 -0
- package/dist/util/websocket.js +31 -0
- package/dist/voice/connection.d.ts +90 -0
- package/dist/voice/connection.js +494 -0
- package/dist/voice/dave.d.ts +109 -0
- package/dist/voice/dave.js +245 -0
- package/dist/voice/opus.d.ts +19 -0
- package/dist/voice/opus.js +273 -0
- package/dist/voice/session.d.ts +55 -0
- package/dist/voice/session.js +405 -0
- package/dist/voice/source.d.ts +22 -0
- package/dist/voice/source.js +195 -0
- package/dist/voice/transport.d.ts +43 -0
- package/dist/voice/transport.js +140 -0
- package/dist/voice/usage.d.ts +4 -0
- package/dist/voice/usage.js +33 -0
- package/package.json +26 -7
- package/vendor/dave/LICENSE +231 -0
- package/vendor/dave/libdave.d.mts +99 -0
- package/vendor/dave/libdave.mjs +2 -0
- package/vendor/dave/libdave.wasm +0 -0
- package/dist/components.d.ts +0 -97
- package/dist/components.js +0 -260
- package/dist/context.d.ts +0 -72
- package/dist/context.js +0 -273
- package/dist/discord/client.d.ts +0 -35
- package/dist/discord/client.js +0 -66
- package/dist/discord/constants.d.ts +0 -49
- package/dist/discord/constants.js +0 -61
- package/dist/discord/events.d.ts +0 -129
- package/dist/discord/events.js +0 -102
- package/dist/discord/gateway.d.ts +0 -61
- package/dist/discord/gateway.js +0 -320
- package/dist/discord/payloads.d.ts +0 -275
- package/dist/discord/payloads.js +0 -3
- package/dist/discord/presence.d.ts +0 -42
- package/dist/discord/presence.js +0 -51
- package/dist/discord/rest.d.ts +0 -49
- package/dist/discord/rest.js +0 -271
- package/dist/discord/types.d.ts +0 -334
- package/dist/discord/types.js +0 -4
- package/dist/events.d.ts +0 -94
- package/dist/events.js +0 -255
- package/dist/presence.d.ts +0 -92
- package/dist/presence.js +0 -250
- package/dist/structures/Channel.d.ts +0 -110
- package/dist/structures/Channel.js +0 -171
- package/dist/structures/Guild.d.ts +0 -70
- package/dist/structures/Guild.js +0 -105
- package/dist/structures/Interaction.d.ts +0 -113
- package/dist/structures/Interaction.js +0 -274
- package/dist/structures/Member.d.ts +0 -70
- package/dist/structures/Member.js +0 -124
- package/dist/structures/Message.d.ts +0 -87
- package/dist/structures/Message.js +0 -182
- package/dist/structures/Reaction.d.ts +0 -38
- package/dist/structures/Reaction.js +0 -64
- package/dist/structures/Role.d.ts +0 -43
- package/dist/structures/Role.js +0 -77
- package/dist/structures/User.d.ts +0 -41
- package/dist/structures/User.js +0 -79
- package/dist/structures/utils.d.ts +0 -72
- package/dist/structures/utils.js +0 -59
- package/dist/utils/errors.d.ts +0 -5
- package/dist/utils/errors.js +0 -28
- package/dist/utils/modules.d.ts +0 -39
- package/dist/utils/modules.js +0 -156
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type GatewayIntentName } from '../discord/intents.js';
|
|
2
|
+
import { type RawApplication } from '../discord/types/application.js';
|
|
3
|
+
import type { RawGuild } from '../discord/types/guild.js';
|
|
4
|
+
import type { Rest } from '../rest/rest.js';
|
|
5
|
+
import type { Log } from './log.js';
|
|
6
|
+
export interface PreflightOptions {
|
|
7
|
+
rest: Rest;
|
|
8
|
+
log: Log;
|
|
9
|
+
/** Whether a person is watching: problems are then waited out. */
|
|
10
|
+
interactive: boolean;
|
|
11
|
+
/** How often a fix is looked for while waiting, in milliseconds. */
|
|
12
|
+
pollInterval: number;
|
|
13
|
+
/** Stops waiting (the user pressed Ctrl+C). */
|
|
14
|
+
signal: AbortSignal;
|
|
15
|
+
}
|
|
16
|
+
/** A problem that was explained and that stops the command. */
|
|
17
|
+
export declare class PreflightFailure extends Error {
|
|
18
|
+
}
|
|
19
|
+
/** The privileged intents among `intents` that the application lacks. */
|
|
20
|
+
export declare function missingPrivilegedIntents(intents: number, application: Pick<RawApplication, 'flags'>): GatewayIntentName[];
|
|
21
|
+
/**
|
|
22
|
+
* The link that adds the bot to one server.
|
|
23
|
+
* @see https://docs.discord.com/developers/topics/oauth2#bot-authorization-flow
|
|
24
|
+
*/
|
|
25
|
+
export declare function inviteUrl(applicationId: string, guildId: string): string;
|
|
26
|
+
/** Checks the token and returns the application of the bot. */
|
|
27
|
+
export declare function fetchApplication(rest: Rest): Promise<RawApplication>;
|
|
28
|
+
/** Makes sure the bot is in the dev server, and returns that server. */
|
|
29
|
+
export declare function ensureInDevGuild(options: PreflightOptions, applicationId: string, guildId: string): Promise<RawGuild>;
|
|
30
|
+
/**
|
|
31
|
+
* Makes sure the privileged intents the project needs are enabled.
|
|
32
|
+
* `filesByIntent` says which files need each intent.
|
|
33
|
+
*/
|
|
34
|
+
export declare function ensurePrivilegedIntents(options: PreflightOptions, application: RawApplication, intents: number, filesByIntent: (intent: GatewayIntentName) => string[]): Promise<void>;
|
|
35
|
+
/** The intents a number contains, as the docs name them, for messages. */
|
|
36
|
+
export declare function describeIntents(intents: number): string;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// What is checked before connecting: each problem is explained with how to
|
|
2
|
+
// fix it, and when a person is there, the CLI waits for the fix instead of
|
|
3
|
+
// making them start it again.
|
|
4
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
5
|
+
import { GetCurrentApplication, GetGuild } from '../discord/endpoints.js';
|
|
6
|
+
import { intentNames, PRIVILEGED_INTENTS, } from '../discord/intents.js';
|
|
7
|
+
import { ApplicationFlags, } from '../discord/types/application.js';
|
|
8
|
+
import { PermissionFlags } from '../discord/types/permissions.js';
|
|
9
|
+
import { DiscordApiError } from '../rest/errors.js';
|
|
10
|
+
/** A problem that was explained and that stops the command. */
|
|
11
|
+
export class PreflightFailure extends Error {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The flags an application has when a privileged intent is enabled for it:
|
|
15
|
+
* the plain one once Discord approved it for a verified bot, the "limited"
|
|
16
|
+
* one for a bot in fewer than 100 servers.
|
|
17
|
+
* @see https://docs.discord.com/developers/resources/application#application-object-application-flags
|
|
18
|
+
*/
|
|
19
|
+
const INTENT_FLAGS = {
|
|
20
|
+
GuildPresences: ApplicationFlags.GatewayPresence | ApplicationFlags.GatewayPresenceLimited,
|
|
21
|
+
GuildMembers: ApplicationFlags.GatewayGuildMembers |
|
|
22
|
+
ApplicationFlags.GatewayGuildMembersLimited,
|
|
23
|
+
MessageContent: ApplicationFlags.GatewayMessageContent |
|
|
24
|
+
ApplicationFlags.GatewayMessageContentLimited,
|
|
25
|
+
};
|
|
26
|
+
/** What the Developer Portal calls each privileged intent. */
|
|
27
|
+
const PORTAL_NAMES = {
|
|
28
|
+
GuildPresences: 'Presence Intent',
|
|
29
|
+
GuildMembers: 'Server Members Intent',
|
|
30
|
+
MessageContent: 'Message Content Intent',
|
|
31
|
+
};
|
|
32
|
+
/** The privileged intents among `intents` that the application lacks. */
|
|
33
|
+
export function missingPrivilegedIntents(intents, application) {
|
|
34
|
+
const flags = application.flags ?? 0;
|
|
35
|
+
return intentNames(intents).filter(name => PRIVILEGED_INTENTS.includes(name) && (flags & INTENT_FLAGS[name]) === 0);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The link that adds the bot to one server.
|
|
39
|
+
* @see https://docs.discord.com/developers/topics/oauth2#bot-authorization-flow
|
|
40
|
+
*/
|
|
41
|
+
export function inviteUrl(applicationId, guildId) {
|
|
42
|
+
const query = new URLSearchParams({
|
|
43
|
+
client_id: applicationId,
|
|
44
|
+
scope: 'bot applications.commands',
|
|
45
|
+
// A dev server is a playground: the bot can do everything there.
|
|
46
|
+
permissions: PermissionFlags.Administrator.toString(),
|
|
47
|
+
guild_id: guildId,
|
|
48
|
+
disable_guild_select: 'true',
|
|
49
|
+
});
|
|
50
|
+
return `https://discord.com/oauth2/authorize?${query}`;
|
|
51
|
+
}
|
|
52
|
+
/** Checks the token and returns the application of the bot. */
|
|
53
|
+
export function fetchApplication(rest) {
|
|
54
|
+
return rest.request(GetCurrentApplication, []);
|
|
55
|
+
}
|
|
56
|
+
async function waitFor(options, check) {
|
|
57
|
+
for (;;) {
|
|
58
|
+
await sleep(options.pollInterval, undefined, { signal: options.signal });
|
|
59
|
+
const result = await check();
|
|
60
|
+
if (result !== null)
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Makes sure the bot is in the dev server, and returns that server. */
|
|
65
|
+
export async function ensureInDevGuild(options, applicationId, guildId) {
|
|
66
|
+
const fetch = async () => {
|
|
67
|
+
try {
|
|
68
|
+
return await options.rest.request(GetGuild, [guildId]);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// 10004 Unknown Guild, 50001 Missing Access: the bot is not in it.
|
|
72
|
+
if (error instanceof DiscordApiError &&
|
|
73
|
+
(error.code === 10004 || error.code === 50001)) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const guild = await fetch();
|
|
80
|
+
if (guild)
|
|
81
|
+
return guild;
|
|
82
|
+
const explanation = `Your bot is not in your dev server yet (DEV_GUILD_ID=${guildId}).\nOpen this link to add it:\n${inviteUrl(applicationId, guildId)}\nIf the link shows another server, DEV_GUILD_ID is not the ID of a server you manage.`;
|
|
83
|
+
if (!options.interactive) {
|
|
84
|
+
options.log.error(explanation);
|
|
85
|
+
throw new PreflightFailure();
|
|
86
|
+
}
|
|
87
|
+
options.log.warn(`${explanation}\nWaiting for the bot to be added...`);
|
|
88
|
+
const joined = await waitFor(options, fetch);
|
|
89
|
+
options.log.success(`The bot joined ${joined.name}`);
|
|
90
|
+
return joined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Makes sure the privileged intents the project needs are enabled.
|
|
94
|
+
* `filesByIntent` says which files need each intent.
|
|
95
|
+
*/
|
|
96
|
+
export async function ensurePrivilegedIntents(options, application, intents, filesByIntent) {
|
|
97
|
+
let missing = missingPrivilegedIntents(intents, application);
|
|
98
|
+
if (missing.length === 0)
|
|
99
|
+
return;
|
|
100
|
+
const list = missing
|
|
101
|
+
.map(name => `- ${PORTAL_NAMES[name]}, needed by ${filesByIntent(name).join(', ')}`)
|
|
102
|
+
.join('\n');
|
|
103
|
+
const explanation = `Your files need ${missing.length === 1 ? 'an option that is' : 'options that are'} not enabled for your bot:\n${list}\nEnable ${missing.length === 1 ? 'it' : 'them'} under "Privileged Gateway Intents", then save:\nhttps://discord.com/developers/applications/${application.id}/bot`;
|
|
104
|
+
if (!options.interactive) {
|
|
105
|
+
options.log.error(explanation);
|
|
106
|
+
throw new PreflightFailure();
|
|
107
|
+
}
|
|
108
|
+
options.log.warn(`${explanation}\nWaiting for you to enable ${missing.length === 1 ? 'it' : 'them'}...`);
|
|
109
|
+
await waitFor(options, async () => {
|
|
110
|
+
missing = missingPrivilegedIntents(intents, await fetchApplication(options.rest));
|
|
111
|
+
return missing.length === 0 ? true : null;
|
|
112
|
+
});
|
|
113
|
+
options.log.success('Privileged intents enabled');
|
|
114
|
+
}
|
|
115
|
+
/** The intents a number contains, as the docs name them, for messages. */
|
|
116
|
+
export function describeIntents(intents) {
|
|
117
|
+
return intentNames(intents)
|
|
118
|
+
.map(name => name
|
|
119
|
+
.replace(/[A-Z]/g, (letter, index) => index === 0 ? letter : `_${letter}`)
|
|
120
|
+
.toUpperCase())
|
|
121
|
+
.join(', ');
|
|
122
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { type CommandEntry } from '../commands/tree.js';
|
|
2
|
+
import { type ComponentEntry } from '../components/router.js';
|
|
3
|
+
import { type LoadedPresence } from '../presence/declaration.js';
|
|
4
|
+
import { type DeclaredCommand, type DeclaredLanguage } from '../messages/declaration.js';
|
|
5
|
+
import { type LoadedMessages } from '../messages/translate.js';
|
|
6
|
+
import type { Locale } from '../discord/types/common.js';
|
|
7
|
+
import { type TaskEntry } from '../tasks/scheduler.js';
|
|
8
|
+
import { type Bot, type BotOptions } from '../core/bot.js';
|
|
9
|
+
import { type GatewayIntentName } from '../discord/intents.js';
|
|
10
|
+
import { type LoadedEvent } from '../events/router.js';
|
|
11
|
+
import { type BuiltFile, type Declaration, type FailedFile } from '../loader/loader.js';
|
|
12
|
+
import type { Log } from './log.js';
|
|
13
|
+
export interface ProjectOptions {
|
|
14
|
+
/** The folder of the project. */
|
|
15
|
+
cwd: string;
|
|
16
|
+
/** The version of the framework. */
|
|
17
|
+
version: string;
|
|
18
|
+
log: Log;
|
|
19
|
+
/**
|
|
20
|
+
* The files of the project as `chapterjs build` kept them. Without it,
|
|
21
|
+
* they are read from the `src` folder.
|
|
22
|
+
*/
|
|
23
|
+
built?: readonly BuiltFile[];
|
|
24
|
+
/**
|
|
25
|
+
* Whether the files join voice channels, as `chapterjs build` found.
|
|
26
|
+
* Without it, the files of `src` are read on every load.
|
|
27
|
+
*/
|
|
28
|
+
joinsVoice?: boolean;
|
|
29
|
+
/** Only tests change this. */
|
|
30
|
+
deferAfter?: number;
|
|
31
|
+
}
|
|
32
|
+
/** What the types of a project are written from, once its files ran. */
|
|
33
|
+
export interface TypesInfo {
|
|
34
|
+
/** Every language declared, with where. */
|
|
35
|
+
languages: readonly DeclaredLanguage[];
|
|
36
|
+
/** The language `t` is typed from, when known. */
|
|
37
|
+
defaultLocale?: Locale;
|
|
38
|
+
/** The languages that say `default: true`, as they are now. */
|
|
39
|
+
languageDefaults: readonly Locale[];
|
|
40
|
+
/** Every command, and whether its file describes it. */
|
|
41
|
+
commands: readonly DeclaredCommand[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Writes the types of a project (`.chapterjs/`): what the project adds to
|
|
45
|
+
* 'chapterjs', like the files of `public/`, its languages and its
|
|
46
|
+
* commands. With the project as it loaded (`info`), a language only
|
|
47
|
+
* offers the commands without `description`, `t` is typed from the
|
|
48
|
+
* default language and `default: true` is refused in every language that
|
|
49
|
+
* says it when another one does; without it (`sync`, which runs nothing),
|
|
50
|
+
* the commands and the languages are found by reading the files, every
|
|
51
|
+
* command is offered, and the first language or the one that says
|
|
52
|
+
* `default: true` types `t`.
|
|
53
|
+
* @returns how many files were written
|
|
54
|
+
*/
|
|
55
|
+
export declare function writeTypes(cwd: string, info?: TypesInfo): Promise<number>;
|
|
56
|
+
/** The kinds of declarations a project is made of: one per feature. */
|
|
57
|
+
export declare const DECLARATIONS: readonly Declaration<unknown>[];
|
|
58
|
+
/** What a bot of the project is connected with. */
|
|
59
|
+
export interface ConnectOptions {
|
|
60
|
+
token: string;
|
|
61
|
+
/** Another REST API than Discord's: only tests use it. */
|
|
62
|
+
apiUrl?: string | undefined;
|
|
63
|
+
guildFilter?: BotOptions['guildFilter'];
|
|
64
|
+
/** Whether what happens outside servers is for this bot. */
|
|
65
|
+
privateEvents?: boolean;
|
|
66
|
+
shards?: BotOptions['shards'];
|
|
67
|
+
identifyGate?: BotOptions['identifyGate'];
|
|
68
|
+
/** The share of the requests per second this process may send. */
|
|
69
|
+
globalLimit?: number | undefined;
|
|
70
|
+
/** Only tests change this. */
|
|
71
|
+
identifyInterval?: number | undefined;
|
|
72
|
+
/** Discord refused the bot for good. */
|
|
73
|
+
onFatal: (bot: Bot) => void;
|
|
74
|
+
}
|
|
75
|
+
/** The files of a project, and what runs them. */
|
|
76
|
+
export interface Project {
|
|
77
|
+
/**
|
|
78
|
+
* The last version of each declaration that loaded, by the file and the
|
|
79
|
+
* export it comes from (`src/ping.ts#default`): what the bot runs.
|
|
80
|
+
*/
|
|
81
|
+
readonly events: ReadonlyMap<string, LoadedEvent>;
|
|
82
|
+
readonly commands: ReadonlyMap<string, CommandEntry>;
|
|
83
|
+
readonly components: ReadonlyMap<string, ComponentEntry>;
|
|
84
|
+
readonly tasks: ReadonlyMap<string, TaskEntry>;
|
|
85
|
+
/** The presence declared, or `null` without one. */
|
|
86
|
+
readonly presence: LoadedPresence | null;
|
|
87
|
+
/** The languages of the project, assembled, or `null` without any. */
|
|
88
|
+
readonly messages: LoadedMessages | null;
|
|
89
|
+
/** What the types of the project are written from, as it loaded. */
|
|
90
|
+
typesInfo(): TypesInfo;
|
|
91
|
+
/**
|
|
92
|
+
* Loads every file (again). A declaration that fails is returned; it
|
|
93
|
+
* keeps its last working version when it had one.
|
|
94
|
+
*/
|
|
95
|
+
load(): Promise<FailedFile[]>;
|
|
96
|
+
/** Shows a failure with its file (and export) and line. */
|
|
97
|
+
report(failure: FailedFile): void;
|
|
98
|
+
/** "2 commands, 3 events, 4 components, a presence loaded". */
|
|
99
|
+
summary(): string;
|
|
100
|
+
isEmpty(): boolean;
|
|
101
|
+
/** The files that make an intent necessary. */
|
|
102
|
+
filesNeeding(intent: GatewayIntentName): string[];
|
|
103
|
+
/**
|
|
104
|
+
* The intents the files need right now. Without `privateEvents`, what
|
|
105
|
+
* only serves private messages is left out: nothing is asked to Discord
|
|
106
|
+
* for what the bot will not listen to.
|
|
107
|
+
*/
|
|
108
|
+
intents(privateEvents?: boolean): number;
|
|
109
|
+
/** Creates a bot that runs the files, and connects it. */
|
|
110
|
+
connect(options: ConnectOptions): Promise<Bot>;
|
|
111
|
+
/** Runs the files of the `ready` event: the bot knows its servers. */
|
|
112
|
+
ready(bot: Bot): void;
|
|
113
|
+
/**
|
|
114
|
+
* Gives the bot the presence of the project as it is now (Discord's
|
|
115
|
+
* default without a presence file). Nothing is sent when it did not
|
|
116
|
+
* change since the bot was given one.
|
|
117
|
+
*/
|
|
118
|
+
applyPresence(bot: Bot): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Starts the tasks of the project, with the bot `current` returns (none
|
|
121
|
+
* while it reconnects). Only one process of a bot runs them.
|
|
122
|
+
*/
|
|
123
|
+
startTasks(current: () => Bot | null): void;
|
|
124
|
+
/** Stops the tasks: nothing runs after this. */
|
|
125
|
+
stopTasks(): void;
|
|
126
|
+
/** Looks after the memory of the bot `current` returns. */
|
|
127
|
+
watchMemory(current: () => Bot | null): {
|
|
128
|
+
stop(): void;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** Whether the folder is a project: it has a `src` folder. */
|
|
132
|
+
export declare function hasSources(cwd: string, log: Log): Promise<boolean>;
|
|
133
|
+
export declare function createProject(options: ProjectOptions): Project;
|
|
134
|
+
/** Says what went wrong in words the developer can act on. */
|
|
135
|
+
export declare function explain(error: unknown, log: Log): void;
|