From 27c261fee2aac4827f5a4d9be0eacfd5a60f5eb8 Mon Sep 17 00:00:00 2001 From: Fleny Date: Sat, 17 Jan 2026 21:54:15 +0100 Subject: [PATCH] formatter: Use semicolons (#4686) I prefer semicolors, they also help avoiding certain pitfalls in JavaScript/TypeScript, such as the following code sample: ```js const xyz = "test" (something.else as string) = "another" ``` This results in a TypeError: "test" is not a function, this is because js thinks we are trying to call the string "test" as a function. To fix this it requires a `;` somewhere before the `(`, such as `;(something ... ` which in my opinion is ugly and less clean overall. --- .mocharc.cjs | 14 +- biome.jsonc | 1 - docker-apps/rest-passthrough/src/fastify.ts | 32 +- docker-apps/rest-passthrough/src/server.ts | 58 +- examples/advanced/src/bot.ts | 12 +- examples/advanced/src/commands.ts | 18 +- examples/advanced/src/commands/ping.ts | 12 +- examples/advanced/src/commands/warn.ts | 54 +- examples/advanced/src/config.ts | 8 +- .../advanced/src/events/interactionCreate.ts | 22 +- examples/advanced/src/events/ready.ts | 6 +- examples/advanced/src/index.ts | 18 +- examples/advanced/src/register-commands.ts | 20 +- examples/advanced/src/utils/loader.ts | 10 +- examples/advanced/src/utils/permissions.ts | 20 +- examples/advanced/src/utils/updateCommands.ts | 6 +- examples/beginner/src/bot.ts | 10 +- examples/beginner/src/commands.ts | 30 +- examples/beginner/src/commands/ping.ts | 12 +- examples/beginner/src/config.ts | 8 +- examples/beginner/src/events/guildCreate.ts | 6 +- .../beginner/src/events/interactionCreate.ts | 76 +- examples/beginner/src/events/ready.ts | 14 +- examples/beginner/src/index.ts | 20 +- examples/beginner/src/register-commands.ts | 20 +- examples/beginner/src/utils/helpers.ts | 68 +- examples/beginner/src/utils/loader.ts | 10 +- examples/beginner/src/utils/logger.ts | 62 +- examples/bigbot/src/bot/bot.ts | 36 +- examples/bigbot/src/bot/commands.ts | 66 +- examples/bigbot/src/bot/commands/ping.ts | 16 +- .../src/bot/events/interactions/create.ts | 48 +- examples/bigbot/src/bot/events/nodejs.ts | 26 +- examples/bigbot/src/bot/fastify.ts | 12 +- examples/bigbot/src/bot/index.ts | 104 +- examples/bigbot/src/bot/register-commands.ts | 22 +- examples/bigbot/src/bot/utils/loader.ts | 10 +- .../bigbot/src/bot/utils/updateCommands.ts | 20 +- examples/bigbot/src/bot/utils/webhook.ts | 4 +- examples/bigbot/src/config.ts | 72 +- examples/bigbot/src/gateway/fastify.ts | 12 +- examples/bigbot/src/gateway/gatewayManager.ts | 92 +- examples/bigbot/src/gateway/index.ts | 66 +- .../bigbot/src/gateway/worker/createWorker.ts | 44 +- examples/bigbot/src/gateway/worker/types.ts | 92 +- examples/bigbot/src/gateway/worker/worker.ts | 214 +- examples/bigbot/src/rest/fastify.ts | 28 +- examples/bigbot/src/rest/index.ts | 42 +- examples/bigbot/src/rest/influx.ts | 38 +- examples/bigbot/src/rest/restManager.ts | 14 +- examples/bigbot/src/util.ts | 24 +- examples/minimal/src/bot.ts | 14 +- examples/minimal/src/commands.ts | 6 +- examples/minimal/src/commands/ping.ts | 10 +- examples/minimal/src/config.ts | 14 +- .../minimal/src/events/interactionCreate.ts | 16 +- examples/minimal/src/events/ready.ts | 12 +- examples/minimal/src/index.ts | 20 +- examples/minimal/src/register-commands.ts | 20 +- examples/minimal/src/types/commands.ts | 16 +- examples/minimal/src/utils/loader.ts | 10 +- examples/minimal/src/utils/logger.ts | 62 +- examples/minimal/src/utils/updateCommands.ts | 8 +- examples/reaction-roles/src/bot.ts | 14 +- examples/reaction-roles/src/collector.ts | 6 +- examples/reaction-roles/src/commands/index.ts | 12 +- examples/reaction-roles/src/commands/roles.ts | 194 +- examples/reaction-roles/src/events/index.ts | 10 +- .../src/events/interactionCreate.ts | 44 +- examples/reaction-roles/src/events/ready.ts | 6 +- examples/reaction-roles/src/index.ts | 6 +- .../reaction-roles/src/register-commands.ts | 12 +- packages/bot/src/bot.ts | 134 +- packages/bot/src/commandOptionsParser.ts | 62 +- packages/bot/src/constants.ts | 8 +- packages/bot/src/desiredProperties.ts | 334 ++-- packages/bot/src/events.ts | 250 +-- packages/bot/src/handlers.ts | 16 +- .../src/handlers/channels/CHANNEL_CREATE.ts | 12 +- .../src/handlers/channels/CHANNEL_DELETE.ts | 10 +- .../handlers/channels/CHANNEL_PINS_UPDATE.ts | 10 +- .../src/handlers/channels/CHANNEL_UPDATE.ts | 12 +- .../channels/STAGE_INSTANCE_CREATE.ts | 10 +- .../channels/STAGE_INSTANCE_DELETE.ts | 10 +- .../channels/STAGE_INSTANCE_UPDATE.ts | 10 +- .../src/handlers/channels/THREAD_CREATE.ts | 10 +- .../src/handlers/channels/THREAD_DELETE.ts | 10 +- .../src/handlers/channels/THREAD_LIST_SYNC.ts | 12 +- .../channels/THREAD_MEMBERS_UPDATE.ts | 10 +- .../handlers/channels/THREAD_MEMBER_UPDATE.ts | 10 +- .../src/handlers/channels/THREAD_UPDATE.ts | 10 +- packages/bot/src/handlers/channels/index.ts | 26 +- .../handlers/emojis/GUILD_EMOJIS_UPDATE.ts | 12 +- packages/bot/src/handlers/emojis/index.ts | 2 +- .../entitlements/ENTITLEMENT_CREATE.ts | 10 +- .../entitlements/ENTITLEMENT_DELETE.ts | 10 +- .../entitlements/ENTITLEMENT_UPDATE.ts | 10 +- .../bot/src/handlers/entitlements/index.ts | 6 +- .../guilds/GUILD_AUDIT_LOG_ENTRY_CREATE.ts | 10 +- .../bot/src/handlers/guilds/GUILD_BAN_ADD.ts | 10 +- .../src/handlers/guilds/GUILD_BAN_REMOVE.ts | 10 +- .../bot/src/handlers/guilds/GUILD_CREATE.ts | 10 +- .../bot/src/handlers/guilds/GUILD_DELETE.ts | 10 +- .../guilds/GUILD_INTEGRATIONS_UPDATE.ts | 10 +- .../handlers/guilds/GUILD_STICKERS_UPDATE.ts | 14 +- .../bot/src/handlers/guilds/GUILD_UPDATE.ts | 10 +- .../AUTO_MODERATION_ACTION_EXECUTION.ts | 10 +- .../automod/AUTO_MODERATION_RULE_CREATE.ts | 10 +- .../automod/AUTO_MODERATION_RULE_DELETE.ts | 10 +- .../automod/AUTO_MODERATION_RULE_UPDATE.ts | 10 +- .../bot/src/handlers/guilds/automod/index.ts | 8 +- packages/bot/src/handlers/guilds/index.ts | 20 +- .../GUILD_SCHEDULED_EVENT_CREATE.ts | 10 +- .../GUILD_SCHEDULED_EVENT_DELETE.ts | 10 +- .../GUILD_SCHEDULED_EVENT_UPDATE.ts | 10 +- .../GUILD_SCHEDULED_EVENT_USER_ADD.ts | 10 +- .../GUILD_SCHEDULED_EVENT_USER_REMOVE.ts | 10 +- .../handlers/guilds/scheduledEvents/index.ts | 10 +- packages/bot/src/handlers/index.ts | 32 +- .../integrations/INTEGRATION_CREATE.ts | 8 +- .../integrations/INTEGRATION_DELETE.ts | 10 +- .../integrations/INTEGRATION_UPDATE.ts | 8 +- .../bot/src/handlers/integrations/index.ts | 6 +- .../APPLICATION_COMMAND_PERMISSIONS_UPDATE.ts | 10 +- .../interactions/INTERACTION_CREATE.ts | 10 +- .../bot/src/handlers/interactions/index.ts | 4 +- .../bot/src/handlers/invites/INVITE_CREATE.ts | 10 +- .../bot/src/handlers/invites/INVITE_DELETE.ts | 10 +- packages/bot/src/handlers/invites/index.ts | 4 +- .../handlers/members/GUILD_MEMBERS_CHUNK.ts | 26 +- .../src/handlers/members/GUILD_MEMBER_ADD.ts | 16 +- .../handlers/members/GUILD_MEMBER_REMOVE.ts | 14 +- .../handlers/members/GUILD_MEMBER_UPDATE.ts | 12 +- packages/bot/src/handlers/members/index.ts | 8 +- .../src/handlers/messages/MESSAGE_CREATE.ts | 10 +- .../src/handlers/messages/MESSAGE_DELETE.ts | 10 +- .../handlers/messages/MESSAGE_DELETE_BULK.ts | 14 +- .../handlers/messages/MESSAGE_REACTION_ADD.ts | 14 +- .../messages/MESSAGE_REACTION_REMOVE.ts | 10 +- .../messages/MESSAGE_REACTION_REMOVE_ALL.ts | 10 +- .../messages/MESSAGE_REACTION_REMOVE_EMOJI.ts | 10 +- .../src/handlers/messages/MESSAGE_UPDATE.ts | 12 +- packages/bot/src/handlers/messages/index.ts | 16 +- .../bot/src/handlers/misc/PRESENCE_UPDATE.ts | 8 +- .../bot/src/handlers/misc/RATE_LIMITED.ts | 10 +- packages/bot/src/handlers/misc/READY.ts | 14 +- packages/bot/src/handlers/misc/RESUMED.ts | 8 +- .../bot/src/handlers/misc/TYPING_START.ts | 14 +- packages/bot/src/handlers/misc/USER_UPDATE.ts | 10 +- packages/bot/src/handlers/misc/index.ts | 12 +- .../handlers/poll/MESSAGE_POLL_VOTE_ADD.ts | 10 +- .../handlers/poll/MESSAGE_POLL_VOTE_REMOVE.ts | 10 +- packages/bot/src/handlers/poll/index.ts | 4 +- .../src/handlers/roles/GUILD_ROLE_CREATE.ts | 10 +- .../src/handlers/roles/GUILD_ROLE_DELETE.ts | 10 +- .../src/handlers/roles/GUILD_ROLE_UPDATE.ts | 10 +- packages/bot/src/handlers/roles/index.ts | 6 +- .../GUILD_SOUNDBOARD_SOUNDS_UPDATE.ts | 10 +- .../GUILD_SOUNDBOARD_SOUND_CREATE.ts | 10 +- .../GUILD_SOUNDBOARD_SOUND_DELETE.ts | 10 +- .../GUILD_SOUNDBOARD_SOUND_UPDATE.ts | 10 +- .../handlers/soundboard/SOUNDBOARD_SOUNDS.ts | 10 +- packages/bot/src/handlers/soundboard/index.ts | 10 +- .../subscriptions/SUBSCRIPTION_CREATE.ts | 10 +- .../subscriptions/SUBSCRIPTION_DELETE.ts | 10 +- .../subscriptions/SUBSCRIPTION_UPDATE.ts | 10 +- .../bot/src/handlers/subscriptions/index.ts | 6 +- .../voice/VOICE_CHANNEL_EFFECT_SEND.ts | 10 +- .../src/handlers/voice/VOICE_SERVER_UPDATE.ts | 10 +- .../src/handlers/voice/VOICE_STATE_UPDATE.ts | 10 +- packages/bot/src/handlers/voice/index.ts | 6 +- .../src/handlers/webhooks/WEBHOOKS_UPDATE.ts | 10 +- packages/bot/src/handlers/webhooks/index.ts | 2 +- packages/bot/src/helpers.ts | 903 ++++----- packages/bot/src/index.ts | 28 +- packages/bot/src/transformers.ts | 335 ++-- packages/bot/src/transformers/activity.ts | 42 +- packages/bot/src/transformers/application.ts | 12 +- .../src/transformers/applicationCommand.ts | 10 +- .../transformers/applicationCommandOption.ts | 10 +- .../applicationCommandOptionChoice.ts | 10 +- .../applicationCommandPermission.ts | 10 +- packages/bot/src/transformers/attachment.ts | 42 +- .../bot/src/transformers/auditLogEntry.ts | 12 +- .../transformers/automodActionExecution.ts | 10 +- packages/bot/src/transformers/automodRule.ts | 10 +- .../src/transformers/avatarDecorationData.ts | 18 +- packages/bot/src/transformers/channel.ts | 146 +- packages/bot/src/transformers/component.ts | 322 +-- packages/bot/src/transformers/embed.ts | 10 +- packages/bot/src/transformers/emoji.ts | 46 +- packages/bot/src/transformers/entitlement.ts | 34 +- packages/bot/src/transformers/gatewayBot.ts | 10 +- packages/bot/src/transformers/guild.ts | 160 +- .../bot/src/transformers/incidentsData.ts | 22 +- packages/bot/src/transformers/index.ts | 100 +- packages/bot/src/transformers/integration.ts | 12 +- packages/bot/src/transformers/interaction.ts | 233 +-- packages/bot/src/transformers/invite.ts | 58 +- packages/bot/src/transformers/lobby.ts | 38 +- packages/bot/src/transformers/member.ts | 64 +- packages/bot/src/transformers/message.ts | 282 +-- packages/bot/src/transformers/onboarding.ts | 63 +- packages/bot/src/transformers/poll.ts | 44 +- packages/bot/src/transformers/presence.ts | 24 +- .../bot/src/transformers/reverse/activity.ts | 8 +- .../transformers/reverse/allowedMentions.ts | 6 +- .../src/transformers/reverse/application.ts | 10 +- .../reverse/applicationCommand.ts | 8 +- .../reverse/applicationCommandOption.ts | 8 +- .../reverse/applicationCommandOptionChoice.ts | 8 +- .../reverse/applicationCommandPermission.ts | 8 +- .../src/transformers/reverse/attachment.ts | 10 +- .../src/transformers/reverse/auditLogEntry.ts | 10 +- .../bot/src/transformers/reverse/component.ts | 58 +- .../bot/src/transformers/reverse/embed.ts | 8 +- .../bot/src/transformers/reverse/emoji.ts | 8 +- .../src/transformers/reverse/gatewayBot.ts | 6 +- .../bot/src/transformers/reverse/index.ts | 34 +- .../bot/src/transformers/reverse/member.ts | 16 +- .../bot/src/transformers/reverse/presence.ts | 10 +- packages/bot/src/transformers/reverse/team.ts | 12 +- .../transformers/reverse/widgetSettings.ts | 8 +- packages/bot/src/transformers/role.ts | 78 +- .../bot/src/transformers/scheduledEvent.ts | 76 +- packages/bot/src/transformers/sku.ts | 26 +- .../bot/src/transformers/soundboardSound.ts | 30 +- .../bot/src/transformers/stageInstance.ts | 24 +- .../src/transformers/stageInviteInstance.ts | 22 +- packages/bot/src/transformers/sticker.ts | 40 +- packages/bot/src/transformers/subscription.ts | 34 +- packages/bot/src/transformers/team.ts | 14 +- packages/bot/src/transformers/template.ts | 10 +- packages/bot/src/transformers/threadMember.ts | 16 +- .../src/transformers/toggles/Permissions.ts | 12 +- .../transformers/toggles/ToggleBitfield.ts | 32 +- .../bot/src/transformers/toggles/channel.ts | 48 +- .../bot/src/transformers/toggles/emoji.ts | 40 +- .../bot/src/transformers/toggles/guild.ts | 188 +- .../bot/src/transformers/toggles/index.ts | 18 +- .../bot/src/transformers/toggles/member.ts | 104 +- packages/bot/src/transformers/toggles/role.ts | 48 +- packages/bot/src/transformers/toggles/user.ts | 40 +- .../bot/src/transformers/toggles/voice.ts | 52 +- packages/bot/src/transformers/types.ts | 1742 ++++++++--------- packages/bot/src/transformers/user.ts | 114 +- packages/bot/src/transformers/voiceRegion.ts | 10 +- packages/bot/src/transformers/voiceState.ts | 28 +- packages/bot/src/transformers/webhook.ts | 40 +- .../bot/src/transformers/welcomeScreen.ts | 10 +- packages/bot/src/transformers/widget.ts | 10 +- .../bot/src/transformers/widgetSettings.ts | 10 +- packages/bot/tests/e2e/constants.ts | 12 +- packages/bot/tests/e2e/resetguilds.spec.ts | 26 +- .../bot/tests/unit/desiredProprieties.spec.ts | 28 +- packages/bot/tests/unit/index.spec.ts | 8 +- packages/discordeno/src/index.ts | 2 +- packages/discordeno/tests/index.spec.ts | 8 +- packages/gateway/src/Shard.ts | 618 +++--- packages/gateway/src/index.ts | 6 +- packages/gateway/src/manager.ts | 420 ++-- packages/gateway/src/types.ts | 78 +- .../tests/integration/connection.spec.ts | 70 +- .../gateway/tests/integration/websocket.ts | 40 +- packages/gateway/tests/unit/index.spec.ts | 8 +- packages/rest/src/index.ts | 12 +- packages/rest/src/invalidBucket.ts | 98 +- packages/rest/src/manager.ts | 958 ++++----- packages/rest/src/queue.ts | 194 +- packages/rest/src/routes.ts | 480 ++--- packages/rest/src/types.ts | 600 +++--- packages/rest/src/typings/routes.ts | 296 +-- packages/rest/tests/constants.ts | 4 +- packages/rest/tests/e2e/automod.spec.ts | 202 +- packages/rest/tests/e2e/constants.ts | 12 +- packages/rest/tests/e2e/emoji.spec.ts | 108 +- packages/rest/tests/e2e/guild.spec.ts | 90 +- packages/rest/tests/e2e/member.spec.ts | 56 +- packages/rest/tests/e2e/message.spec.ts | 208 +- packages/rest/tests/e2e/misc.spec.ts | 48 +- packages/rest/tests/e2e/role.spec.ts | 94 +- packages/rest/tests/e2e/stickers.spec.ts | 72 +- packages/rest/tests/e2e/user.spec.ts | 42 +- packages/rest/tests/e2e/utils.ts | 40 +- packages/rest/tests/e2e/webhook.spec.ts | 90 +- packages/rest/tests/unit/index.spec.ts | 8 +- packages/rest/tests/unit/manager.spec.ts | 228 +-- packages/types/src/discord/application.ts | 98 +- .../applicationRoleConnectionMetadata.ts | 14 +- packages/types/src/discord/auditLog.ts | 108 +- packages/types/src/discord/autoModeration.ts | 44 +- packages/types/src/discord/channel.ts | 130 +- packages/types/src/discord/components.ts | 278 +-- packages/types/src/discord/emoji.ts | 18 +- packages/types/src/discord/entitlement.ts | 20 +- packages/types/src/discord/gateway.ts | 530 ++--- packages/types/src/discord/guild.ts | 298 +-- .../types/src/discord/guildScheduledEvent.ts | 70 +- packages/types/src/discord/guildTemplate.ts | 50 +- packages/types/src/discord/interactions.ts | 222 +-- packages/types/src/discord/invite.ts | 54 +- packages/types/src/discord/lobby.ts | 18 +- packages/types/src/discord/message.ts | 300 +-- packages/types/src/discord/oauth2.ts | 52 +- packages/types/src/discord/permissions.ts | 48 +- packages/types/src/discord/poll.ts | 36 +- packages/types/src/discord/reference.ts | 6 +- packages/types/src/discord/sku.ts | 12 +- packages/types/src/discord/soundboard.ts | 18 +- packages/types/src/discord/stageInstance.ts | 14 +- packages/types/src/discord/sticker.ts | 44 +- packages/types/src/discord/subscription.ts | 20 +- packages/types/src/discord/teams.ts | 20 +- packages/types/src/discord/user.ts | 88 +- packages/types/src/discord/voice.ts | 38 +- packages/types/src/discord/webhook.ts | 30 +- packages/types/src/discord/webhookEvents.ts | 100 +- packages/types/src/discordeno/application.ts | 30 +- packages/types/src/discordeno/auditLog.ts | 14 +- .../types/src/discordeno/autoModeration.ts | 44 +- packages/types/src/discordeno/channel.ts | 168 +- packages/types/src/discordeno/components.ts | 224 +-- packages/types/src/discordeno/emoji.ts | 18 +- packages/types/src/discordeno/entitlement.ts | 24 +- packages/types/src/discordeno/gateway.ts | 14 +- packages/types/src/discordeno/guild.ts | 212 +- .../src/discordeno/guildScheduledEvent.ts | 56 +- .../types/src/discordeno/guildTemplate.ts | 8 +- packages/types/src/discordeno/interactions.ts | 92 +- packages/types/src/discordeno/invite.ts | 6 +- packages/types/src/discordeno/lobby.ts | 28 +- packages/types/src/discordeno/message.ts | 88 +- packages/types/src/discordeno/permissions.ts | 6 +- packages/types/src/discordeno/poll.ts | 18 +- packages/types/src/discordeno/reference.ts | 4 +- packages/types/src/discordeno/soundboard.ts | 24 +- .../types/src/discordeno/stageInstance.ts | 18 +- packages/types/src/discordeno/sticker.ts | 16 +- packages/types/src/discordeno/subscription.ts | 10 +- packages/types/src/discordeno/user.ts | 14 +- packages/types/src/discordeno/voice.ts | 14 +- packages/types/src/discordeno/webhook.ts | 78 +- packages/types/src/index.ts | 114 +- packages/types/src/shared.ts | 18 +- packages/types/tests/index.spec.ts | 8 +- packages/utils/src/Collection.ts | 104 +- packages/utils/src/base64.ts | 76 +- packages/utils/src/bucket.ts | 98 +- packages/utils/src/builders.ts | 6 +- packages/utils/src/builders/embeds.ts | 148 +- packages/utils/src/casing.ts | 52 +- packages/utils/src/colors.ts | 122 +- packages/utils/src/constants.ts | 2 +- packages/utils/src/hash.ts | 10 +- packages/utils/src/images.ts | 68 +- packages/utils/src/index.ts | 38 +- packages/utils/src/logger.ts | 48 +- packages/utils/src/oauth2.ts | 66 +- packages/utils/src/permissions.ts | 16 +- packages/utils/src/reactions.ts | 6 +- packages/utils/src/snowflakes.ts | 8 +- packages/utils/src/token.ts | 12 +- packages/utils/src/typeguards.ts | 14 +- packages/utils/src/urlToBase64.ts | 10 +- packages/utils/src/urls.ts | 8 +- packages/utils/src/utils.ts | 10 +- packages/utils/tests/base64.spec.ts | 156 +- packages/utils/tests/bucket.spec.ts | 178 +- packages/utils/tests/builders.spec.ts | 64 +- packages/utils/tests/casting.spec.ts | 40 +- packages/utils/tests/collection.spec.ts | 218 +-- packages/utils/tests/color.spec.ts | 50 +- packages/utils/tests/hash.spec.ts | 32 +- packages/utils/tests/images.spec.ts | 160 +- packages/utils/tests/index.spec.ts | 8 +- packages/utils/tests/logger.spec.ts | 48 +- packages/utils/tests/permissions.spec.ts | 20 +- packages/utils/tests/reactions.spec.ts | 26 +- packages/utils/tests/token.spec.ts | 30 +- packages/utils/tests/typeguards.spec.ts | 48 +- packages/utils/tests/urlToBase64.spec.ts | 32 +- packages/utils/tests/utils.spec.ts | 64 +- scripts/bumpVersionByCommit.js | 32 +- scripts/checkCpuModel.js | 16 +- scripts/coveragePathFixing.js | 4 +- scripts/generateMessage.js | 54 +- scripts/openApiSchema.js | 72 +- website/docusaurus.config.ts | 14 +- website/sidebars.ts | 6 +- .../components/architecture/BaseFlowChart.tsx | 22 +- .../src/components/architecture/FlowChart.tsx | 12 +- .../components/architecture/FlowChart2.tsx | 12 +- .../components/architecture/FlowChart3.tsx | 236 +-- .../components/architecture/FlowChart4.tsx | 12 +- .../bigbotguide/GatewayFlowChart.tsx | 28 +- website/src/components/footer/index.tsx | 2 +- website/src/components/header/index.tsx | 6 +- website/src/components/home/faq/index.tsx | 18 +- .../src/components/home/features/feature.tsx | 4 +- .../src/components/home/features/index.tsx | 10 +- website/src/components/home/reviews/index.tsx | 10 +- website/src/pages/index.tsx | 14 +- website/src/types.ts | 42 +- 403 files changed, 11250 insertions(+), 11217 deletions(-) diff --git a/.mocharc.cjs b/.mocharc.cjs index ae8736faa..4b98aedf5 100644 --- a/.mocharc.cjs +++ b/.mocharc.cjs @@ -1,23 +1,23 @@ // @ts-check // If we are running in Bun or Deno, they have native TypeScript support with .js imports, node requires .ts imports -const supportsTypescript = 'Bun' in globalThis || 'Deno' in globalThis +const supportsTypescript = 'Bun' in globalThis || 'Deno' in globalThis; /** @type {import("mocha").MochaInstanceOptions & Record} */ const mochaConfig = { timeout: 2000, 'watch-extensions': 'ts', 'watch-files': ['src', 'tests'], -} +}; if (!supportsTypescript) { - mochaConfig.require = ['ts-node/register'] + mochaConfig.require = ['ts-node/register']; // Node options - mochaConfig.loader = ['ts-node/esm'] + mochaConfig.loader = ['ts-node/esm']; // Node will output a ExperimentalWarning about --loader (--experimental-loader) and a DeprecationWarning because ts-node uses fs.Stat - mochaConfig['no-warnings'] = true - mochaConfig['enable-source-maps'] = true + mochaConfig['no-warnings'] = true; + mochaConfig['enable-source-maps'] = true; } -module.exports = mochaConfig +module.exports = mochaConfig; diff --git a/biome.jsonc b/biome.jsonc index 9798b6e42..948c73041 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -38,7 +38,6 @@ "javascript": { "formatter": { "trailingCommas": "all", - "semicolons": "asNeeded", "quoteStyle": "single" } }, diff --git a/docker-apps/rest-passthrough/src/fastify.ts b/docker-apps/rest-passthrough/src/fastify.ts index 27bf4709f..4a9d403a7 100644 --- a/docker-apps/rest-passthrough/src/fastify.ts +++ b/docker-apps/rest-passthrough/src/fastify.ts @@ -1,10 +1,10 @@ -import fastifyEnv from '@fastify/env' -import fastifyHelmet from '@fastify/helmet' -import fastifyMultipart from '@fastify/multipart' -import fastify, { type FastifyInstance } from 'fastify' +import fastifyEnv from '@fastify/env'; +import fastifyHelmet from '@fastify/helmet'; +import fastifyMultipart from '@fastify/multipart'; +import fastify, { type FastifyInstance } from 'fastify'; export const buildFastifyApp = async (): Promise => { - const app = await fastify() + const app = await fastify(); await app.register(fastifyEnv, { schema: { @@ -25,28 +25,28 @@ export const buildFastifyApp = async (): Promise => { }, required: ['DISCORD_TOKEN', 'AUTHORIZATION_TOKEN'], }, - }) + }); - await app.register(fastifyHelmet) - app.register(fastifyMultipart, { attachFieldsToBody: true }) + await app.register(fastifyHelmet); + app.register(fastifyMultipart, { attachFieldsToBody: true }); app.addHook('onRequest', async (request, reply) => { if (request.headers.authorization !== request.server.config.AUTHORIZATION_TOKEN) { reply.status(401).send({ message: 'Credentials not valid.', - }) + }); } - }) + }); - return app -} + return app; +}; declare module 'fastify' { interface FastifyInstance { config: { - HOST: string - DISCORD_TOKEN: string - AUTHORIZATION_TOKEN: string - } + HOST: string; + DISCORD_TOKEN: string; + AUTHORIZATION_TOKEN: string; + }; } } diff --git a/docker-apps/rest-passthrough/src/server.ts b/docker-apps/rest-passthrough/src/server.ts index dba5cb695..eef93e4b2 100644 --- a/docker-apps/rest-passthrough/src/server.ts +++ b/docker-apps/rest-passthrough/src/server.ts @@ -1,79 +1,79 @@ -import { createRestManager, type RequestMethods } from '@discordeno/rest' -import type { MultipartFile, MultipartValue } from '@fastify/multipart' -import { buildFastifyApp } from './fastify.js' +import { createRestManager, type RequestMethods } from '@discordeno/rest'; +import type { MultipartFile, MultipartValue } from '@fastify/multipart'; +import { buildFastifyApp } from './fastify.js'; -const app = await buildFastifyApp() +const app = await buildFastifyApp(); if (!app.config.DISCORD_TOKEN || !app.config.AUTHORIZATION_TOKEN) { - console.error('Missing environment variables. Both DISCORD_TOKEN and AUTHORIZATION_TOKEN are required.') - process.exit(1) + console.error('Missing environment variables. Both DISCORD_TOKEN and AUTHORIZATION_TOKEN are required.'); + process.exit(1); } const discordRestManager = createRestManager({ token: app.config.DISCORD_TOKEN, -}) +}); app.get('/timecheck', async (_request, reply) => { reply.status(200).send({ message: Date.now(), - }) -}) + }); +}); app.all('/*', async (request, reply) => { - let url = request.originalUrl + let url = request.originalUrl; if (url.startsWith('/v')) { - url = url.slice(url.indexOf('/', 2)) + url = url.slice(url.indexOf('/', 2)); } - const isMultipart = request.headers['content-type']?.startsWith('multipart/form-data') - const body = request.method !== 'GET' && request.method !== 'DELETE' ? request.body : undefined + const isMultipart = request.headers['content-type']?.startsWith('multipart/form-data'); + const body = request.method !== 'GET' && request.method !== 'DELETE' ? request.body : undefined; try { const result = await discordRestManager.makeRequest(request.method as RequestMethods, url, { body: isMultipart && body ? await parseMultiformBody(body) : body, - }) + }); if (result) { - reply.status(200).send(result) + reply.status(200).send(result); } else { - reply.status(204).send({}) + reply.status(204).send({}); } } catch (error) { - app.log.error(error) + app.log.error(error); reply.status(500).send({ message: error, - }) + }); } -}) +}); try { await app.listen({ host: app.config.HOST, port: 8000, - }) - console.log(`Proxy listening on port 8000`) + }); + console.log(`Proxy listening on port 8000`); } catch (error) { - app.log.error(error) - process.exit(1) + app.log.error(error); + process.exit(1); } async function parseMultiformBody(body: unknown): Promise { - const form = new FormData() + const form = new FormData(); - if (typeof body !== 'object' || !body) return form + if (typeof body !== 'object' || !body) return form; for (const objectValue of Object.values(body)) { - const value = objectValue as MultipartFile | MultipartValue + const value = objectValue as MultipartFile | MultipartValue; if (value.type === 'file') { - form.append(value.fieldname, new Blob([Uint8Array.from(await value.toBuffer())]), value.filename) + form.append(value.fieldname, new Blob([Uint8Array.from(await value.toBuffer())]), value.filename); } if (value.type === 'field' && typeof value.value === 'string') { - form.append(value.fieldname, value.value) + form.append(value.fieldname, value.value); } } - return form + return form; } diff --git a/examples/advanced/src/bot.ts b/examples/advanced/src/bot.ts index 915b4d73e..5fede6f9d 100644 --- a/examples/advanced/src/bot.ts +++ b/examples/advanced/src/bot.ts @@ -1,6 +1,6 @@ -import { createBot, type logger as discordenoLogger, Intents, LogDepth } from '@discordeno/bot' -import { createProxyCache } from 'dd-cache-proxy' -import { configs } from './config.js' +import { createBot, type logger as discordenoLogger, Intents, LogDepth } from '@discordeno/bot'; +import { createProxyCache } from 'dd-cache-proxy'; +import { configs } from './config.js'; const rawBot = createBot({ token: configs.token, @@ -38,7 +38,7 @@ const rawBot = createBot({ discriminator: true, }, }, -}) +}); export const bot = createProxyCache(rawBot, { desiredProps: { @@ -50,7 +50,7 @@ export const bot = createProxyCache(rawBot, { role: true, default: false, }, -}) +}); // By default, bot.logger will use an instance of the logger from @discordeno/bot, this logger supports depth and we need to change it, so we need to say to TS that we know what we are doing with as -;(bot.logger as typeof discordenoLogger).setDepth(LogDepth.Full) +(bot.logger as typeof discordenoLogger).setDepth(LogDepth.Full); diff --git a/examples/advanced/src/commands.ts b/examples/advanced/src/commands.ts index a493e8d08..7d64541b9 100644 --- a/examples/advanced/src/commands.ts +++ b/examples/advanced/src/commands.ts @@ -1,21 +1,21 @@ -import { type ApplicationCommandOption, type ApplicationCommandTypes, Collection } from '@discordeno/bot' -import type { bot } from './bot.js' +import { type ApplicationCommandOption, type ApplicationCommandTypes, Collection } from '@discordeno/bot'; +import type { bot } from './bot.js'; -export const commands = new Collection() +export const commands = new Collection(); export function createCommand(command: Command): void { - commands.set(command.name, command) + commands.set(command.name, command); } export interface Command { /** The name of this command. */ - name: string + name: string; /** What does this command do? */ - description: string + description: string; /** The type of command this is. */ - type: ApplicationCommandTypes + type: ApplicationCommandTypes; /** The options for this command */ - options?: ApplicationCommandOption[] + options?: ApplicationCommandOption[]; /** This will be executed when the command is run. */ - execute: (interaction: typeof bot.transformers.$inferredTypes.interaction, options: Record) => unknown + execute: (interaction: typeof bot.transformers.$inferredTypes.interaction, options: Record) => unknown; } diff --git a/examples/advanced/src/commands/ping.ts b/examples/advanced/src/commands/ping.ts index c7eb55b3c..d59348b43 100644 --- a/examples/advanced/src/commands/ping.ts +++ b/examples/advanced/src/commands/ping.ts @@ -1,15 +1,15 @@ -import { ApplicationCommandTypes, createEmbeds, snowflakeToTimestamp } from '@discordeno/bot' -import { createCommand } from '../commands.js' +import { ApplicationCommandTypes, createEmbeds, snowflakeToTimestamp } from '@discordeno/bot'; +import { createCommand } from '../commands.js'; createCommand({ name: 'ping', description: 'See if the bot latency is okay', type: ApplicationCommandTypes.ChatInput, async execute(interaction) { - const ping = Date.now() - snowflakeToTimestamp(interaction.id) + const ping = Date.now() - snowflakeToTimestamp(interaction.id); - const embeds = createEmbeds().setTitle(`The bot ping is ${ping}ms`) + const embeds = createEmbeds().setTitle(`The bot ping is ${ping}ms`); - await interaction.respond({ embeds }) + await interaction.respond({ embeds }); }, -}) +}); diff --git a/examples/advanced/src/commands/warn.ts b/examples/advanced/src/commands/warn.ts index 8f3ad19e2..cbcbe2337 100644 --- a/examples/advanced/src/commands/warn.ts +++ b/examples/advanced/src/commands/warn.ts @@ -1,7 +1,7 @@ -import { ApplicationCommandOptionTypes, ApplicationCommandTypes, createEmbeds, type Member, Permissions, type User } from '@discordeno/bot' -import { bot } from '../bot.js' -import { createCommand } from '../commands.js' -import { calculateMemberPermissions } from '../utils/permissions.js' +import { ApplicationCommandOptionTypes, ApplicationCommandTypes, createEmbeds, type Member, Permissions, type User } from '@discordeno/bot'; +import { bot } from '../bot.js'; +import { createCommand } from '../commands.js'; +import { calculateMemberPermissions } from '../utils/permissions.js'; createCommand({ name: 'warn', @@ -23,58 +23,58 @@ createCommand({ ], async execute(interaction, options) { if (!interaction.guildId || !interaction.member) { - await interaction.respond('This command can only be ran in guilds') - return + await interaction.respond('This command can only be ran in guilds'); + return; } // Type based on the options declared above - const { user, reason } = options as { user: UserResolved; reason?: string } + const { user, reason } = options as { user: UserResolved; reason?: string }; - const guild = await bot.cache.guilds.get(interaction.guildId) + const guild = await bot.cache.guilds.get(interaction.guildId); if (!guild || !guild.roles) { - await interaction.respond('An error has occurred') - return + await interaction.respond('An error has occurred'); + return; } - await interaction.defer() + await interaction.defer(); - const perms = new Permissions(await calculateMemberPermissions(guild, interaction.member)) + const perms = new Permissions(await calculateMemberPermissions(guild, interaction.member)); - const adminPerm = perms.has('ADMINISTRATOR') - const kickMembersPerm = adminPerm || perms.has('KICK_MEMBERS') + const adminPerm = perms.has('ADMINISTRATOR'); + const kickMembersPerm = adminPerm || perms.has('KICK_MEMBERS'); if (!kickMembersPerm) { - await interaction.respond("You don't have the necessary permissions to warn a members (this command requires `Kick members`)") - return + await interaction.respond("You don't have the necessary permissions to warn a members (this command requires `Kick members`)"); + return; } const embeds = createEmbeds() .setTitle('Warned User:') .setDescription(`User: <@${user.user.id}>\nReason: ${reason}`) .setColor(0x00ff00) - .setTimestamp(Date.now()) + .setTimestamp(Date.now()); const warnEmbeds = createEmbeds() .setTitle('Warning:') .setDescription(`You have been warned in **${guild.name}** for \`${reason}\``) - .setTimestamp(Date.now()) + .setTimestamp(Date.now()); try { - const dmChannel = await bot.helpers.getDmChannel(user.user.id) - await bot.helpers.sendMessage(dmChannel.id, { embeds: warnEmbeds }) + const dmChannel = await bot.helpers.getDmChannel(user.user.id); + await bot.helpers.sendMessage(dmChannel.id, { embeds: warnEmbeds }); } catch (error) { - bot.logger.error(`There was an error in the warn command:`, error) + bot.logger.error(`There was an error in the warn command:`, error); - await interaction.respond(`Could not warn user <@${user.user.id}> | They likely do not have their DMs open.`) - return + await interaction.respond(`Could not warn user <@${user.user.id}> | They likely do not have their DMs open.`); + return; } - await interaction.respond({ embeds }) + await interaction.respond({ embeds }); }, -}) +}); interface UserResolved { - user: User - member?: Member + user: User; + member?: Member; } diff --git a/examples/advanced/src/config.ts b/examples/advanced/src/config.ts index 01a52c3e5..a0c6cae82 100644 --- a/examples/advanced/src/config.ts +++ b/examples/advanced/src/config.ts @@ -1,11 +1,11 @@ -const token = process.env.TOKEN +const token = process.env.TOKEN; -if (!token) throw new Error('Missing TOKEN environment variable') +if (!token) throw new Error('Missing TOKEN environment variable'); export const configs: Config = { token, -} +}; export interface Config { - token: string + token: string; } diff --git a/examples/advanced/src/events/interactionCreate.ts b/examples/advanced/src/events/interactionCreate.ts index b74a5d9f3..44c28eb81 100644 --- a/examples/advanced/src/events/interactionCreate.ts +++ b/examples/advanced/src/events/interactionCreate.ts @@ -1,22 +1,22 @@ -import { commandOptionsParser, InteractionTypes } from '@discordeno/bot' -import { bot } from '../bot.js' -import { commands } from '../commands.js' +import { commandOptionsParser, InteractionTypes } from '@discordeno/bot'; +import { bot } from '../bot.js'; +import { commands } from '../commands.js'; bot.events.interactionCreate = async (interaction) => { - if (!interaction.data || interaction.type !== InteractionTypes.ApplicationCommand) return + if (!interaction.data || interaction.type !== InteractionTypes.ApplicationCommand) return; - const command = commands.get(interaction.data.name) + const command = commands.get(interaction.data.name); if (!command) { - bot.logger.error(`Command ${interaction.data.name} not found`) - return + bot.logger.error(`Command ${interaction.data.name} not found`); + return; } - const options = commandOptionsParser(interaction) + const options = commandOptionsParser(interaction); try { - await command.execute(interaction, options) + await command.execute(interaction, options); } catch (error) { - bot.logger.error(`There was an error running the ${command.name} command.`, error) + bot.logger.error(`There was an error running the ${command.name} command.`, error); } -} +}; diff --git a/examples/advanced/src/events/ready.ts b/examples/advanced/src/events/ready.ts index 5b7255836..91fd913f8 100644 --- a/examples/advanced/src/events/ready.ts +++ b/examples/advanced/src/events/ready.ts @@ -1,8 +1,8 @@ -import { bot } from '../bot.js' +import { bot } from '../bot.js'; bot.events.ready = ({ user, shardId }) => { if (shardId === bot.gateway.lastShardId) { // All shards are ready - bot.logger.info(`Successfully connected to the gateway as ${user.username}#${user.discriminator}`) + bot.logger.info(`Successfully connected to the gateway as ${user.username}#${user.discriminator}`); } -} +}; diff --git a/examples/advanced/src/index.ts b/examples/advanced/src/index.ts index 0d69c323b..c4e4e6c37 100644 --- a/examples/advanced/src/index.ts +++ b/examples/advanced/src/index.ts @@ -1,14 +1,14 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { bot } from './bot.js' -import importDirectory from './utils/loader.js' +import { bot } from './bot.js'; +import importDirectory from './utils/loader.js'; -bot.logger.info('Starting bot...') +bot.logger.info('Starting bot...'); -bot.logger.info('Loading commands...') -await importDirectory('./dist/commands') +bot.logger.info('Loading commands...'); +await importDirectory('./dist/commands'); -bot.logger.info('Loading events...') -await importDirectory('./dist/events') +bot.logger.info('Loading events...'); +await importDirectory('./dist/events'); -await bot.start() +await bot.start(); diff --git a/examples/advanced/src/register-commands.ts b/examples/advanced/src/register-commands.ts index 39d03d497..695769411 100644 --- a/examples/advanced/src/register-commands.ts +++ b/examples/advanced/src/register-commands.ts @@ -1,16 +1,16 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { bot } from './bot.js' -import importDirectory from './utils/loader.js' -import { updateApplicationCommands } from './utils/updateCommands.js' +import { bot } from './bot.js'; +import importDirectory from './utils/loader.js'; +import { updateApplicationCommands } from './utils/updateCommands.js'; -bot.logger.info('Loading commands...') -await importDirectory('./dist/commands') +bot.logger.info('Loading commands...'); +await importDirectory('./dist/commands'); -bot.logger.info('Updating commands...') -await updateApplicationCommands() +bot.logger.info('Updating commands...'); +await updateApplicationCommands(); -bot.logger.info('Done!') +bot.logger.info('Done!'); // We need to manually exit as the REST Manager has timeouts that will keep NodeJS alive -process.exit() +process.exit(); diff --git a/examples/advanced/src/utils/loader.ts b/examples/advanced/src/utils/loader.ts index 990755056..a313d09fe 100644 --- a/examples/advanced/src/utils/loader.ts +++ b/examples/advanced/src/utils/loader.ts @@ -1,15 +1,15 @@ -import { readdir } from 'node:fs/promises' -import { logger } from '@discordeno/bot' +import { readdir } from 'node:fs/promises'; +import { logger } from '@discordeno/bot'; export default async function importDirectory(folder: string): Promise { - const files = await readdir(folder, { recursive: true }) + const files = await readdir(folder, { recursive: true }); for (const filename of files) { - if (!filename.endsWith('.js')) continue + if (!filename.endsWith('.js')) continue; // Using `file://` and `process.cwd()` to avoid weird issues with relative paths and/or Windows await import(`file://${process.cwd()}/${folder}/${filename}`).catch((x) => logger.fatal(`Cannot import file (${folder}/${filename}) for reason:`, x), - ) + ); } } diff --git a/examples/advanced/src/utils/permissions.ts b/examples/advanced/src/utils/permissions.ts index 4e0fcf5c7..bc4d2a419 100644 --- a/examples/advanced/src/utils/permissions.ts +++ b/examples/advanced/src/utils/permissions.ts @@ -1,24 +1,24 @@ -import assert from 'node:assert' -import { BitwisePermissionFlags } from '@discordeno/bot' -import type { bot } from '../bot.js' +import assert from 'node:assert'; +import { BitwisePermissionFlags } from '@discordeno/bot'; +import type { bot } from '../bot.js'; export async function calculateMemberPermissions( guild: typeof bot.transformers.$inferredTypes.guild | typeof bot.cache.$inferredTypes.guild, member: typeof bot.transformers.$inferredTypes.member, ) { - if (member.id === guild.ownerId) return 8n + if (member.id === guild.ownerId) return 8n; - let permissions = guild.roles?.get(guild.id)?.permissions.bitfield - const rolePerms = member.roles.map((x) => guild.roles?.get(x)?.permissions.bitfield).filter((x): x is bigint => x !== undefined) + let permissions = guild.roles?.get(guild.id)?.permissions.bitfield; + const rolePerms = member.roles.map((x) => guild.roles?.get(x)?.permissions.bitfield).filter((x): x is bigint => x !== undefined); // Small hack to avoid calling assert with 0n - if (permissions === undefined) assert(permissions) + if (permissions === undefined) assert(permissions); for (const rolePerm of rolePerms) { - permissions |= rolePerm + permissions |= rolePerm; } - if ((permissions & BigInt(BitwisePermissionFlags.ADMINISTRATOR)) === BigInt(BitwisePermissionFlags.ADMINISTRATOR)) return 8n + if ((permissions & BigInt(BitwisePermissionFlags.ADMINISTRATOR)) === BigInt(BitwisePermissionFlags.ADMINISTRATOR)) return 8n; - return permissions + return permissions; } diff --git a/examples/advanced/src/utils/updateCommands.ts b/examples/advanced/src/utils/updateCommands.ts index d92a348d6..edaa70a39 100644 --- a/examples/advanced/src/utils/updateCommands.ts +++ b/examples/advanced/src/utils/updateCommands.ts @@ -1,6 +1,6 @@ -import { bot } from '../bot.js' -import { commands } from '../commands.js' +import { bot } from '../bot.js'; +import { commands } from '../commands.js'; export async function updateApplicationCommands(): Promise { - await bot.helpers.upsertGlobalApplicationCommands(commands.array()) + await bot.helpers.upsertGlobalApplicationCommands(commands.array()); } diff --git a/examples/beginner/src/bot.ts b/examples/beginner/src/bot.ts index c6232dfd0..69ae019bb 100644 --- a/examples/beginner/src/bot.ts +++ b/examples/beginner/src/bot.ts @@ -1,6 +1,6 @@ -import { createBot, Intents } from '@discordeno/bot' -import { createProxyCache } from 'dd-cache-proxy' -import { configs } from './config.js' +import { createBot, Intents } from '@discordeno/bot'; +import { createProxyCache } from 'dd-cache-proxy'; +import { configs } from './config.js'; const rawBot = createBot({ token: configs.token, @@ -22,7 +22,7 @@ const rawBot = createBot({ username: true, }, }, -}) +}); export const bot = createProxyCache(rawBot, { desiredProps: { @@ -32,4 +32,4 @@ export const bot = createProxyCache(rawBot, { guild: true, default: false, }, -}) +}); diff --git a/examples/beginner/src/commands.ts b/examples/beginner/src/commands.ts index 8c0577358..f54a1bed9 100644 --- a/examples/beginner/src/commands.ts +++ b/examples/beginner/src/commands.ts @@ -1,27 +1,27 @@ -import { type ApplicationCommandOption, type ApplicationCommandTypes, Collection } from '@discordeno/bot' -import type { bot } from './bot.js' +import { type ApplicationCommandOption, type ApplicationCommandTypes, Collection } from '@discordeno/bot'; +import type { bot } from './bot.js'; -export const commands = new Collection() +export const commands = new Collection(); export function createCommand(command: Command): void { - commands.set(command.name, command) + commands.set(command.name, command); } export interface Command { - name: string - description: string - usage?: string[] - options?: ApplicationCommandOption[] - type: ApplicationCommandTypes + name: string; + description: string; + usage?: string[]; + options?: ApplicationCommandOption[]; + type: ApplicationCommandTypes; /** Defaults to `Guild` */ - scope?: 'Global' | 'Guild' - execute: (interaction: typeof bot.transformers.$inferredTypes.interaction) => unknown - subcommands?: Array + scope?: 'Global' | 'Guild'; + execute: (interaction: typeof bot.transformers.$inferredTypes.interaction) => unknown; + subcommands?: Array; } -export type SubCommand = Omit +export type SubCommand = Omit; export interface SubCommandGroup { - name: string - subCommands: SubCommand[] + name: string; + subCommands: SubCommand[]; } diff --git a/examples/beginner/src/commands/ping.ts b/examples/beginner/src/commands/ping.ts index 436fab402..2d494ec76 100644 --- a/examples/beginner/src/commands/ping.ts +++ b/examples/beginner/src/commands/ping.ts @@ -1,6 +1,6 @@ -import { ApplicationCommandTypes, snowflakeToTimestamp } from '@discordeno/bot' -import { createCommand } from '../commands.js' -import { humanizeMilliseconds } from '../utils/helpers.js' +import { ApplicationCommandTypes, snowflakeToTimestamp } from '@discordeno/bot'; +import { createCommand } from '../commands.js'; +import { humanizeMilliseconds } from '../utils/helpers.js'; createCommand({ name: 'ping', @@ -8,8 +8,8 @@ createCommand({ type: ApplicationCommandTypes.ChatInput, scope: 'Global', async execute(interaction) { - const ping = Date.now() - snowflakeToTimestamp(interaction.id) + const ping = Date.now() - snowflakeToTimestamp(interaction.id); - await interaction.respond(`🏓 Pong! Ping ${ping}ms (${humanizeMilliseconds(ping)})`) + await interaction.respond(`🏓 Pong! Ping ${ping}ms (${humanizeMilliseconds(ping)})`); }, -}) +}); diff --git a/examples/beginner/src/config.ts b/examples/beginner/src/config.ts index a196faa4d..63dc30956 100644 --- a/examples/beginner/src/config.ts +++ b/examples/beginner/src/config.ts @@ -1,12 +1,12 @@ -const token = process.env.BOT_TOKEN +const token = process.env.BOT_TOKEN; -if (!token) throw new Error('Missing BOT_TOKEN environment variable') +if (!token) throw new Error('Missing BOT_TOKEN environment variable'); export const configs: Config = { /** Get token from ENV variable */ token, -} +}; export interface Config { - token: string + token: string; } diff --git a/examples/beginner/src/events/guildCreate.ts b/examples/beginner/src/events/guildCreate.ts index 1f07ed7cb..80403f7f7 100644 --- a/examples/beginner/src/events/guildCreate.ts +++ b/examples/beginner/src/events/guildCreate.ts @@ -1,4 +1,4 @@ -import { bot } from '../bot.js' -import { updateGuildCommands } from '../utils/helpers.js' +import { bot } from '../bot.js'; +import { updateGuildCommands } from '../utils/helpers.js'; -bot.events.guildCreate = async (guild) => await updateGuildCommands(guild) +bot.events.guildCreate = async (guild) => await updateGuildCommands(guild); diff --git a/examples/beginner/src/events/interactionCreate.ts b/examples/beginner/src/events/interactionCreate.ts index aa658797b..2bab51eaf 100644 --- a/examples/beginner/src/events/interactionCreate.ts +++ b/examples/beginner/src/events/interactionCreate.ts @@ -1,94 +1,94 @@ -import { ApplicationCommandOptionTypes, hasProperty } from '@discordeno/bot' -import chalk from 'chalk' -import { bot } from '../bot.js' -import { commands } from '../commands.js' -import { getGuildFromId, isSubCommand, isSubCommandGroup } from '../utils/helpers.js' -import { createLogger } from '../utils/logger.js' +import { ApplicationCommandOptionTypes, hasProperty } from '@discordeno/bot'; +import chalk from 'chalk'; +import { bot } from '../bot.js'; +import { commands } from '../commands.js'; +import { getGuildFromId, isSubCommand, isSubCommandGroup } from '../utils/helpers.js'; +import { createLogger } from '../utils/logger.js'; -const logger = createLogger({ name: 'Event: InteractionCreate' }) +const logger = createLogger({ name: 'Event: InteractionCreate' }); bot.events.interactionCreate = async (interaction) => { - if (!interaction.data || !interaction.id) return + if (!interaction.data || !interaction.id) return; - let guildName = 'Direct Message' - let guild = {} as typeof bot.transformers.$inferredTypes.guild + let guildName = 'Direct Message'; + let guild = {} as typeof bot.transformers.$inferredTypes.guild; // Set guild, if there was an error getting the guild, then just say it was a DM. (What else are we going to do?) if (interaction.guildId) { const guildOrVoid = await getGuildFromId(interaction.guildId).catch((err) => { - logger.error(err) - }) + logger.error(err); + }); if (guildOrVoid) { - guild = guildOrVoid - guildName = guild.name + guild = guildOrVoid; + guildName = guild.name; } } logger.info( `[Command: ${chalk.bgYellow.black(interaction.data.name)} - ${chalk.bgBlack.white(`Trigger`)}] by @${interaction.user.username} in ${guildName}${guildName !== 'Direct Message' ? ` (${guild.id})` : ``}`, - ) + ); - let command = commands.get(interaction.data.name) + let command = commands.get(interaction.data.name); if (!command) { logger.warn( `[Command: ${chalk.bgYellow.black(interaction.data.name)} - ${chalk.bgBlack.yellow(`Not Found`)}] by @${interaction.user.username} in ${guildName}${guildName !== 'Direct Message' ? ` (${guild.id})` : ``}`, - ) + ); - return + return; } if (interaction.data.options?.[0]) { - const optionType = interaction.data.options[0].type + const optionType = interaction.data.options[0].type; if (optionType === ApplicationCommandOptionTypes.SubCommandGroup) { // Check if command has subcommand and handle types - if (!command.subcommands) return + if (!command.subcommands) return; // Try to find the subcommand group - const subCommandGroup = command.subcommands?.find((command) => command.name === interaction.data?.options?.[0].name) - if (!subCommandGroup) return + const subCommandGroup = command.subcommands?.find((command) => command.name === interaction.data?.options?.[0].name); + if (!subCommandGroup) return; - if (isSubCommand(subCommandGroup)) return + if (isSubCommand(subCommandGroup)) return; // Get name of the command which we are looking for - const targetCmdName = interaction.data.options?.[0].options?.[0].name ?? interaction.data.options?.[0].options?.[0].name - if (!targetCmdName) return + const targetCmdName = interaction.data.options?.[0].options?.[0].name ?? interaction.data.options?.[0].options?.[0].name; + if (!targetCmdName) return; // Try to find the command - command = subCommandGroup.subCommands.find((c) => c.name === targetCmdName) + command = subCommandGroup.subCommands.find((c) => c.name === targetCmdName); } if (optionType === ApplicationCommandOptionTypes.SubCommand) { // Check if command has subcommand and handle types - if (!command?.subcommands) return + if (!command?.subcommands) return; // Try to find the command - const found = command.subcommands.find((command) => command.name === interaction.data?.options?.[0].name) - if (!found) return + const found = command.subcommands.find((command) => command.name === interaction.data?.options?.[0].name); + if (!found) return; - if (isSubCommandGroup(found)) return + if (isSubCommandGroup(found)) return; - command = found + command = found; } } try { - if (!command) throw new Error('Not command could be found') + if (!command) throw new Error('Not command could be found'); - await command.execute(interaction) + await command.execute(interaction); logger.info( `[Command: ${chalk.bgYellow.black(interaction.data.name)} - ${chalk.bgBlack.green(`Success`)}] by @${interaction.user.username} in ${guildName}${guildName !== 'Direct Message' ? ` (${guild.id})` : ``}`, - ) + ); } catch (err) { logger.error( `[Command: ${chalk.bgYellow.black(interaction.data.name)} - ${chalk.bgBlack.red(`Error`)}] by @${interaction.user.username} in ${guildName}${guildName !== 'Direct Message' ? ` (${guild.id})` : ``}`, - ) + ); - if (typeof err !== 'object' || !err || !hasProperty(err, 'message') || err.message === 'Not command could be found') return + if (typeof err !== 'object' || !err || !hasProperty(err, 'message') || err.message === 'Not command could be found') return; - logger.error(err) + logger.error(err); } -} +}; diff --git a/examples/beginner/src/events/ready.ts b/examples/beginner/src/events/ready.ts index ddcdf5e2b..7b4814206 100644 --- a/examples/beginner/src/events/ready.ts +++ b/examples/beginner/src/events/ready.ts @@ -1,11 +1,11 @@ -import { ActivityTypes } from '@discordeno/bot' -import { bot } from '../bot.js' -import { createLogger } from '../utils/logger.js' +import { ActivityTypes } from '@discordeno/bot'; +import { bot } from '../bot.js'; +import { createLogger } from '../utils/logger.js'; -const logger = createLogger({ name: 'Event: Ready' }) +const logger = createLogger({ name: 'Event: Ready' }); bot.events.ready = async ({ shardId }) => { - logger.info('Bot Ready') + logger.info('Bot Ready'); await bot.gateway.editShardStatus(shardId, { status: 'online', @@ -18,5 +18,5 @@ bot.events.ready = async ({ shardId }) => { }, }, ], - }) -} + }); +}; diff --git a/examples/beginner/src/index.ts b/examples/beginner/src/index.ts index b0f5f89cf..30a137aec 100644 --- a/examples/beginner/src/index.ts +++ b/examples/beginner/src/index.ts @@ -1,15 +1,15 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { bot } from './bot.js' -import importDirectory from './utils/loader.js' -import logger from './utils/logger.js' +import { bot } from './bot.js'; +import importDirectory from './utils/loader.js'; +import logger from './utils/logger.js'; -logger.info('Starting bot...') +logger.info('Starting bot...'); -logger.info('Loading commands...') -await importDirectory('./dist/commands') +logger.info('Loading commands...'); +await importDirectory('./dist/commands'); -logger.info('Loading events...') -await importDirectory('./dist/events') +logger.info('Loading events...'); +await importDirectory('./dist/events'); -await bot.start() +await bot.start(); diff --git a/examples/beginner/src/register-commands.ts b/examples/beginner/src/register-commands.ts index f690db9d1..fba5c7b93 100644 --- a/examples/beginner/src/register-commands.ts +++ b/examples/beginner/src/register-commands.ts @@ -1,16 +1,16 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { bot } from './bot.js' -import { updateCommands } from './utils/helpers.js' -import importDirectory from './utils/loader.js' +import { bot } from './bot.js'; +import { updateCommands } from './utils/helpers.js'; +import importDirectory from './utils/loader.js'; -bot.logger.info('Loading commands...') -await importDirectory('./dist/commands') +bot.logger.info('Loading commands...'); +await importDirectory('./dist/commands'); -bot.logger.info('Updating commands...') -await updateCommands() +bot.logger.info('Updating commands...'); +await updateCommands(); -bot.logger.info('Done!') +bot.logger.info('Done!'); // We need to manually exit as the REST Manager has timeouts that will keep NodeJS alive -process.exit() +process.exit(); diff --git a/examples/beginner/src/utils/helpers.ts b/examples/beginner/src/utils/helpers.ts index 5d07ccf8a..623326ed9 100644 --- a/examples/beginner/src/utils/helpers.ts +++ b/examples/beginner/src/utils/helpers.ts @@ -1,14 +1,14 @@ -import { type CreateApplicationCommand, hasProperty } from '@discordeno/bot' -import { bot } from '../bot.js' -import { commands, type SubCommand, type SubCommandGroup } from '../commands.js' -import { createLogger } from './logger.js' +import { type CreateApplicationCommand, hasProperty } from '@discordeno/bot'; +import { bot } from '../bot.js'; +import { commands, type SubCommand, type SubCommandGroup } from '../commands.js'; +import { createLogger } from './logger.js'; -const logger = createLogger({ name: 'Helpers' }) +const logger = createLogger({ name: 'Helpers' }); /** This function will update all commands, or the defined scope */ export async function updateCommands(scope?: 'Guild' | 'Global'): Promise { - const globalCommands: MakeRequired[] = [] - const perGuildCommands: MakeRequired[] = [] + const globalCommands: MakeRequired[] = []; + const perGuildCommands: MakeRequired[] = []; for (const command of commands.values()) { if (command.scope === 'Guild') { @@ -17,34 +17,34 @@ export async function updateCommands(scope?: 'Guild' | 'Global'): Promise description: command.description, type: command.type, options: command.options ? command.options : undefined, - }) + }); } else { globalCommands.push({ name: command.name, description: command.description, type: command.type, options: command.options ? command.options : undefined, - }) + }); } } if (globalCommands.length && (scope === 'Global' || scope === undefined)) { - logger.info('Updating Global Commands, changes should apply in short...') - await bot.helpers.upsertGlobalApplicationCommands(globalCommands).catch(logger.error) + logger.info('Updating Global Commands, changes should apply in short...'); + await bot.helpers.upsertGlobalApplicationCommands(globalCommands).catch(logger.error); } if (perGuildCommands.length && (scope === 'Guild' || scope === undefined)) { await Promise.all( bot.cache.guilds.memory.map(async (guild) => { - await bot.helpers.upsertGuildApplicationCommands(guild.id, perGuildCommands) + await bot.helpers.upsertGuildApplicationCommands(guild.id, perGuildCommands); }), - ) + ); } } /** Update commands for a guild */ export async function updateGuildCommands(guild: typeof bot.transformers.$inferredTypes.guild): Promise { - const perGuildCommands: MakeRequired[] = [] + const perGuildCommands: MakeRequired[] = []; for (const command of commands.values()) { if (command.scope === 'Guild') { @@ -53,49 +53,49 @@ export async function updateGuildCommands(guild: typeof bot.transformers.$inferr description: command.description, type: command.type, options: command.options ? command.options : undefined, - }) + }); } } if (perGuildCommands.length) { - await bot.helpers.upsertGuildApplicationCommands(guild.id, perGuildCommands) + await bot.helpers.upsertGuildApplicationCommands(guild.id, perGuildCommands); } } export async function getGuildFromId(guildId: bigint) { - const cached = await bot.cache.guilds.get(guildId) + const cached = await bot.cache.guilds.get(guildId); - if (cached) return cached + if (cached) return cached; - return await bot.helpers.getGuild(guildId) + return await bot.helpers.getGuild(guildId); } export function humanizeMilliseconds(milliseconds: number): string { // Gets ms into seconds - const time = milliseconds / 1000 - if (time < 1) return '< 1s' + const time = milliseconds / 1000; + if (time < 1) return '< 1s'; - const days = Math.floor(time / 86400) - const hours = Math.floor((time % 86400) / 3600) - const minutes = Math.floor(((time % 86400) % 3600) / 60) - const seconds = Math.floor(((time % 86400) % 3600) % 60) + const days = Math.floor(time / 86400); + const hours = Math.floor((time % 86400) / 3600); + const minutes = Math.floor(((time % 86400) % 3600) / 60); + const seconds = Math.floor(((time % 86400) % 3600) % 60); - const dayString = days ? `${days}d ` : '' - const hourString = hours ? `${hours}h ` : '' - const minuteString = minutes ? `${minutes}m ` : '' - const secondString = seconds ? `${seconds}s ` : '' + const dayString = days ? `${days}d ` : ''; + const hourString = hours ? `${hours}h ` : ''; + const minuteString = minutes ? `${minutes}m ` : ''; + const secondString = seconds ? `${seconds}s ` : ''; - return `${dayString}${hourString}${minuteString}${secondString}` + return `${dayString}${hourString}${minuteString}${secondString}`; } export function isSubCommand(data: SubCommand | SubCommandGroup): data is SubCommand { - return !hasProperty(data, 'subCommands') + return !hasProperty(data, 'subCommands'); } export function isSubCommandGroup(data: SubCommand | SubCommandGroup): data is SubCommandGroup { - return hasProperty(data, 'subCommands') + return hasProperty(data, 'subCommands'); } type MakeRequired = TObj & { - [Key in TKey]-?: TObj[Key] -} + [Key in TKey]-?: TObj[Key]; +}; diff --git a/examples/beginner/src/utils/loader.ts b/examples/beginner/src/utils/loader.ts index 5b1c6f541..213ceaf16 100644 --- a/examples/beginner/src/utils/loader.ts +++ b/examples/beginner/src/utils/loader.ts @@ -1,15 +1,15 @@ -import { readdir } from 'node:fs/promises' -import logger from './logger.js' +import { readdir } from 'node:fs/promises'; +import logger from './logger.js'; export default async function importDirectory(folder: string): Promise { - const files = await readdir(folder, { recursive: true }) + const files = await readdir(folder, { recursive: true }); for (const filename of files) { - if (!filename.endsWith('.js')) continue + if (!filename.endsWith('.js')) continue; // Using `file://` and `process.cwd()` to avoid weird issues with relative paths and/or Windows await import(`file://${process.cwd()}/${folder}/${filename}`).catch((x) => logger.fatal(`Cannot import file (${folder}/${filename}) for reason:`, x), - ) + ); } } diff --git a/examples/beginner/src/utils/logger.ts b/examples/beginner/src/utils/logger.ts index 4838e581b..47182b8b1 100644 --- a/examples/beginner/src/utils/logger.ts +++ b/examples/beginner/src/utils/logger.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unsafe-argument */ -import chalk from 'chalk' +import chalk from 'chalk'; export enum LogLevels { Debug, @@ -15,70 +15,70 @@ const prefixes = new Map([ [LogLevels.Warn, 'WARN'], [LogLevels.Error, 'ERROR'], [LogLevels.Fatal, 'FATAL'], -]) +]); -const noColor: (str: string) => string = (msg) => msg +const noColor: (str: string) => string = (msg) => msg; const colorFunctions = new Map string>([ [LogLevels.Debug, chalk.gray], [LogLevels.Info, chalk.cyan], [LogLevels.Warn, chalk.yellow], [LogLevels.Error, (str: string) => chalk.red(str)], [LogLevels.Fatal, (str: string) => chalk.red.bold.italic(str)], -]) +]); export function createLogger({ logLevel = LogLevels.Info, name }: { logLevel?: LogLevels; name?: string } = {}): Logger { function log(level: LogLevels, ...args: any[]): void { - if (level < logLevel) return + if (level < logLevel) return; - let color = colorFunctions.get(level) - if (!color) color = noColor + let color = colorFunctions.get(level); + if (!color) color = noColor; - const date = new Date() + const date = new Date(); const log = [ `[${date.toLocaleDateString()} ${date.toLocaleTimeString()}]`, color(prefixes.get(level) ?? 'DEBUG'), name ? `${name} >` : '>', ...args, - ] + ]; switch (level) { case LogLevels.Debug: - return console.debug(...log) + return console.debug(...log); case LogLevels.Info: - return console.info(...log) + return console.info(...log); case LogLevels.Warn: - return console.warn(...log) + return console.warn(...log); case LogLevels.Error: - return console.error(...log) + return console.error(...log); case LogLevels.Fatal: - return console.error(...log) + return console.error(...log); default: - return console.log(...log) + return console.log(...log); } } function setLevel(level: LogLevels): void { - logLevel = level + logLevel = level; } function debug(...args: any[]): void { - log(LogLevels.Debug, ...args) + log(LogLevels.Debug, ...args); } function info(...args: any[]): void { - log(LogLevels.Info, ...args) + log(LogLevels.Info, ...args); } function warn(...args: any[]): void { - log(LogLevels.Warn, ...args) + log(LogLevels.Warn, ...args); } function error(...args: any[]): void { - log(LogLevels.Error, ...args) + log(LogLevels.Error, ...args); } function fatal(...args: any[]): void { - log(LogLevels.Fatal, ...args) + log(LogLevels.Fatal, ...args); } return { @@ -89,18 +89,18 @@ export function createLogger({ logLevel = LogLevels.Info, name }: { logLevel?: L warn, error, fatal, - } + }; } -export const logger = createLogger({ name: 'Main' }) -export default logger +export const logger = createLogger({ name: 'Main' }); +export default logger; export interface Logger { - log: (level: LogLevels, ...args: any[]) => void - debug: (...args: any[]) => void - info: (...args: any[]) => void - warn: (...args: any[]) => void - error: (...args: any[]) => void - fatal: (...args: any[]) => void - setLevel: (level: LogLevels) => void + log: (level: LogLevels, ...args: any[]) => void; + debug: (...args: any[]) => void; + info: (...args: any[]) => void; + warn: (...args: any[]) => void; + error: (...args: any[]) => void; + fatal: (...args: any[]) => void; + setLevel: (level: LogLevels) => void; } diff --git a/examples/bigbot/src/bot/bot.ts b/examples/bigbot/src/bot/bot.ts index 995707597..e0dc82d53 100644 --- a/examples/bigbot/src/bot/bot.ts +++ b/examples/bigbot/src/bot/bot.ts @@ -1,7 +1,7 @@ -import { Collection, createBot } from '@discordeno/bot' -import { DISCORD_TOKEN, GATEWAY_AUTHORIZATION, GATEWAY_INTENTS, GATEWAY_URL, REST_AUTHORIZATION, REST_URL } from '../config.js' -import type { ManagerGetShardInfoFromGuildId, ShardInfo, WorkerPresencesUpdate, WorkerShardPayload } from '../gateway/worker/types.js' -import type { Command } from './commands.js' +import { Collection, createBot } from '@discordeno/bot'; +import { DISCORD_TOKEN, GATEWAY_AUTHORIZATION, GATEWAY_INTENTS, GATEWAY_URL, REST_AUTHORIZATION, REST_URL } from '../config.js'; +import type { ManagerGetShardInfoFromGuildId, ShardInfo, WorkerPresencesUpdate, WorkerShardPayload } from '../gateway/worker/types.js'; +import type { Command } from './commands.js'; const rawBot = createBot({ token: DISCORD_TOKEN, @@ -28,19 +28,19 @@ const rawBot = createBot({ authorization: REST_AUTHORIZATION, }, }, -}) +}); -export const bot = rawBot as CustomBot +export const bot = rawBot as CustomBot; // TEMPLATE-SETUP: If you want/need to add any custom properties on the Bot type, you can do it in these lines below and the `CustomBot` type below. Make sure to do it in both or else you will get an error by TypeScript -bot.commands = new Collection() +bot.commands = new Collection(); -overrideGatewayImplementations(bot) +overrideGatewayImplementations(bot); export type CustomBot = typeof rawBot & { - commands: Collection -} + commands: Collection; +}; // Override the default gateway functions to allow the methods on the gateway object to proxy the requests to the gateway proxy function overrideGatewayImplementations(bot: CustomBot): void { @@ -56,8 +56,8 @@ function overrideGatewayImplementations(bot: CustomBot): void { 'Content-Type': 'application/json', Authorization: GATEWAY_AUTHORIZATION, }, - }) - } + }); + }; bot.gateway.editBotStatus = async (payload) => { await fetch(GATEWAY_URL, { @@ -70,8 +70,8 @@ function overrideGatewayImplementations(bot: CustomBot): void { 'Content-Type': 'application/json', Authorization: GATEWAY_AUTHORIZATION, }, - }) - } + }); + }; } export async function getShardInfoFromGuild(guildId?: bigint): Promise> { @@ -85,11 +85,11 @@ export async function getShardInfoFromGuild(guildId?: bigint): Promise(command: Command): void { - bot.commands.set(command.name, command as Command) + bot.commands.set(command.name, command as Command); } export type Command = CreateApplicationCommand & { /** @inheritdoc */ - options?: TOptions + options?: TOptions; /** * Should this command be only deployed on the Dev guild? * * @default false */ - devOnly?: boolean + devOnly?: boolean; /** Function to run when the interaction is executed */ - run: (interaction: typeof bot.transformers.$inferredTypes.interaction, options: GetCommandOptions) => unknown + run: (interaction: typeof bot.transformers.$inferredTypes.interaction, options: GetCommandOptions) => unknown; /** Function to run when an autocomplete interaction is fired */ - autoComplete?: (interaction: typeof bot.transformers.$inferredTypes.interaction, options: GetCommandOptions) => unknown -} + autoComplete?: (interaction: typeof bot.transformers.$inferredTypes.interaction, options: GetCommandOptions) => unknown; +}; export type GetCommandOptions = T extends CommandOptions ? { [Prop in keyof BuildOptions as Prop]: BuildOptions[Prop] } - : never + : never; -export type CommandOption = Camelize -export type CommandOptions = CommandOption[] +export type CommandOption = Camelize; +export type CommandOptions = CommandOption[]; // Option parsing -type ResolvedValues = ParsedInteractionOption, ExtractDesiredBehavior>[string] +type ResolvedValues = ParsedInteractionOption, ExtractDesiredBehavior>[string]; // Using omit + exclude is a slight trick to avoid a type error on Pick export type InteractionResolvedChannel = Omit< typeof bot.transformers.$inferredTypes.channel, Exclude -> -export type InteractionResolvedMember = Omit +>; +export type InteractionResolvedMember = Omit; export interface InteractionResolvedUser { - user: typeof bot.transformers.$inferredTypes.user - member: InteractionResolvedMember + user: typeof bot.transformers.$inferredTypes.user; + member: InteractionResolvedMember; } /** @@ -56,30 +56,30 @@ export interface InteractionResolvedUser { * The entries are sorted based on the enum value */ interface TypeToResolvedMap { - [ApplicationCommandOptionTypes.String]: string - [ApplicationCommandOptionTypes.Integer]: number - [ApplicationCommandOptionTypes.Boolean]: boolean - [ApplicationCommandOptionTypes.User]: InteractionResolvedUser - [ApplicationCommandOptionTypes.Channel]: InteractionResolvedChannel - [ApplicationCommandOptionTypes.Role]: typeof bot.transformers.$inferredTypes.role - [ApplicationCommandOptionTypes.Mentionable]: typeof bot.transformers.$inferredTypes.role | InteractionResolvedUser - [ApplicationCommandOptionTypes.Number]: number - [ApplicationCommandOptionTypes.Attachment]: typeof bot.transformers.$inferredTypes.attachment + [ApplicationCommandOptionTypes.String]: string; + [ApplicationCommandOptionTypes.Integer]: number; + [ApplicationCommandOptionTypes.Boolean]: boolean; + [ApplicationCommandOptionTypes.User]: InteractionResolvedUser; + [ApplicationCommandOptionTypes.Channel]: InteractionResolvedChannel; + [ApplicationCommandOptionTypes.Role]: typeof bot.transformers.$inferredTypes.role; + [ApplicationCommandOptionTypes.Mentionable]: typeof bot.transformers.$inferredTypes.role | InteractionResolvedUser; + [ApplicationCommandOptionTypes.Number]: number; + [ApplicationCommandOptionTypes.Attachment]: typeof bot.transformers.$inferredTypes.attachment; } -type ConvertTypeToResolved = T extends keyof TypeToResolvedMap ? TypeToResolvedMap[T] : ResolvedValues +type ConvertTypeToResolved = T extends keyof TypeToResolvedMap ? TypeToResolvedMap[T] : ResolvedValues; -type SubCommandApplicationCommand = ApplicationCommandOptionTypes.SubCommand | ApplicationCommandOptionTypes.SubCommandGroup -type GetOptionName = T extends { name: string } ? T['name'] : never +type SubCommandApplicationCommand = ApplicationCommandOptionTypes.SubCommand | ApplicationCommandOptionTypes.SubCommandGroup; +type GetOptionName = T extends { name: string } ? T['name'] : never; type GetOptionValue = T extends { type: ApplicationCommandOptionTypes; required?: boolean } ? T extends { type: SubCommandApplicationCommand; options?: CommandOptions } ? BuildOptions : ConvertTypeToResolved | (T['required'] extends true ? never : undefined) - : never + : never; type BuildOptions = { - [Prop in keyof Omit as GetOptionName]: GetOptionValue -} + [Prop in keyof Omit as GetOptionName]: GetOptionValue; +}; -type ExtractDesiredProps = T extends Bot ? Props : never -type ExtractDesiredBehavior = T extends Bot ? Behavior : never +type ExtractDesiredProps = T extends Bot ? Props : never; +type ExtractDesiredBehavior = T extends Bot ? Behavior : never; diff --git a/examples/bigbot/src/bot/commands/ping.ts b/examples/bigbot/src/bot/commands/ping.ts index 8562faf0c..75793ba45 100644 --- a/examples/bigbot/src/bot/commands/ping.ts +++ b/examples/bigbot/src/bot/commands/ping.ts @@ -1,16 +1,16 @@ -import { snowflakeToTimestamp } from '@discordeno/bot' -import { getShardInfoFromGuild } from '../bot.js' -import createCommand from '../commands.js' +import { snowflakeToTimestamp } from '@discordeno/bot'; +import { getShardInfoFromGuild } from '../bot.js'; +import createCommand from '../commands.js'; createCommand({ name: 'ping', description: '🏓 Check whether the bot is online and responsive.', async run(interaction) { - const ping = Date.now() - snowflakeToTimestamp(interaction.id) - const shardInfo = await getShardInfoFromGuild(interaction.guildId) + const ping = Date.now() - snowflakeToTimestamp(interaction.id); + const shardInfo = await getShardInfoFromGuild(interaction.guildId); - const shardPing = shardInfo.rtt === -1 ? '*Not yet available*' : `${shardInfo.rtt}ms` + const shardPing = shardInfo.rtt === -1 ? '*Not yet available*' : `${shardInfo.rtt}ms`; - await interaction.respond(`🏓 Pong! Gateway Latency: ${shardPing}, Roundtrip Latency: ${ping}ms. I am online and responsive! 🕙`) + await interaction.respond(`🏓 Pong! Gateway Latency: ${shardPing}, Roundtrip Latency: ${ping}ms. I am online and responsive! 🕙`); }, -}) +}); diff --git a/examples/bigbot/src/bot/events/interactions/create.ts b/examples/bigbot/src/bot/events/interactions/create.ts index ce2a2526b..6fecbde82 100644 --- a/examples/bigbot/src/bot/events/interactions/create.ts +++ b/examples/bigbot/src/bot/events/interactions/create.ts @@ -1,39 +1,39 @@ -import { commandOptionsParser, InteractionTypes, LogLevels, type logger } from '@discordeno/bot' -import chalk from 'chalk' -import { bot } from '../../bot.js' +import { commandOptionsParser, InteractionTypes, LogLevels, type logger } from '@discordeno/bot'; +import chalk from 'chalk'; +import { bot } from '../../bot.js'; bot.events.interactionCreate = async (interaction) => { - const isAutocomplete = interaction.type === InteractionTypes.ApplicationCommandAutocomplete - const isCommandOrAutocomplete = interaction.type === InteractionTypes.ApplicationCommand || isAutocomplete + const isAutocomplete = interaction.type === InteractionTypes.ApplicationCommandAutocomplete; + const isCommandOrAutocomplete = interaction.type === InteractionTypes.ApplicationCommand || isAutocomplete; - if (!interaction.data || !isCommandOrAutocomplete) return + if (!interaction.data || !isCommandOrAutocomplete) return; - const command = bot.commands.get(interaction.data.name) + const command = bot.commands.get(interaction.data.name); if (!command) { - logCommand(interaction, 'Missing', interaction.data.name) - await interaction.respond('❌ Something went wrong. I was not able to find this command.') + logCommand(interaction, 'Missing', interaction.data.name); + await interaction.respond('❌ Something went wrong. I was not able to find this command.'); - return + return; } - logCommand(interaction, 'Trigger', interaction.data.name) + logCommand(interaction, 'Trigger', interaction.data.name); - const options = commandOptionsParser(interaction) + const options = commandOptionsParser(interaction); try { if (isAutocomplete) { - await command.autoComplete?.(interaction, options) + await command.autoComplete?.(interaction, options); } else { - await command.run(interaction, options) + await command.run(interaction, options); } - logCommand(interaction, 'Success', interaction.data.name) + logCommand(interaction, 'Success', interaction.data.name); } catch (error) { - logCommand(interaction, 'Failure', interaction.data.name, LogLevels.Error, error) - await interaction.respond('❌ Something went wrong. The command execution has thrown an error.') + logCommand(interaction, 'Failure', interaction.data.name, LogLevels.Error, error); + await interaction.respond('❌ Something went wrong. The command execution has thrown an error.'); } -} +}; function logCommand( interaction: typeof bot.transformers.$inferredTypes.interaction, @@ -42,11 +42,11 @@ function logCommand( logLevel: LogLevels = LogLevels.Info, ...restArgs: unknown[] ): void { - const typeColor = ['Failure', 'Missing'].includes(type) ? chalk.red(type) : type === 'Success' ? chalk.green(type) : chalk.white(type) + const typeColor = ['Failure', 'Missing'].includes(type) ? chalk.red(type) : type === 'Success' ? chalk.green(type) : chalk.white(type); - const autocomplete = interaction.type === InteractionTypes.ApplicationCommandAutocomplete ? ' (AutoComplete) ' : '' - const command = `Command${autocomplete}: ${chalk.bgYellow.black(commandName || 'Unknown')} - ${chalk.bgBlack(typeColor)}` - const user = chalk.bgGreen.black(`@${interaction.user.username} (${interaction.user.id})`) - const guild = chalk.bgMagenta.black(interaction.guildId ? `guildId: ${interaction.guildId}` : 'DM') - ;(bot.logger as typeof logger).log(logLevel, `${command} - By ${user} in ${guild}`, ...restArgs) + const autocomplete = interaction.type === InteractionTypes.ApplicationCommandAutocomplete ? ' (AutoComplete) ' : ''; + const command = `Command${autocomplete}: ${chalk.bgYellow.black(commandName || 'Unknown')} - ${chalk.bgBlack(typeColor)}`; + const user = chalk.bgGreen.black(`@${interaction.user.username} (${interaction.user.id})`); + const guild = chalk.bgMagenta.black(interaction.guildId ? `guildId: ${interaction.guildId}` : 'DM'); + (bot.logger as typeof logger).log(logLevel, `${command} - By ${user} in ${guild}`, ...restArgs); } diff --git a/examples/bigbot/src/bot/events/nodejs.ts b/examples/bigbot/src/bot/events/nodejs.ts index 354654ccd..e3d478ad4 100644 --- a/examples/bigbot/src/bot/events/nodejs.ts +++ b/examples/bigbot/src/bot/events/nodejs.ts @@ -1,21 +1,21 @@ -import { inspect } from 'node:util' -import { createEmbeds } from '@discordeno/bot' -import { BUGS_ERRORS_REPORT_WEBHOOK } from '../../config.js' -import { bot } from '../bot.js' -import { webhookURLToIDAndToken } from '../utils/webhook.js' +import { inspect } from 'node:util'; +import { createEmbeds } from '@discordeno/bot'; +import { BUGS_ERRORS_REPORT_WEBHOOK } from '../../config.js'; +import { bot } from '../bot.js'; +import { webhookURLToIDAndToken } from '../utils/webhook.js'; process.on('unhandledRejection', async (error) => { - bot.logger.error('An unhandled rejection occurred', error) + bot.logger.error('An unhandled rejection occurred', error); - if (!BUGS_ERRORS_REPORT_WEBHOOK || !error) return + if (!BUGS_ERRORS_REPORT_WEBHOOK || !error) return; - const { id, token } = webhookURLToIDAndToken(BUGS_ERRORS_REPORT_WEBHOOK) + const { id, token } = webhookURLToIDAndToken(BUGS_ERRORS_REPORT_WEBHOOK); - if (!id || !token) return + if (!id || !token) return; - const inspectedError = inspect(error) + const inspectedError = inspect(error); - const embeds = createEmbeds().setDescription(`\`\`\`${inspectedError}\`\`\``).setFooter('Unhandled rejection occurred').setTimestamp(Date.now()) + const embeds = createEmbeds().setDescription(`\`\`\`${inspectedError}\`\`\``).setFooter('Unhandled rejection occurred').setTimestamp(Date.now()); - await bot.helpers.executeWebhook(id, token, { embeds }) -}) + await bot.helpers.executeWebhook(id, token, { embeds }); +}); diff --git a/examples/bigbot/src/bot/fastify.ts b/examples/bigbot/src/bot/fastify.ts index 800784db1..750d1b96e 100644 --- a/examples/bigbot/src/bot/fastify.ts +++ b/examples/bigbot/src/bot/fastify.ts @@ -1,17 +1,17 @@ -import fastify, { type FastifyInstance } from 'fastify' -import { EVENT_HANDLER_AUTHORIZATION } from '../config.js' +import fastify, { type FastifyInstance } from 'fastify'; +import { EVENT_HANDLER_AUTHORIZATION } from '../config.js'; export function buildFastifyApp(): FastifyInstance { - const app = fastify() + const app = fastify(); // Authorization check app.addHook('onRequest', async (req, res) => { if (req.headers.authorization !== EVENT_HANDLER_AUTHORIZATION) { res.status(401).send({ message: 'Credentials not valid.', - }) + }); } - }) + }); - return app + return app; } diff --git a/examples/bigbot/src/bot/index.ts b/examples/bigbot/src/bot/index.ts index 9a63ee1de..4db800f2a 100644 --- a/examples/bigbot/src/bot/index.ts +++ b/examples/bigbot/src/bot/index.ts @@ -1,6 +1,6 @@ -import { join as joinPath } from 'node:path' -import type { DiscordGatewayPayload, GatewayDispatchEventNames } from '@discordeno/bot' -import { connect as connectAmqp } from 'amqplib' +import { join as joinPath } from 'node:path'; +import type { DiscordGatewayPayload, GatewayDispatchEventNames } from '@discordeno/bot'; +import { connect as connectAmqp } from 'amqplib'; import { EVENT_HANDLER_HOST, EVENT_HANDLER_PORT, @@ -8,81 +8,81 @@ import { MESSAGEQUEUE_PASSWORD, MESSAGEQUEUE_URL, MESSAGEQUEUE_USERNAME, -} from '../config.js' -import { getDirnameFromFileUrl } from '../util.js' -import { bot } from './bot.js' -import { buildFastifyApp } from './fastify.js' -import importDirectory from './utils/loader.js' +} from '../config.js'; +import { getDirnameFromFileUrl } from '../util.js'; +import { bot } from './bot.js'; +import { buildFastifyApp } from './fastify.js'; +import importDirectory from './utils/loader.js'; // The importDirectory function uses 'readdir' that requires either a relative path compared to the process CWD or an absolute one, so to get one relative we need to use import.meta.url -const currentDirectory = getDirnameFromFileUrl(import.meta.url) +const currentDirectory = getDirnameFromFileUrl(import.meta.url); -await importDirectory(joinPath(currentDirectory, './commands')) -await importDirectory(joinPath(currentDirectory, './events')) +await importDirectory(joinPath(currentDirectory, './commands')); +await importDirectory(joinPath(currentDirectory, './events')); if (MESSAGEQUEUE_ENABLE) { - await connectToRabbitMQ() + await connectToRabbitMQ(); } -const app = buildFastifyApp() +const app = buildFastifyApp(); app.get('/timecheck', async (_req, res) => { - res.status(200).send({ message: Date.now() }) -}) + res.status(200).send({ message: Date.now() }); +}); app.post('/', async (req, res) => { - const body = req.body as GatewayEvent + const body = req.body as GatewayEvent; try { - handleGatewayEvent(body.payload, body.shardId) + handleGatewayEvent(body.payload, body.shardId); - res.status(200).send() + res.status(200).send(); } catch (error) { - bot.logger.error('There was an error handling the incoming gateway command', error) - res.status(500).send() + bot.logger.error('There was an error handling the incoming gateway command', error); + res.status(500).send(); } -}) +}); await app.listen({ host: EVENT_HANDLER_HOST, port: EVENT_HANDLER_PORT, -}) +}); -bot.logger.info(`Bot event handler is listening on port ${EVENT_HANDLER_PORT}`) +bot.logger.info(`Bot event handler is listening on port ${EVENT_HANDLER_PORT}`); async function handleGatewayEvent(payload: DiscordGatewayPayload, shardId: number): Promise { - bot.events.raw?.(payload, shardId) + bot.events.raw?.(payload, shardId); // If we don't have the event type we don't process it further - if (!payload.t) return + if (!payload.t) return; // Run the dispatch check - await bot.events.dispatchRequirements?.(payload, shardId) + await bot.events.dispatchRequirements?.(payload, shardId); - bot.handlers[payload.t as GatewayDispatchEventNames]?.(bot, payload, shardId) + bot.handlers[payload.t as GatewayDispatchEventNames]?.(bot, payload, shardId); } async function connectToRabbitMQ(): Promise { const connection = await connectAmqp(`amqp://${MESSAGEQUEUE_USERNAME}:${MESSAGEQUEUE_PASSWORD}@${MESSAGEQUEUE_URL}`).catch((error) => { - bot.logger.error('Failed to connect to RabbitMQ, retrying in 1s.', error) - setTimeout(connectToRabbitMQ, 1000) - }) + bot.logger.error('Failed to connect to RabbitMQ, retrying in 1s.', error); + setTimeout(connectToRabbitMQ, 1000); + }); - if (!connection) return + if (!connection) return; connection.on('close', () => { - setTimeout(connectToRabbitMQ, 1000) - }) + setTimeout(connectToRabbitMQ, 1000); + }); connection.on('error', (error) => { - bot.logger.error('There was an error in the connection with RabbitMQ, reconnecting in 1s.', error) - setTimeout(connectToRabbitMQ, 1000) - }) + bot.logger.error('There was an error in the connection with RabbitMQ, reconnecting in 1s.', error); + setTimeout(connectToRabbitMQ, 1000); + }); const channel = await connection.createChannel().catch((error) => { - bot.logger.error('There was an error creating the RabbitMQ channel', error) - }) + bot.logger.error('There was an error creating the RabbitMQ channel', error); + }); - if (!channel) return + if (!channel) return; const exchange = await channel .assertExchange('gatewayMessage', 'x-message-deduplication', { @@ -93,31 +93,31 @@ async function connectToRabbitMQ(): Promise { }, }) .catch((error) => { - bot.logger.error('There was an error asserting the exchange', error) - }) + bot.logger.error('There was an error asserting the exchange', error); + }); - if (!exchange) return + if (!exchange) return; - await channel.assertQueue('gatewayMessageQueue').catch(bot.logger.error) - await channel.bindQueue('gatewayMessageQueue', 'gatewayMessage', '').catch(bot.logger.error) + await channel.assertQueue('gatewayMessageQueue').catch(bot.logger.error); + await channel.bindQueue('gatewayMessageQueue', 'gatewayMessage', '').catch(bot.logger.error); await channel .consume('gatewayMessageQueue', async (message) => { - if (!message) return + if (!message) return; try { - const messageBody = JSON.parse(message.content.toString()) as GatewayEvent + const messageBody = JSON.parse(message.content.toString()) as GatewayEvent; - await handleGatewayEvent(messageBody.payload, messageBody.shardId) + await handleGatewayEvent(messageBody.payload, messageBody.shardId); - channel.ack(message) + channel.ack(message); } catch (error) { - bot.logger.error('There was an error handling events received from RabbitMQ', error) + bot.logger.error('There was an error handling events received from RabbitMQ', error); } }) - .catch(bot.logger.error) + .catch(bot.logger.error); } interface GatewayEvent { - payload: DiscordGatewayPayload - shardId: number + payload: DiscordGatewayPayload; + shardId: number; } diff --git a/examples/bigbot/src/bot/register-commands.ts b/examples/bigbot/src/bot/register-commands.ts index 494fb4f56..b23e19468 100644 --- a/examples/bigbot/src/bot/register-commands.ts +++ b/examples/bigbot/src/bot/register-commands.ts @@ -1,19 +1,19 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { join as joinPath } from 'node:path' -import { getDirnameFromFileUrl } from '../util.js' -import { bot } from './bot.js' -import importDirectory from './utils/loader.js' -import { updateCommands } from './utils/updateCommands.js' +import { join as joinPath } from 'node:path'; +import { getDirnameFromFileUrl } from '../util.js'; +import { bot } from './bot.js'; +import importDirectory from './utils/loader.js'; +import { updateCommands } from './utils/updateCommands.js'; // The importDirectory function uses 'readdir' that requires either a relative path compared to the process CWD or an absolute one, so to get one relative we need to use import.meta.url -const currentDirectory = getDirnameFromFileUrl(import.meta.url) +const currentDirectory = getDirnameFromFileUrl(import.meta.url); -await importDirectory(joinPath(currentDirectory, './commands')) +await importDirectory(joinPath(currentDirectory, './commands')); -await updateCommands() +await updateCommands(); -bot.logger.info('Done!') +bot.logger.info('Done!'); // We need to manually exit as the REST Manager has timeouts that will keep NodeJS alive -process.exit() +process.exit(); diff --git a/examples/bigbot/src/bot/utils/loader.ts b/examples/bigbot/src/bot/utils/loader.ts index ff0af7113..41b5318d3 100644 --- a/examples/bigbot/src/bot/utils/loader.ts +++ b/examples/bigbot/src/bot/utils/loader.ts @@ -1,13 +1,13 @@ -import { readdir } from 'node:fs/promises' -import { bot } from '../bot.js' +import { readdir } from 'node:fs/promises'; +import { bot } from '../bot.js'; export default async function importDirectory(folder: string): Promise { - const files = await readdir(folder, { recursive: true }) + const files = await readdir(folder, { recursive: true }); for (const filename of files) { - if (!filename.endsWith('.js')) continue + if (!filename.endsWith('.js')) continue; // Using `file://` to avoid weird issues with paths on Windows - await import(`file://${folder}/${filename}`).catch((x) => bot.logger.fatal(`Cannot import file (${folder}/${filename}) for reason:`, x)) + await import(`file://${folder}/${filename}`).catch((x) => bot.logger.fatal(`Cannot import file (${folder}/${filename}) for reason:`, x)); } } diff --git a/examples/bigbot/src/bot/utils/updateCommands.ts b/examples/bigbot/src/bot/utils/updateCommands.ts index 109dc6c66..da1a2e21b 100644 --- a/examples/bigbot/src/bot/utils/updateCommands.ts +++ b/examples/bigbot/src/bot/utils/updateCommands.ts @@ -1,19 +1,19 @@ -import assert from 'node:assert' -import { DEV_SERVER_ID, DEVELOPMENT } from '../../config.js' -import { bot } from '../bot.js' +import assert from 'node:assert'; +import { DEV_SERVER_ID, DEVELOPMENT } from '../../config.js'; +import { bot } from '../bot.js'; export async function updateCommands(): Promise { - bot.logger.info('Updating commands') + bot.logger.info('Updating commands'); - const userCommands = bot.commands.filter((x) => !x.devOnly).array() - await bot.helpers.upsertGlobalApplicationCommands(userCommands) + const userCommands = bot.commands.filter((x) => !x.devOnly).array(); + await bot.helpers.upsertGlobalApplicationCommands(userCommands); if (DEVELOPMENT) { - assert(DEV_SERVER_ID, 'The DEV_SERVER_ID environment is missing') + assert(DEV_SERVER_ID, 'The DEV_SERVER_ID environment is missing'); - bot.logger.info('Updating developer commands') + bot.logger.info('Updating developer commands'); - const devCommands = bot.commands.filter((x) => x.devOnly ?? false).array() - await bot.helpers.upsertGuildApplicationCommands(DEV_SERVER_ID, devCommands) + const devCommands = bot.commands.filter((x) => x.devOnly ?? false).array(); + await bot.helpers.upsertGuildApplicationCommands(DEV_SERVER_ID, devCommands); } } diff --git a/examples/bigbot/src/bot/utils/webhook.ts b/examples/bigbot/src/bot/utils/webhook.ts index 2dea8f7f6..29ef9c9a8 100644 --- a/examples/bigbot/src/bot/utils/webhook.ts +++ b/examples/bigbot/src/bot/utils/webhook.ts @@ -1,9 +1,9 @@ /** Get the webhook id and token from a webhook url. */ export function webhookURLToIDAndToken(url: string): { id?: string; token?: string } { - const [id, token] = url.substring(url.indexOf('webhooks/') + 9).split('/') + const [id, token] = url.substring(url.indexOf('webhooks/') + 9).split('/'); return { id, token, - } + }; } diff --git a/examples/bigbot/src/config.ts b/examples/bigbot/src/config.ts index 42138fb88..c44eabe2c 100644 --- a/examples/bigbot/src/config.ts +++ b/examples/bigbot/src/config.ts @@ -1,78 +1,78 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { Intents } from '@discordeno/bot' +import { Intents } from '@discordeno/bot'; // #region Mapping of environment variables to javascript variables with some minimal parsing // General Configurations -export const DEVELOPMENT = process.env.DEVELOPMENT === 'true' -export const DEV_SERVER_ID = process.env.DEV_SERVER_ID -export const DISCORD_TOKEN = assertEnv('DISCORD_TOKEN') +export const DEVELOPMENT = process.env.DEVELOPMENT === 'true'; +export const DEV_SERVER_ID = process.env.DEV_SERVER_ID; +export const DISCORD_TOKEN = assertEnv('DISCORD_TOKEN'); // Bot Configuration -export const EVENT_HANDLER_AUTHORIZATION = assertEnv('EVENT_HANDLER_AUTHORIZATION') +export const EVENT_HANDLER_AUTHORIZATION = assertEnv('EVENT_HANDLER_AUTHORIZATION'); -export const EVENT_HANDLER_HOST = assertEnv('EVENT_HANDLER_HOST') -export const EVENT_HANDLER_PORT = parseNumber(assertEnv('EVENT_HANDLER_PORT'), 'EVENT_HANDLER_PORT') +export const EVENT_HANDLER_HOST = assertEnv('EVENT_HANDLER_HOST'); +export const EVENT_HANDLER_PORT = parseNumber(assertEnv('EVENT_HANDLER_PORT'), 'EVENT_HANDLER_PORT'); -export const BUGS_ERRORS_REPORT_WEBHOOK = process.env.BUGS_ERRORS_REPORT_WEBHOOK +export const BUGS_ERRORS_REPORT_WEBHOOK = process.env.BUGS_ERRORS_REPORT_WEBHOOK; // Rest Proxy Configurations -export const REST_AUTHORIZATION = assertEnv('REST_AUTHORIZATION') -export const REST_HOST = assertEnv('REST_HOST') -export const REST_PORT = parseNumber(assertEnv('REST_PORT'), 'REST_PORT') +export const REST_AUTHORIZATION = assertEnv('REST_AUTHORIZATION'); +export const REST_HOST = assertEnv('REST_HOST'); +export const REST_PORT = parseNumber(assertEnv('REST_PORT'), 'REST_PORT'); // Gateway Proxy Configurations -export const TOTAL_SHARDS = process.env.TOTAL_SHARDS ? parseNumber(process.env.TOTAL_SHARDS, 'TOTAL_SHARDS') : undefined -export const SHARDS_PER_WORKER = parseNumber(process.env.SHARDS_PER_WORKER ?? '16', 'SHARDS_PER_WORKER') -export const TOTAL_WORKERS = parseNumber(process.env.TOTAL_WORKERS ?? '4', 'TOTAL_WORKERS') +export const TOTAL_SHARDS = process.env.TOTAL_SHARDS ? parseNumber(process.env.TOTAL_SHARDS, 'TOTAL_SHARDS') : undefined; +export const SHARDS_PER_WORKER = parseNumber(process.env.SHARDS_PER_WORKER ?? '16', 'SHARDS_PER_WORKER'); +export const TOTAL_WORKERS = parseNumber(process.env.TOTAL_WORKERS ?? '4', 'TOTAL_WORKERS'); -export const GATEWAY_AUTHORIZATION = assertEnv('GATEWAY_AUTHORIZATION') -export const GATEWAY_HOST = assertEnv('GATEWAY_HOST') -export const GATEWAY_PORT = parseNumber(assertEnv('GATEWAY_PORT'), 'GATEWAY_PORT') +export const GATEWAY_AUTHORIZATION = assertEnv('GATEWAY_AUTHORIZATION'); +export const GATEWAY_HOST = assertEnv('GATEWAY_HOST'); +export const GATEWAY_PORT = parseNumber(assertEnv('GATEWAY_PORT'), 'GATEWAY_PORT'); // Message queue (RabbitMQ configuration) -export const MESSAGEQUEUE_ENABLE = process.env.MESSAGEQUEUE_ENABLE === 'true' +export const MESSAGEQUEUE_ENABLE = process.env.MESSAGEQUEUE_ENABLE === 'true'; -export const MESSAGEQUEUE_URL = process.env.MESSAGEQUEUE_URL -export const MESSAGEQUEUE_USERNAME = process.env.MESSAGEQUEUE_USERNAME -export const MESSAGEQUEUE_PASSWORD = process.env.MESSAGEQUEUE_PASSWORD +export const MESSAGEQUEUE_URL = process.env.MESSAGEQUEUE_URL; +export const MESSAGEQUEUE_USERNAME = process.env.MESSAGEQUEUE_USERNAME; +export const MESSAGEQUEUE_PASSWORD = process.env.MESSAGEQUEUE_PASSWORD; // Analytics (InfluxDB configuration) -export const INFLUX_ORG = process.env.INFLUX_ORG -export const INFLUX_BUCKET = process.env.INFLUX_BUCKET -export const INFLUX_TOKEN = process.env.INFLUX_TOKEN -export const INFLUX_URL = process.env.INFLUX_URL +export const INFLUX_ORG = process.env.INFLUX_ORG; +export const INFLUX_BUCKET = process.env.INFLUX_BUCKET; +export const INFLUX_TOKEN = process.env.INFLUX_TOKEN; +export const INFLUX_URL = process.env.INFLUX_URL; -export const INFLUX_ENABLED = INFLUX_URL && INFLUX_TOKEN && INFLUX_ORG && INFLUX_BUCKET +export const INFLUX_ENABLED = INFLUX_URL && INFLUX_TOKEN && INFLUX_ORG && INFLUX_BUCKET; // #endregion -export const EVENT_HANDLER_URL = `http://${EVENT_HANDLER_HOST}:${EVENT_HANDLER_PORT}` -export const REST_URL = `http://${REST_HOST}:${REST_PORT}` -export const GATEWAY_URL = `http://${GATEWAY_HOST}:${GATEWAY_PORT}` +export const EVENT_HANDLER_URL = `http://${EVENT_HANDLER_HOST}:${EVENT_HANDLER_PORT}`; +export const REST_URL = `http://${REST_HOST}:${REST_PORT}`; +export const GATEWAY_URL = `http://${GATEWAY_HOST}:${GATEWAY_PORT}`; // TEMPLATE-SETUP: Add/Remove the intents you need/don't need -export const GATEWAY_INTENTS = Intents.Guilds | Intents.GuildMessages +export const GATEWAY_INTENTS = Intents.Guilds | Intents.GuildMessages; // Helper functions function assertEnv(env: string): string { - if (process.env[env]) return process.env[env] + if (process.env[env]) return process.env[env]; - throw new TypeError(`The '${env}' environment variable must be set`) + throw new TypeError(`The '${env}' environment variable must be set`); } function parseNumber(envValue: string, env: string): number { - const parsed = Number.parseInt(envValue) + const parsed = Number.parseInt(envValue); - if (Number.isFinite(parsed)) return parsed + if (Number.isFinite(parsed)) return parsed; - throw new TypeError(`The '${env}' environment variable must be a number`) + throw new TypeError(`The '${env}' environment variable must be a number`); } diff --git a/examples/bigbot/src/gateway/fastify.ts b/examples/bigbot/src/gateway/fastify.ts index 35e6aa159..7c21c0b5b 100644 --- a/examples/bigbot/src/gateway/fastify.ts +++ b/examples/bigbot/src/gateway/fastify.ts @@ -1,17 +1,17 @@ -import fastify, { type FastifyInstance } from 'fastify' -import { GATEWAY_AUTHORIZATION } from '../config.js' +import fastify, { type FastifyInstance } from 'fastify'; +import { GATEWAY_AUTHORIZATION } from '../config.js'; export function buildFastifyApp(): FastifyInstance { - const app = fastify() + const app = fastify(); // Authorization check app.addHook('onRequest', async (req, res) => { if (req.headers.authorization !== GATEWAY_AUTHORIZATION) { res.status(401).send({ message: 'Credentials not valid.', - }) + }); } - }) + }); - return app + return app; } diff --git a/examples/bigbot/src/gateway/gatewayManager.ts b/examples/bigbot/src/gateway/gatewayManager.ts index fb57c2b31..6ba188729 100644 --- a/examples/bigbot/src/gateway/gatewayManager.ts +++ b/examples/bigbot/src/gateway/gatewayManager.ts @@ -1,12 +1,12 @@ -import type { Worker } from 'node:worker_threads' -import { createGatewayManager, createLogger, createRestManager } from '@discordeno/bot' -import { DISCORD_TOKEN, GATEWAY_INTENTS, REST_AUTHORIZATION, REST_URL, SHARDS_PER_WORKER, TOTAL_SHARDS, TOTAL_WORKERS } from '../config.js' -import { promiseWithResolvers } from '../util.js' -import { createWorker } from './worker/createWorker.js' -import type { ManagerMessage, WorkerMessage } from './worker/types.js' +import type { Worker } from 'node:worker_threads'; +import { createGatewayManager, createLogger, createRestManager } from '@discordeno/bot'; +import { DISCORD_TOKEN, GATEWAY_INTENTS, REST_AUTHORIZATION, REST_URL, SHARDS_PER_WORKER, TOTAL_SHARDS, TOTAL_WORKERS } from '../config.js'; +import { promiseWithResolvers } from '../util.js'; +import { createWorker } from './worker/createWorker.js'; +import type { ManagerMessage, WorkerMessage } from './worker/types.js'; -export const workers = new Map() -export const logger = createLogger({ name: 'GATEWAY' }) +export const workers = new Map(); +export const logger = createLogger({ name: 'GATEWAY' }); const restManager = createRestManager({ token: DISCORD_TOKEN, @@ -14,9 +14,9 @@ const restManager = createRestManager({ baseUrl: REST_URL, authorization: REST_AUTHORIZATION, }, -}) +}); -const gatewayBotConfig = await restManager.getGatewayBot() +const gatewayBotConfig = await restManager.getGatewayBot(); const gatewayManager = createGatewayManager({ token: DISCORD_TOKEN, @@ -28,96 +28,96 @@ const gatewayManager = createGatewayManager({ resharding: { getSessionInfo: restManager.getGatewayBot, }, -}) +}); gatewayManager.resharding.tellWorkerToPrepare = async (workerId, shardId, bucketId) => { - logger.info(`Tell worker to prepare, workerId: ${workerId}, shardId: ${shardId}, bucketId: ${bucketId}`) + logger.info(`Tell worker to prepare, workerId: ${workerId}, shardId: ${shardId}, bucketId: ${bucketId}`); - let worker = workers.get(workerId) + let worker = workers.get(workerId); if (!worker) { - worker = createWorker(workerId) - workers.set(workerId, worker) + worker = createWorker(workerId); + workers.set(workerId, worker); } worker.postMessage({ type: 'PrepareShard', shardId, totalShards: gatewayManager.totalShards, - } satisfies WorkerMessage) + } satisfies WorkerMessage); - const { promise, resolve } = promiseWithResolvers() + const { promise, resolve } = promiseWithResolvers(); const waitForShardPrepared = (message: ManagerMessage) => { if (message.type === 'ShardPrepared' && message.shardId === shardId) { - resolve() + resolve(); } - } + }; - worker.on('message', waitForShardPrepared) + worker.on('message', waitForShardPrepared); - await promise + await promise; - worker.off('message', waitForShardPrepared) -} + worker.off('message', waitForShardPrepared); +}; gatewayManager.resharding.onReshardingSwitch = async () => { - logger.info('Resharding switch triggered, telling workers to switch the shards') + logger.info('Resharding switch triggered, telling workers to switch the shards'); for (const worker of workers.values()) { worker.postMessage({ type: 'SwitchShards', - } satisfies WorkerMessage) + } satisfies WorkerMessage); } -} +}; gatewayManager.tellWorkerToIdentify = async (workerId, shardId, bucketId) => { - logger.info(`Tell worker to identify, workerId: ${workerId}, shardId: ${shardId}, bucketId: ${bucketId}`) + logger.info(`Tell worker to identify, workerId: ${workerId}, shardId: ${shardId}, bucketId: ${bucketId}`); - const worker = workers.get(workerId) ?? createWorker(workerId) - workers.set(workerId, worker) + const worker = workers.get(workerId) ?? createWorker(workerId); + workers.set(workerId, worker); worker.postMessage({ type: 'IdentifyShard', shardId, - } satisfies WorkerMessage) + } satisfies WorkerMessage); - const { promise, resolve } = promiseWithResolvers() + const { promise, resolve } = promiseWithResolvers(); const waitForShardIdentified = (message: ManagerMessage) => { if (message.type === 'ShardIdentified' && message.shardId === shardId) { - resolve() + resolve(); } - } + }; - worker.on('message', waitForShardIdentified) + worker.on('message', waitForShardIdentified); - await promise + await promise; - worker.off('message', waitForShardIdentified) -} + worker.off('message', waitForShardIdentified); +}; gatewayManager.sendPayload = async (shardId, payload) => { - const workerId = gatewayManager.calculateWorkerId(shardId) - const worker = workers.get(workerId) + const workerId = gatewayManager.calculateWorkerId(shardId); + const worker = workers.get(workerId); - if (!worker) return + if (!worker) return; worker.postMessage({ type: 'ShardPayload', shardId, payload, - } satisfies WorkerMessage) -} + } satisfies WorkerMessage); +}; gatewayManager.editBotStatus = async (payload) => { - const workersArray = Array.from(workers.values()) + const workersArray = Array.from(workers.values()); for (const worker of workersArray) { worker.postMessage({ type: 'EditShardsPresence', payload, - } satisfies WorkerMessage) + } satisfies WorkerMessage); } -} +}; -export default gatewayManager +export default gatewayManager; diff --git a/examples/bigbot/src/gateway/index.ts b/examples/bigbot/src/gateway/index.ts index d81def825..fb4feb141 100644 --- a/examples/bigbot/src/gateway/index.ts +++ b/examples/bigbot/src/gateway/index.ts @@ -1,72 +1,72 @@ -import { GATEWAY_HOST, GATEWAY_PORT } from '../config.js' -import { promiseWithResolvers } from '../util.js' -import { buildFastifyApp } from './fastify.js' -import gatewayManager, { logger, workers } from './gatewayManager.js' -import { shardInfoRequests } from './worker/createWorker.js' -import type { ManagerGetShardInfoFromGuildId, ShardInfo, WorkerMessage, WorkerPresencesUpdate, WorkerShardPayload } from './worker/types.js' +import { GATEWAY_HOST, GATEWAY_PORT } from '../config.js'; +import { promiseWithResolvers } from '../util.js'; +import { buildFastifyApp } from './fastify.js'; +import gatewayManager, { logger, workers } from './gatewayManager.js'; +import { shardInfoRequests } from './worker/createWorker.js'; +import type { ManagerGetShardInfoFromGuildId, ShardInfo, WorkerMessage, WorkerPresencesUpdate, WorkerShardPayload } from './worker/types.js'; -const app = buildFastifyApp() +const app = buildFastifyApp(); app.get('/timecheck', (_req, res) => { - res.status(200).send({ message: Date.now() }) -}) + res.status(200).send({ message: Date.now() }); +}); app.post('/', async (req, res) => { if (!req.body) { - res.status(400).send({ message: 'Invalid body' }) - return + res.status(400).send({ message: 'Invalid body' }); + return; } - const data = req.body as WorkerShardPayload | WorkerPresencesUpdate | ManagerGetShardInfoFromGuildId + const data = req.body as WorkerShardPayload | WorkerPresencesUpdate | ManagerGetShardInfoFromGuildId; if (data.type === 'ShardPayload') { - await gatewayManager.sendPayload(data.shardId, data.payload) - return + await gatewayManager.sendPayload(data.shardId, data.payload); + return; } if (data.type === 'EditShardsPresence') { - await gatewayManager.editBotStatus(data.payload) - return + await gatewayManager.editBotStatus(data.payload); + return; } if (data.type === 'ShardInfoFromGuild') { // If we don't have a guildId, we use shard 0 - const shardId = data.guildId ? gatewayManager.calculateShardId(data.guildId) : 0 - const workerId = gatewayManager.calculateWorkerId(shardId) - const worker = workers.get(workerId) + const shardId = data.guildId ? gatewayManager.calculateShardId(data.guildId) : 0; + const workerId = gatewayManager.calculateWorkerId(shardId); + const worker = workers.get(workerId); if (!worker) { - await res.status(400).send({ error: `worker for shard ${shardId} not found` }) - return + await res.status(400).send({ error: `worker for shard ${shardId} not found` }); + return; } - const nonce = crypto.randomUUID() + const nonce = crypto.randomUUID(); - const { promise, resolve } = promiseWithResolvers() + const { promise, resolve } = promiseWithResolvers(); - shardInfoRequests.set(nonce, resolve) + shardInfoRequests.set(nonce, resolve); worker.postMessage({ type: 'GetShardInfo', shardId, nonce, - } satisfies WorkerMessage) + } satisfies WorkerMessage); - const shardInfo = await promise + const shardInfo = await promise; await res.status(200).send({ shardId: shardInfo.shardId, rtt: shardInfo.rtt, - } satisfies Omit) - return + } satisfies Omit); + return; } - logger.warn(`Manager - Received unknown data type: ${(data as { type: string }).type}`) -}) + logger.warn(`Manager - Received unknown data type: ${(data as { type: string }).type}`); +}); await app.listen({ host: GATEWAY_HOST, port: GATEWAY_PORT, -}) +}); -logger.info(`Gateway manager listening on port ${GATEWAY_PORT}`) +logger.info(`Gateway manager listening on port ${GATEWAY_PORT}`); -await gatewayManager.spawnShards() +await gatewayManager.spawnShards(); diff --git a/examples/bigbot/src/gateway/worker/createWorker.ts b/examples/bigbot/src/gateway/worker/createWorker.ts index 28055914b..5ac012051 100644 --- a/examples/bigbot/src/gateway/worker/createWorker.ts +++ b/examples/bigbot/src/gateway/worker/createWorker.ts @@ -1,5 +1,5 @@ -import { join as joinPath } from 'node:path' -import { Worker } from 'node:worker_threads' +import { join as joinPath } from 'node:path'; +import { Worker } from 'node:worker_threads'; import { DISCORD_TOKEN, EVENT_HANDLER_AUTHORIZATION, @@ -9,18 +9,18 @@ import { MESSAGEQUEUE_PASSWORD, MESSAGEQUEUE_URL, MESSAGEQUEUE_USERNAME, -} from '../../config.js' -import { getDirnameFromFileUrl } from '../../util.js' -import gatewayManager, { logger } from '../gatewayManager.js' -import type { ManagerMessage, ShardInfo, WorkerCreateData, WorkerMessage } from './types.js' +} from '../../config.js'; +import { getDirnameFromFileUrl } from '../../util.js'; +import gatewayManager, { logger } from '../gatewayManager.js'; +import type { ManagerMessage, ShardInfo, WorkerCreateData, WorkerMessage } from './types.js'; // the string is the nonce of the request -export const shardInfoRequests = new Map void>() +export const shardInfoRequests = new Map void>(); export function createWorker(workerId: number): Worker { // the Worker constructor requires either a relative path compared to the process CWD or an absolute one, so to get one relative we need to use import.meta.url - const currentFolder = getDirnameFromFileUrl(import.meta.url) - const workerFilePath = joinPath(currentFolder, './worker.js') + const currentFolder = getDirnameFromFileUrl(import.meta.url); + const workerFilePath = joinPath(currentFolder, './worker.js'); const worker = new Worker(workerFilePath, { workerData: { @@ -43,32 +43,32 @@ export function createWorker(workerId: number): Worker { url: MESSAGEQUEUE_URL, }, } satisfies WorkerCreateData, - }) + }); worker.on('message', async (message: ManagerMessage) => { if (message.type === 'RequestIdentify') { - logger.info(`Requesting identify for shardId: #${message.shardId}`) - await gatewayManager.requestIdentify(message.shardId) + logger.info(`Requesting identify for shardId: #${message.shardId}`); + await gatewayManager.requestIdentify(message.shardId); worker.postMessage({ type: 'AllowIdentify', shardId: message.shardId, - } satisfies WorkerMessage) + } satisfies WorkerMessage); - return + return; } if (message.type === 'ShardInfo') { - shardInfoRequests.get(message.nonce)?.(message) - shardInfoRequests.delete(message.nonce) - return + shardInfoRequests.get(message.nonce)?.(message); + shardInfoRequests.delete(message.nonce); + return; } if (message.type === 'ShardIdentified') { - logger.info(`Shard #${message.shardId} identified`) - return + logger.info(`Shard #${message.shardId} identified`); + return; } - logger.warn(`Worker - Received unknown message type: ${(message as { type: string }).type}`) - }) + logger.warn(`Worker - Received unknown message type: ${(message as { type: string }).type}`); + }); - return worker + return worker; } diff --git a/examples/bigbot/src/gateway/worker/types.ts b/examples/bigbot/src/gateway/worker/types.ts index fa9c46141..7fdb532ef 100644 --- a/examples/bigbot/src/gateway/worker/types.ts +++ b/examples/bigbot/src/gateway/worker/types.ts @@ -1,6 +1,6 @@ -import type { DiscordUpdatePresence, ShardSocketRequest } from '@discordeno/bot' +import type { DiscordUpdatePresence, ShardSocketRequest } from '@discordeno/bot'; -export type ManagerMessage = ManagerRequestIdentify | ManagerShardIdentified | ManagerShardPrepared | ManagerShardInfo +export type ManagerMessage = ManagerRequestIdentify | ManagerShardIdentified | ManagerShardPrepared | ManagerShardInfo; export type WorkerMessage = | WorkerIdentifyShard | WorkerPrepareShard @@ -8,93 +8,93 @@ export type WorkerMessage = | WorkerAllowIdentify | WorkerShardPayload | WorkerPresencesUpdate - | WorkerShardInfo + | WorkerShardInfo; export interface WorkerIdentifyShard { - type: 'IdentifyShard' - shardId: number + type: 'IdentifyShard'; + shardId: number; } export interface WorkerPrepareShard { - type: 'PrepareShard' - shardId: number - totalShards: number + type: 'PrepareShard'; + shardId: number; + totalShards: number; } export interface WorkerSwitchShards { - type: 'SwitchShards' + type: 'SwitchShards'; } export interface WorkerAllowIdentify { - type: 'AllowIdentify' - shardId: number + type: 'AllowIdentify'; + shardId: number; } export interface ManagerRequestIdentify { - type: 'RequestIdentify' - shardId: number + type: 'RequestIdentify'; + shardId: number; } export interface WorkerShardPayload { - type: 'ShardPayload' - shardId: number - payload: ShardSocketRequest + type: 'ShardPayload'; + shardId: number; + payload: ShardSocketRequest; } export interface WorkerPresencesUpdate { - type: 'EditShardsPresence' - payload: DiscordUpdatePresence + type: 'EditShardsPresence'; + payload: DiscordUpdatePresence; } export interface WorkerShardInfo { - type: 'GetShardInfo' - shardId: number - nonce: string + type: 'GetShardInfo'; + shardId: number; + nonce: string; } export interface WorkerCreateData { connectionData: { - intents: number - token: string - url: string - version: number - totalShards: number - } + intents: number; + token: string; + url: string; + version: number; + totalShards: number; + }; eventHandler: { - urls: string[] - authentication: string - } - workerId: number + urls: string[]; + authentication: string; + }; + workerId: number; messageQueue: { - enabled: boolean - username?: string - password?: string - url?: string - } + enabled: boolean; + username?: string; + password?: string; + url?: string; + }; } export interface ShardInfo { - shardId: number - rtt: number + shardId: number; + rtt: number; // the nonce is to bind to the request - nonce: string + nonce: string; } export interface ManagerShardInfo extends ShardInfo { - type: 'ShardInfo' + type: 'ShardInfo'; } export interface ManagerGetShardInfoFromGuildId { - type: 'ShardInfoFromGuild' - guildId: string | undefined + type: 'ShardInfoFromGuild'; + guildId: string | undefined; } export interface ManagerShardIdentified { - type: 'ShardIdentified' - shardId: number + type: 'ShardIdentified'; + shardId: number; } export interface ManagerShardPrepared { - type: 'ShardPrepared' - shardId: number + type: 'ShardPrepared'; + shardId: number; } diff --git a/examples/bigbot/src/gateway/worker/worker.ts b/examples/bigbot/src/gateway/worker/worker.ts index 43f85e312..ee6ea5818 100644 --- a/examples/bigbot/src/gateway/worker/worker.ts +++ b/examples/bigbot/src/gateway/worker/worker.ts @@ -1,125 +1,125 @@ -import assert from 'node:assert' -import { createHash } from 'node:crypto' -import { workerData as _workerData, parentPort } from 'node:worker_threads' -import { type Camelize, createLogger, DiscordenoShard, type DiscordGatewayPayload, GatewayOpcodes, ShardSocketCloseCodes } from '@discordeno/bot' -import { type Channel as amqpChannel, connect as connectAmqp } from 'amqplib' -import { promiseWithResolvers } from '../../util.js' -import type { ManagerMessage, WorkerCreateData, WorkerMessage } from './types.js' +import assert from 'node:assert'; +import { createHash } from 'node:crypto'; +import { workerData as _workerData, parentPort } from 'node:worker_threads'; +import { type Camelize, createLogger, DiscordenoShard, type DiscordGatewayPayload, GatewayOpcodes, ShardSocketCloseCodes } from '@discordeno/bot'; +import { type Channel as amqpChannel, connect as connectAmqp } from 'amqplib'; +import { promiseWithResolvers } from '../../util.js'; +import type { ManagerMessage, WorkerCreateData, WorkerMessage } from './types.js'; -assert(parentPort) +assert(parentPort); -const workerData: WorkerCreateData = _workerData +const workerData: WorkerCreateData = _workerData; -const logger = createLogger({ name: `Worker #${workerData.workerId}` }) +const logger = createLogger({ name: `Worker #${workerData.workerId}` }); -const identifyPromises = new Map void>() -const shards = new Map() -const pendingShards = new Map() +const identifyPromises = new Map void>(); +const shards = new Map(); +const pendingShards = new Map(); -let totalShards = workerData.connectionData.totalShards +let totalShards = workerData.connectionData.totalShards; -let rabbitMQChannel: amqpChannel | undefined +let rabbitMQChannel: amqpChannel | undefined; if (workerData.messageQueue.enabled) { - await connectToRabbitMQ() + await connectToRabbitMQ(); } parentPort.on('message', async (message: WorkerMessage) => { - assert(parentPort) + assert(parentPort); if (message.type === 'IdentifyShard') { - logger.info(`Starting to identify shard #${message.shardId}`) - const shard = shards.get(message.shardId) ?? createShard(message.shardId) - shards.set(message.shardId, shard) + logger.info(`Starting to identify shard #${message.shardId}`); + const shard = shards.get(message.shardId) ?? createShard(message.shardId); + shards.set(message.shardId, shard); - await shard.identify() + await shard.identify(); parentPort.postMessage({ type: 'ShardIdentified', shardId: message.shardId, - } satisfies ManagerMessage) + } satisfies ManagerMessage); - return + return; } if (message.type === 'PrepareShard') { - logger.info(`Preparing shard #${message.shardId}`) - totalShards = message.totalShards - let shard = pendingShards.get(message.shardId) + logger.info(`Preparing shard #${message.shardId}`); + totalShards = message.totalShards; + let shard = pendingShards.get(message.shardId); if (!shard) { - shard = createShard(message.shardId) - pendingShards.set(message.shardId, shard) + shard = createShard(message.shardId); + pendingShards.set(message.shardId, shard); } // Ignore the events // TODO: If you need 'gateway.resharding.updateGuildsShardId' it you can listen to only the ready event and use the data from that event for the function call - shard.events.message = () => {} + shard.events.message = () => {}; - await shard.identify() + await shard.identify(); parentPort.postMessage({ type: 'ShardPrepared', shardId: message.shardId, - } satisfies ManagerMessage) + } satisfies ManagerMessage); - return + return; } if (message.type === 'SwitchShards') { - logger.info('Switching shards') + logger.info('Switching shards'); // Change the message event for all shards for (const shard of pendingShards.values()) { - shard.events.message = handleShardMessageEvent + shard.events.message = handleShardMessageEvent; } // Old shards stop processing events for (const shard of shards.values()) { - const oldHandler = shard.events.message + const oldHandler = shard.events.message; shard.events.message = async function (_, message) { // Member checks need to continue but others can stop if (message.t === 'GUILD_MEMBERS_CHUNK') { - oldHandler?.(shard, message) + oldHandler?.(shard, message); } - } + }; } // Shutdown the old shards - const shardsToShutdown = Array.from(shards.values()) + const shardsToShutdown = Array.from(shards.values()); // Move the pending shards to the active shards - shards.clear() + shards.clear(); for (const [shardId, shard] of pendingShards.entries()) { - shards.set(shardId, shard) - pendingShards.delete(shardId) + shards.set(shardId, shard); + pendingShards.delete(shardId); } // Shutdown the old shards const promises = shardsToShutdown.map(async (shard) => { - await shard.close(ShardSocketCloseCodes.Resharded, 'Shard is being resharded') - logger.info(`Shard #${shard.id} has been shutdown`) - }) + await shard.close(ShardSocketCloseCodes.Resharded, 'Shard is being resharded'); + logger.info(`Shard #${shard.id} has been shutdown`); + }); - await Promise.all(promises) + await Promise.all(promises); - return + return; } if (message.type === 'AllowIdentify') { - identifyPromises.get(message.shardId)?.() - identifyPromises.delete(message.shardId) + identifyPromises.get(message.shardId)?.(); + identifyPromises.delete(message.shardId); - return + return; } if (message.type === 'ShardPayload') { - const shard = shards.get(message.shardId) + const shard = shards.get(message.shardId); - if (!shard) return + if (!shard) return; - await shard.send(message.payload) + await shard.send(message.payload); - return + return; } if (message.type === 'EditShardsPresence') { - const shardsArray = Array.from(shards.values()) + const shardsArray = Array.from(shards.values()); const promises = shardsArray.map(async (shard) => { await shard.send({ op: GatewayOpcodes.PresenceUpdate, @@ -129,11 +129,11 @@ parentPort.on('message', async (message: WorkerMessage) => { activities: message.payload.activities, status: message.payload.status, }, - }) - }) + }); + }); - await Promise.all(promises) - return + await Promise.all(promises); + return; } if (message.type === 'GetShardInfo') { const status = { @@ -141,15 +141,15 @@ parentPort.on('message', async (message: WorkerMessage) => { shardId: message.shardId, rtt: shards.get(message.shardId)?.heart.rtt ?? -1, nonce: message.nonce, - } satisfies ManagerMessage + } satisfies ManagerMessage; - parentPort?.postMessage(status) + parentPort?.postMessage(status); - return + return; } - logger.warn(`Received unknown message type: ${(message as { type: string }).type}`) -}) + logger.warn(`Received unknown message type: ${(message as { type: string }).type}`); +}); function createShard(shardId: number): DiscordenoShard { const shard = new DiscordenoShard({ @@ -169,62 +169,62 @@ function createShard(shardId: number): DiscordenoShard { version: workerData.connectionData.version, transportCompression: null, }, - }) + }); shard.requestIdentify = async () => { - assert(parentPort) + assert(parentPort); - const { promise, resolve } = promiseWithResolvers() + const { promise, resolve } = promiseWithResolvers(); parentPort.postMessage({ type: 'RequestIdentify', shardId, - } satisfies ManagerMessage) + } satisfies ManagerMessage); - identifyPromises.set(shardId, resolve) + identifyPromises.set(shardId, resolve); - return await promise - } + return await promise; + }; // We do not want to camelize the packet, so we need to override the function as the default behavior is to camelize shard.forwardToBot = (packet) => { - shard.events.message?.(shard, packet) - } + shard.events.message?.(shard, packet); + }; - shard.events.message = handleShardMessageEvent + shard.events.message = handleShardMessageEvent; - return shard + return shard; } async function handleShardMessageEvent(shard: DiscordenoShard, payload: Camelize) { - const body = JSON.stringify({ payload, shardId: shard.id }) + const body = JSON.stringify({ payload, shardId: shard.id }); if (workerData.messageQueue.enabled) { if (!rabbitMQChannel) { - logger.error('The RabbitMQ channel has not been created. The event will be lost') - return + logger.error('The RabbitMQ channel has not been created. The event will be lost'); + return; } - const message = Buffer.from(body) - const discordData = JSON.stringify(payload.d) + const message = Buffer.from(body); + const discordData = JSON.stringify(payload.d); - const deduplicationHash = createHash('sha1') - deduplicationHash.update(discordData) + const deduplicationHash = createHash('sha1'); + deduplicationHash.update(discordData); rabbitMQChannel.publish('gatewayMessage', '', message, { contentType: 'application/json', headers: { 'x-deduplication-header': deduplicationHash.digest('hex'), }, - }) + }); - return + return; } - const url = workerData.eventHandler.urls[shard.id % workerData.eventHandler.urls.length] + const url = workerData.eventHandler.urls[shard.id % workerData.eventHandler.urls.length]; if (!url) { - logger.error('No url found to send events to') - return + logger.error('No url found to send events to'); + return; } await fetch(url, { @@ -234,35 +234,35 @@ async function handleShardMessageEvent(shard: DiscordenoShard, payload: Camelize 'Content-Type': 'application/json', Authorization: workerData.eventHandler.authentication, }, - }).catch((error) => logger.error('Failed to send events to the bot code', error)) + }).catch((error) => logger.error('Failed to send events to the bot code', error)); } async function connectToRabbitMQ(): Promise { - rabbitMQChannel = undefined - const messageQueue = workerData.messageQueue + rabbitMQChannel = undefined; + const messageQueue = workerData.messageQueue; const connection = await connectAmqp(`amqp://${messageQueue.username}:${messageQueue.password}@${messageQueue.url}`).catch((error) => { - logger.error('Failed to connect to RabbitMQ, retrying in 1s.', error) - setTimeout(connectToRabbitMQ, 1000) - }) + logger.error('Failed to connect to RabbitMQ, retrying in 1s.', error); + setTimeout(connectToRabbitMQ, 1000); + }); - if (!connection) return + if (!connection) return; connection.on('close', () => { - rabbitMQChannel = undefined - setTimeout(connectToRabbitMQ, 1000) - }) + rabbitMQChannel = undefined; + setTimeout(connectToRabbitMQ, 1000); + }); connection.on('error', (error) => { - rabbitMQChannel = undefined - logger.error('There was an error in the connection with RabbitMQ, reconnecting in 1s.', error) - setTimeout(connectToRabbitMQ, 1000) - }) + rabbitMQChannel = undefined; + logger.error('There was an error in the connection with RabbitMQ, reconnecting in 1s.', error); + setTimeout(connectToRabbitMQ, 1000); + }); const channel = await connection.createChannel().catch((error) => { - logger.error('There was an error creating the RabbitMQ channel', error) - }) + logger.error('There was an error creating the RabbitMQ channel', error); + }); - if (!channel) return + if (!channel) return; const exchange = await channel .assertExchange('gatewayMessage', 'x-message-deduplication', { @@ -273,10 +273,10 @@ async function connectToRabbitMQ(): Promise { }, }) .catch((error) => { - logger.error('There was an error asserting the exchange', error) - }) + logger.error('There was an error asserting the exchange', error); + }); - if (!exchange) return + if (!exchange) return; - rabbitMQChannel = channel + rabbitMQChannel = channel; } diff --git a/examples/bigbot/src/rest/fastify.ts b/examples/bigbot/src/rest/fastify.ts index b377ddd20..02a9c1fe1 100644 --- a/examples/bigbot/src/rest/fastify.ts +++ b/examples/bigbot/src/rest/fastify.ts @@ -1,39 +1,39 @@ -import fastifyMultipart, { type MultipartFile, type MultipartValue } from '@fastify/multipart' -import fastify, { type FastifyInstance } from 'fastify' -import { REST_AUTHORIZATION } from '../config.js' +import fastifyMultipart, { type MultipartFile, type MultipartValue } from '@fastify/multipart'; +import fastify, { type FastifyInstance } from 'fastify'; +import { REST_AUTHORIZATION } from '../config.js'; export function buildFastifyApp(): FastifyInstance { - const app = fastify() + const app = fastify(); - app.register(fastifyMultipart, { attachFieldsToBody: true }) + app.register(fastifyMultipart, { attachFieldsToBody: true }); // Authorization check app.addHook('onRequest', async (req, res) => { if (req.headers.authorization !== REST_AUTHORIZATION) { res.status(401).send({ message: 'Credentials not valid.', - }) + }); } - }) + }); - return app + return app; } export async function parseMultiformBody(body: unknown): Promise { - const form = new FormData() + const form = new FormData(); - if (typeof body !== 'object' || !body) return form + if (typeof body !== 'object' || !body) return form; for (const objectValue of Object.values(body)) { - const value = objectValue as MultipartFile | MultipartValue + const value = objectValue as MultipartFile | MultipartValue; if (value.type === 'file') { - form.append(value.fieldname, new Blob([await value.toBuffer()]), value.filename) + form.append(value.fieldname, new Blob([await value.toBuffer()]), value.filename); } if (value.type === 'field' && typeof value.value === 'string') { - form.append(value.fieldname, value.value) + form.append(value.fieldname, value.value); } } - return form + return form; } diff --git a/examples/bigbot/src/rest/index.ts b/examples/bigbot/src/rest/index.ts index 50696f958..a58a74d4d 100644 --- a/examples/bigbot/src/rest/index.ts +++ b/examples/bigbot/src/rest/index.ts @@ -1,48 +1,48 @@ -import type { RequestMethods } from '@discordeno/bot' -import { REST_HOST, REST_PORT } from '../config.js' -import { buildFastifyApp, parseMultiformBody } from './fastify.js' -import restManager, { logger } from './restManager.js' +import type { RequestMethods } from '@discordeno/bot'; +import { REST_HOST, REST_PORT } from '../config.js'; +import { buildFastifyApp, parseMultiformBody } from './fastify.js'; +import restManager, { logger } from './restManager.js'; -const app = buildFastifyApp() +const app = buildFastifyApp(); app.get('/timecheck', async (_req, res) => { - res.status(200).send({ message: Date.now() }) -}) + res.status(200).send({ message: Date.now() }); +}); app.all('/*', async (req, res) => { - let url = req.originalUrl + let url = req.originalUrl; if (url.startsWith('/v')) { - url = url.slice(url.indexOf('/', 2)) + url = url.slice(url.indexOf('/', 2)); } - const isMultipart = req.headers['content-type']?.startsWith('multipart/form-data') - const hasBody = req.method !== 'GET' && req.method !== 'DELETE' - const body = hasBody ? (isMultipart ? await parseMultiformBody(req.body) : req.body) : undefined + const isMultipart = req.headers['content-type']?.startsWith('multipart/form-data'); + const hasBody = req.method !== 'GET' && req.method !== 'DELETE'; + const body = hasBody ? (isMultipart ? await parseMultiformBody(req.body) : req.body) : undefined; try { const result = await restManager.makeRequest(req.method as RequestMethods, url, { body, - }) + }); if (result) { - res.status(200).send(result) - return + res.status(200).send(result); + return; } - res.status(204).send({}) + res.status(204).send({}); } catch (error) { - logger.error(error) + logger.error(error); res.status(500).send({ message: error, - }) + }); } -}) +}); await app.listen({ host: REST_HOST, port: REST_PORT, -}) +}); -logger.info(`REST Proxy listening on port ${REST_PORT}`) +logger.info(`REST Proxy listening on port ${REST_PORT}`); diff --git a/examples/bigbot/src/rest/influx.ts b/examples/bigbot/src/rest/influx.ts index 475e70020..c2f0f7ea1 100644 --- a/examples/bigbot/src/rest/influx.ts +++ b/examples/bigbot/src/rest/influx.ts @@ -1,15 +1,15 @@ -import type { RestManager } from '@discordeno/bot' -import { InfluxDB, Point } from '@influxdata/influxdb-client' -import { INFLUX_BUCKET, INFLUX_ENABLED, INFLUX_ORG, INFLUX_TOKEN, INFLUX_URL } from '../config.js' +import type { RestManager } from '@discordeno/bot'; +import { InfluxDB, Point } from '@influxdata/influxdb-client'; +import { INFLUX_BUCKET, INFLUX_ENABLED, INFLUX_ORG, INFLUX_TOKEN, INFLUX_URL } from '../config.js'; -export const influxDB = INFLUX_ENABLED ? new InfluxDB({ url: INFLUX_URL!, token: INFLUX_TOKEN! }) : undefined -export const influx = INFLUX_ENABLED && influxDB ? influxDB.getWriteApi(INFLUX_ORG!, INFLUX_BUCKET!) : undefined +export const influxDB = INFLUX_ENABLED ? new InfluxDB({ url: INFLUX_URL!, token: INFLUX_TOKEN! }) : undefined; +export const influx = INFLUX_ENABLED && influxDB ? influxDB.getWriteApi(INFLUX_ORG!, INFLUX_BUCKET!) : undefined; export const setupRestAnalyticsHooks = (rest: RestManager, logger: RestManager['logger']): void => { // If influxdb data is provided, enable analytics in this proxy. - if (!influx) return + if (!influx) return; - const originalSendRequest = rest.sendRequest + const originalSendRequest = rest.sendRequest; rest.sendRequest = async (options) => { const fetchingPoint = new Point('restEvents') @@ -17,31 +17,31 @@ export const setupRestAnalyticsHooks = (rest: RestManager, logger: RestManager[' .stringField('type', 'REQUEST_FETCHING') .tag('method', options.method) .tag('route', options.route) - .tag('bucket', options.bucketId ?? 'NA') + .tag('bucket', options.bucketId ?? 'NA'); - influx.writePoint(fetchingPoint) + influx.writePoint(fetchingPoint); - await originalSendRequest(options) + await originalSendRequest(options); const fetchedPoint = new Point('restEvents') .timestamp(new Date()) .stringField('type', 'REQUEST_FETCHED') .tag('method', options.method) .tag('route', options.route) - .tag('bucket', options.bucketId ?? 'NA') + .tag('bucket', options.bucketId ?? 'NA'); // FIXME: rest.sendRequest returns Promise, so there is no way currently to get the response status // .intField('status', response.status) - influx.writePoint(fetchedPoint) - } + influx.writePoint(fetchedPoint); + }; setInterval(async () => { - logger.info('Influx - Saving events...') + logger.info('Influx - Saving events...'); try { - await influx.flush() - logger.info('Influx - events saved!') + await influx.flush(); + logger.info('Influx - events saved!'); } catch (error) { - logger.error('Influx - error saving events!', error) + logger.error('Influx - error saving events!', error); } - }, 30_000 /* 30s */) -} + }, 30_000 /* 30s */); +}; diff --git a/examples/bigbot/src/rest/restManager.ts b/examples/bigbot/src/rest/restManager.ts index 625243a08..1e31f50d4 100644 --- a/examples/bigbot/src/rest/restManager.ts +++ b/examples/bigbot/src/rest/restManager.ts @@ -1,13 +1,13 @@ -import { createLogger, createRestManager } from '@discordeno/bot' -import { DISCORD_TOKEN } from '../config.js' -import { setupRestAnalyticsHooks } from './influx.js' +import { createLogger, createRestManager } from '@discordeno/bot'; +import { DISCORD_TOKEN } from '../config.js'; +import { setupRestAnalyticsHooks } from './influx.js'; const manager = createRestManager({ token: DISCORD_TOKEN, -}) +}); -export const logger = createLogger({ name: 'REST' }) +export const logger = createLogger({ name: 'REST' }); -setupRestAnalyticsHooks(manager, logger) +setupRestAnalyticsHooks(manager, logger); -export default manager +export default manager; diff --git a/examples/bigbot/src/util.ts b/examples/bigbot/src/util.ts index 51130370e..1f3ff6b73 100644 --- a/examples/bigbot/src/util.ts +++ b/examples/bigbot/src/util.ts @@ -1,25 +1,25 @@ -import { dirname } from 'node:path' -import { fileURLToPath } from 'node:url' +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; // This is a "polyfill" for the `Promise.withResolves`, while node 22 does support it, node 18 does not and this template does support node 18 export function promiseWithResolvers(): PromiseWithResolvers { - let resolve!: (data: T | PromiseLike) => void - let reject!: (reason?: any) => void + let resolve!: (data: T | PromiseLike) => void; + let reject!: (reason?: any) => void; const promise = new Promise((_resolve, _reject) => { - resolve = _resolve - reject = _reject - }) + resolve = _resolve; + reject = _reject; + }); - return { promise, resolve, reject } + return { promise, resolve, reject }; } // This re-creates the `__dirname` that exists in CommonJS, in ESM node added `import.meta.dirname` but it is for node 20+, so we need this util to support node 18 export function getDirnameFromFileUrl(url: string): string { - return dirname(fileURLToPath(url)) + return dirname(fileURLToPath(url)); } export interface PromiseWithResolvers { - promise: Promise - resolve: (data: T | PromiseLike) => void - reject: (reason?: any) => void + promise: Promise; + resolve: (data: T | PromiseLike) => void; + reject: (reason?: any) => void; } diff --git a/examples/minimal/src/bot.ts b/examples/minimal/src/bot.ts index e6bda765f..218c80da5 100644 --- a/examples/minimal/src/bot.ts +++ b/examples/minimal/src/bot.ts @@ -1,6 +1,6 @@ -import { Collection, createBot, Intents } from '@discordeno/bot' -import { configs } from './config.js' -import type { Command } from './types/commands.js' +import { Collection, createBot, Intents } from '@discordeno/bot'; +import { configs } from './config.js'; +import type { Command } from './types/commands.js'; const rawBot = createBot({ token: configs.token, @@ -13,11 +13,11 @@ const rawBot = createBot({ token: true, }, }, -}) +}); -export const bot = rawBot as BotWithCommands +export const bot = rawBot as BotWithCommands; // Create the command collection -bot.commands = new Collection() +bot.commands = new Collection(); -export type BotWithCommands = typeof rawBot & { commands: Collection } +export type BotWithCommands = typeof rawBot & { commands: Collection }; diff --git a/examples/minimal/src/commands.ts b/examples/minimal/src/commands.ts index 490f3a81e..b3c19b99e 100644 --- a/examples/minimal/src/commands.ts +++ b/examples/minimal/src/commands.ts @@ -1,6 +1,6 @@ -import { bot } from './bot.js' -import type { Command } from './types/commands.js' +import { bot } from './bot.js'; +import type { Command } from './types/commands.js'; export function createCommand(command: Command): void { - bot.commands.set(command.name, command) + bot.commands.set(command.name, command); } diff --git a/examples/minimal/src/commands/ping.ts b/examples/minimal/src/commands/ping.ts index b293cdfe0..84384d4fa 100644 --- a/examples/minimal/src/commands/ping.ts +++ b/examples/minimal/src/commands/ping.ts @@ -1,13 +1,13 @@ -import { ApplicationCommandTypes, snowflakeToTimestamp } from '@discordeno/bot' -import { createCommand } from '../commands.js' +import { ApplicationCommandTypes, snowflakeToTimestamp } from '@discordeno/bot'; +import { createCommand } from '../commands.js'; createCommand({ name: 'ping', description: 'Ping the Bot!', type: ApplicationCommandTypes.ChatInput, async execute(interaction) { - const ping = Date.now() - snowflakeToTimestamp(interaction.id) + const ping = Date.now() - snowflakeToTimestamp(interaction.id); - await interaction.respond(`🏓 Pong! ${ping}ms`) + await interaction.respond(`🏓 Pong! ${ping}ms`); }, -}) +}); diff --git a/examples/minimal/src/config.ts b/examples/minimal/src/config.ts index 32b9c49c2..7c2d2b55c 100644 --- a/examples/minimal/src/config.ts +++ b/examples/minimal/src/config.ts @@ -1,17 +1,17 @@ -const token = process.env.BOT_TOKEN -const devGuildId = process.env.DEV_GUILD_ID +const token = process.env.BOT_TOKEN; +const devGuildId = process.env.DEV_GUILD_ID; -if (!token) throw new Error('Missing BOT_TOKEN environment variable') -if (!devGuildId) throw new Error('Missing DEV_GUILD_ID environment variable') +if (!token) throw new Error('Missing BOT_TOKEN environment variable'); +if (!devGuildId) throw new Error('Missing DEV_GUILD_ID environment variable'); export const configs: Config = { /** Get token from ENV variable */ token, /** The server id where you develop your bot and want dev commands created. */ devGuildId: BigInt(devGuildId), -} +}; export interface Config { - token: string - devGuildId: bigint + token: string; + devGuildId: bigint; } diff --git a/examples/minimal/src/events/interactionCreate.ts b/examples/minimal/src/events/interactionCreate.ts index bed68eda8..b17516b38 100644 --- a/examples/minimal/src/events/interactionCreate.ts +++ b/examples/minimal/src/events/interactionCreate.ts @@ -1,15 +1,15 @@ -import { InteractionTypes } from '@discordeno/bot' -import { bot } from '../bot.js' -import logger from '../utils/logger.js' +import { InteractionTypes } from '@discordeno/bot'; +import { bot } from '../bot.js'; +import logger from '../utils/logger.js'; bot.events.interactionCreate = (interaction) => { - if (!interaction.data) return + if (!interaction.data) return; switch (interaction.type) { case InteractionTypes.ApplicationCommand: - logger.info(`[Application Command] ${interaction.data.name} command executed.`) + logger.info(`[Application Command] ${interaction.data.name} command executed.`); - bot.commands.get(interaction.data.name)?.execute(interaction) - break + bot.commands.get(interaction.data.name)?.execute(interaction); + break; } -} +}; diff --git a/examples/minimal/src/events/ready.ts b/examples/minimal/src/events/ready.ts index f6f7c3271..664fc9728 100644 --- a/examples/minimal/src/events/ready.ts +++ b/examples/minimal/src/events/ready.ts @@ -1,17 +1,17 @@ -import { bot } from '../bot.js' -import logger from '../utils/logger.js' +import { bot } from '../bot.js'; +import logger from '../utils/logger.js'; bot.events.ready = ({ shardId }) => { - logger.info(`[READY] Shard ${shardId} is ready!`) + logger.info(`[READY] Shard ${shardId} is ready!`); if (shardId === bot.gateway.lastShardId) { - botFullyReady() + botFullyReady(); } -} +}; // This function lets you run custom code when all your bot's shards are online. function botFullyReady(): void { // Do stuff that you want that get execute only when the bot is fully online. - logger.info('[READY] Bot is fully online.') + logger.info('[READY] Bot is fully online.'); } diff --git a/examples/minimal/src/index.ts b/examples/minimal/src/index.ts index b0f5f89cf..30a137aec 100644 --- a/examples/minimal/src/index.ts +++ b/examples/minimal/src/index.ts @@ -1,15 +1,15 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { bot } from './bot.js' -import importDirectory from './utils/loader.js' -import logger from './utils/logger.js' +import { bot } from './bot.js'; +import importDirectory from './utils/loader.js'; +import logger from './utils/logger.js'; -logger.info('Starting bot...') +logger.info('Starting bot...'); -logger.info('Loading commands...') -await importDirectory('./dist/commands') +logger.info('Loading commands...'); +await importDirectory('./dist/commands'); -logger.info('Loading events...') -await importDirectory('./dist/events') +logger.info('Loading events...'); +await importDirectory('./dist/events'); -await bot.start() +await bot.start(); diff --git a/examples/minimal/src/register-commands.ts b/examples/minimal/src/register-commands.ts index d2e9a9474..d464511d5 100644 --- a/examples/minimal/src/register-commands.ts +++ b/examples/minimal/src/register-commands.ts @@ -1,16 +1,16 @@ -import 'dotenv/config' +import 'dotenv/config'; -import importDirectory from './utils/loader.js' -import logger from './utils/logger.js' -import { updateApplicationCommands } from './utils/updateCommands.js' +import importDirectory from './utils/loader.js'; +import logger from './utils/logger.js'; +import { updateApplicationCommands } from './utils/updateCommands.js'; -logger.info('Loading commands...') -await importDirectory('./dist/commands') +logger.info('Loading commands...'); +await importDirectory('./dist/commands'); -logger.info('Updating commands...') -await updateApplicationCommands() +logger.info('Updating commands...'); +await updateApplicationCommands(); -logger.info('Done!') +logger.info('Done!'); // We need to manually exit as the REST Manager has timeouts that will keep NodeJS alive -process.exit() +process.exit(); diff --git a/examples/minimal/src/types/commands.ts b/examples/minimal/src/types/commands.ts index 6276f2423..4d079622d 100644 --- a/examples/minimal/src/types/commands.ts +++ b/examples/minimal/src/types/commands.ts @@ -1,17 +1,17 @@ -import type { ApplicationCommandOption, ApplicationCommandTypes } from '@discordeno/bot' -import type { bot } from '../bot.js' +import type { ApplicationCommandOption, ApplicationCommandTypes } from '@discordeno/bot'; +import type { bot } from '../bot.js'; export interface Command { /** The name of this command. */ - name: string + name: string; /** What does this command do? */ - description: string + description: string; /** The type of command this is. */ - type: ApplicationCommandTypes + type: ApplicationCommandTypes; /** Whether or not this command is for the dev server only. */ - devOnly?: boolean + devOnly?: boolean; /** The options for this command */ - options?: ApplicationCommandOption[] + options?: ApplicationCommandOption[]; /** This will be executed when the command is run. */ - execute: (interaction: typeof bot.transformers.$inferredTypes.interaction) => unknown + execute: (interaction: typeof bot.transformers.$inferredTypes.interaction) => unknown; } diff --git a/examples/minimal/src/utils/loader.ts b/examples/minimal/src/utils/loader.ts index 5b1c6f541..213ceaf16 100644 --- a/examples/minimal/src/utils/loader.ts +++ b/examples/minimal/src/utils/loader.ts @@ -1,15 +1,15 @@ -import { readdir } from 'node:fs/promises' -import logger from './logger.js' +import { readdir } from 'node:fs/promises'; +import logger from './logger.js'; export default async function importDirectory(folder: string): Promise { - const files = await readdir(folder, { recursive: true }) + const files = await readdir(folder, { recursive: true }); for (const filename of files) { - if (!filename.endsWith('.js')) continue + if (!filename.endsWith('.js')) continue; // Using `file://` and `process.cwd()` to avoid weird issues with relative paths and/or Windows await import(`file://${process.cwd()}/${folder}/${filename}`).catch((x) => logger.fatal(`Cannot import file (${folder}/${filename}) for reason:`, x), - ) + ); } } diff --git a/examples/minimal/src/utils/logger.ts b/examples/minimal/src/utils/logger.ts index 4838e581b..47182b8b1 100644 --- a/examples/minimal/src/utils/logger.ts +++ b/examples/minimal/src/utils/logger.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unsafe-argument */ -import chalk from 'chalk' +import chalk from 'chalk'; export enum LogLevels { Debug, @@ -15,70 +15,70 @@ const prefixes = new Map([ [LogLevels.Warn, 'WARN'], [LogLevels.Error, 'ERROR'], [LogLevels.Fatal, 'FATAL'], -]) +]); -const noColor: (str: string) => string = (msg) => msg +const noColor: (str: string) => string = (msg) => msg; const colorFunctions = new Map string>([ [LogLevels.Debug, chalk.gray], [LogLevels.Info, chalk.cyan], [LogLevels.Warn, chalk.yellow], [LogLevels.Error, (str: string) => chalk.red(str)], [LogLevels.Fatal, (str: string) => chalk.red.bold.italic(str)], -]) +]); export function createLogger({ logLevel = LogLevels.Info, name }: { logLevel?: LogLevels; name?: string } = {}): Logger { function log(level: LogLevels, ...args: any[]): void { - if (level < logLevel) return + if (level < logLevel) return; - let color = colorFunctions.get(level) - if (!color) color = noColor + let color = colorFunctions.get(level); + if (!color) color = noColor; - const date = new Date() + const date = new Date(); const log = [ `[${date.toLocaleDateString()} ${date.toLocaleTimeString()}]`, color(prefixes.get(level) ?? 'DEBUG'), name ? `${name} >` : '>', ...args, - ] + ]; switch (level) { case LogLevels.Debug: - return console.debug(...log) + return console.debug(...log); case LogLevels.Info: - return console.info(...log) + return console.info(...log); case LogLevels.Warn: - return console.warn(...log) + return console.warn(...log); case LogLevels.Error: - return console.error(...log) + return console.error(...log); case LogLevels.Fatal: - return console.error(...log) + return console.error(...log); default: - return console.log(...log) + return console.log(...log); } } function setLevel(level: LogLevels): void { - logLevel = level + logLevel = level; } function debug(...args: any[]): void { - log(LogLevels.Debug, ...args) + log(LogLevels.Debug, ...args); } function info(...args: any[]): void { - log(LogLevels.Info, ...args) + log(LogLevels.Info, ...args); } function warn(...args: any[]): void { - log(LogLevels.Warn, ...args) + log(LogLevels.Warn, ...args); } function error(...args: any[]): void { - log(LogLevels.Error, ...args) + log(LogLevels.Error, ...args); } function fatal(...args: any[]): void { - log(LogLevels.Fatal, ...args) + log(LogLevels.Fatal, ...args); } return { @@ -89,18 +89,18 @@ export function createLogger({ logLevel = LogLevels.Info, name }: { logLevel?: L warn, error, fatal, - } + }; } -export const logger = createLogger({ name: 'Main' }) -export default logger +export const logger = createLogger({ name: 'Main' }); +export default logger; export interface Logger { - log: (level: LogLevels, ...args: any[]) => void - debug: (...args: any[]) => void - info: (...args: any[]) => void - warn: (...args: any[]) => void - error: (...args: any[]) => void - fatal: (...args: any[]) => void - setLevel: (level: LogLevels) => void + log: (level: LogLevels, ...args: any[]) => void; + debug: (...args: any[]) => void; + info: (...args: any[]) => void; + warn: (...args: any[]) => void; + error: (...args: any[]) => void; + fatal: (...args: any[]) => void; + setLevel: (level: LogLevels) => void; } diff --git a/examples/minimal/src/utils/updateCommands.ts b/examples/minimal/src/utils/updateCommands.ts index c98d3cc48..c68af612a 100644 --- a/examples/minimal/src/utils/updateCommands.ts +++ b/examples/minimal/src/utils/updateCommands.ts @@ -1,5 +1,5 @@ -import { bot } from '../bot.js' -import { configs } from '../config.js' +import { bot } from '../bot.js'; +import { configs } from '../config.js'; export async function updateApplicationCommands(): Promise { await bot.helpers.upsertGlobalApplicationCommands( @@ -7,7 +7,7 @@ export async function updateApplicationCommands(): Promise { // ONLY GLOBAL COMMANDS .filter((command) => !command.devOnly) .array(), - ) + ); await bot.helpers.upsertGuildApplicationCommands( configs.devGuildId, @@ -15,5 +15,5 @@ export async function updateApplicationCommands(): Promise { // ONLY GLOBAL COMMANDS .filter((command) => !!command.devOnly) .array(), - ) + ); } diff --git a/examples/reaction-roles/src/bot.ts b/examples/reaction-roles/src/bot.ts index 689281aff..ebbbc75d1 100644 --- a/examples/reaction-roles/src/bot.ts +++ b/examples/reaction-roles/src/bot.ts @@ -1,12 +1,12 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { createBot } from '@discordeno/bot' -import events from './events/index.js' +import { createBot } from '@discordeno/bot'; +import events from './events/index.js'; -const token = process.env.TOKEN +const token = process.env.TOKEN; // Ensure the existence of the TOKEN env -if (!token) throw new Error('The TOKEN environment variable needs to be defined.') +if (!token) throw new Error('The TOKEN environment variable needs to be defined.'); export const bot = createBot({ token, @@ -41,6 +41,6 @@ export const bot = createBot({ id: true, }, }, -}) +}); -bot.events = events +bot.events = events; diff --git a/examples/reaction-roles/src/collector.ts b/examples/reaction-roles/src/collector.ts index 42de1aee1..7c76c4292 100644 --- a/examples/reaction-roles/src/collector.ts +++ b/examples/reaction-roles/src/collector.ts @@ -1,12 +1,12 @@ -import { EventEmitter } from 'node:events' +import { EventEmitter } from 'node:events'; // Extremely minimal collector class export default class ItemCollector extends EventEmitter { onItem(callback: (item: T) => unknown): void { - this.on('item', callback) + this.on('item', callback); } collect(item: T): void { - this.emit('item', item) + this.emit('item', item); } } diff --git a/examples/reaction-roles/src/commands/index.ts b/examples/reaction-roles/src/commands/index.ts index 2fcf6c52e..e57006b5b 100644 --- a/examples/reaction-roles/src/commands/index.ts +++ b/examples/reaction-roles/src/commands/index.ts @@ -1,12 +1,12 @@ -import type { CreateSlashApplicationCommand } from '@discordeno/types' -import type { bot } from '../bot.js' -import roles from './roles.js' +import type { CreateSlashApplicationCommand } from '@discordeno/types'; +import type { bot } from '../bot.js'; +import roles from './roles.js'; -export const commands = new Map([roles].map((cmd) => [cmd.name, cmd])) +export const commands = new Map([roles].map((cmd) => [cmd.name, cmd])); -export default commands +export default commands; export interface Command extends CreateSlashApplicationCommand { /** Handler that will be executed when this command is triggered */ - execute: (interaction: typeof bot.transformers.$inferredTypes.interaction, args: Record) => Promise + execute: (interaction: typeof bot.transformers.$inferredTypes.interaction, args: Record) => Promise; } diff --git a/examples/reaction-roles/src/commands/roles.ts b/examples/reaction-roles/src/commands/roles.ts index d8d278f4e..da264b320 100644 --- a/examples/reaction-roles/src/commands/roles.ts +++ b/examples/reaction-roles/src/commands/roles.ts @@ -1,4 +1,4 @@ -import assert from 'node:assert' +import assert from 'node:assert'; import { type ActionRow, type ButtonComponent, @@ -6,12 +6,12 @@ import { MessageComponentTypes, type SelectMenuComponent, TextStyles, -} from '@discordeno/bot' -import { ApplicationCommandOptionTypes, ButtonStyles } from '@discordeno/types' -import { bot } from '../bot.js' -import ItemCollector from '../collector.js' -import { collectors } from '../events/interactionCreate.js' -import type { Command } from './index.js' +} from '@discordeno/bot'; +import { ApplicationCommandOptionTypes, ButtonStyles } from '@discordeno/types'; +import { bot } from '../bot.js'; +import ItemCollector from '../collector.js'; +import { collectors } from '../events/interactionCreate.js'; +import type { Command } from './index.js'; const command: Command = { name: 'roles', @@ -73,22 +73,22 @@ const command: Command = { if (args.reactions?.create) { // Ensure that there is a channelId if (!interaction.channelId) { - await interaction.respond('Could not get the current channel.', { isPrivate: true }) - return + await interaction.respond('Could not get the current channel.', { isPrivate: true }); + return; } // This array is used to store all the roles for this reaction roles - let roles = [args.reactions.create] + let roles = [args.reactions.create]; // Send the message that uses will use to get the role const roleMessage = await bot.helpers.sendMessage(interaction.channelId, { content: 'Pick your roles', components: getRoleButtons(roles), - }) + }); // Create a copy of the actionRow for the main message // NOTE: we use a copy so when we edit this actionRow the edits don't get applied to all the command executions, only this one, for example we do disable some buttons in some conditional cases - const messageActionRow = structuredClone(messageActionRowTemplate) + const messageActionRow = structuredClone(messageActionRowTemplate); const message = await interaction.respond( { @@ -96,230 +96,230 @@ const command: Command = { components: [messageActionRow], }, { isPrivate: true, withResponse: true }, - ) + ); if (!message) { - await interaction.respond('❌ Unable to send the message correctly. Cancelling', { isPrivate: true }) - return + await interaction.respond('❌ Unable to send the message correctly. Cancelling', { isPrivate: true }); + return; } - assert('resource' in message && message.resource?.message) + assert('resource' in message && message.resource?.message); // Create the collector for the menu - const itemCollector = new ItemCollector() - collectors.add(itemCollector) + const itemCollector = new ItemCollector(); + collectors.add(itemCollector); // For the new reaction role, we need to keep track of what the user gave us - let partialRoleInfo: Partial<(typeof roles)[number]> | undefined + let partialRoleInfo: Partial<(typeof roles)[number]> | undefined; itemCollector.onItem(async (i) => { // We need to verify the interaction is for us. if (i.message?.id !== message.resource?.message?.id) { - return + return; } // Save button if (i.data?.customId === 'reactionRoles-save') { // Remove this item collector from the list of collectors (we aren't correcting anymore) - collectors.delete(itemCollector) + collectors.delete(itemCollector); // Delete the edit message - await i.deferEdit() - await i.delete() + await i.deferEdit(); + await i.delete(); - return + return; } // New button if (i.data?.customId === 'reactionRoles-add') { - partialRoleInfo = {} + partialRoleInfo = {}; // Ask the user for the role - await i.edit({ content: 'Pick a role for the new reaction role', components: [selectRoleActionRow] }) - return + await i.edit({ content: 'Pick a role for the new reaction role', components: [selectRoleActionRow] }); + return; } // New button - role select menu if (partialRoleInfo && i.data?.customId === 'reactionRoles-add-role') { - const roleToAdd = i.data?.resolved?.roles?.first() + const roleToAdd = i.data?.resolved?.roles?.first(); // Verify that we could get the role from discord if (!roleToAdd) { - throw new Error('Unable to get the information for the role to add') + throw new Error('Unable to get the information for the role to add'); } // Save it to our partial role information - partialRoleInfo.role = roleToAdd + partialRoleInfo.role = roleToAdd; // Ask the user for the color of the button await i.edit({ content: 'Pick a color for the reaction role', components: [selectColorActionRow], - }) + }); - return + return; } // New button - color select menu if (partialRoleInfo && i.data?.customId === 'reactionRoles-add-color') { - const color = parseInt(i.data?.values?.[0] ?? 'NaN') + const color = parseInt(i.data?.values?.[0] ?? 'NaN'); // Verify that we could get the color information if (isNaN(color)) { - throw new Error('Unable to get the information for the role to add') + throw new Error('Unable to get the information for the role to add'); } // Save the color to our partial - partialRoleInfo.color = color + partialRoleInfo.color = color; // Ask the user to input the emoji and optionally a label for the button await i.respond({ title: 'Pick an emoji and label for the reaction role', components: [selectEmojiActionRow, selectLabelActionRow], customId: 'reactionRoles-add-modal', - }) + }); - return + return; } // New button - emoji & label modal if (partialRoleInfo && i.data?.customId === 'reactionRoles-add-modal') { // Ensure that we can get the channelId from the interaction if (!interaction.channelId) { - throw new Error('Unable to get current channel') + throw new Error('Unable to get current channel'); } // Get the data from discord - const emoji = i.data.components?.[0]?.components?.[0].value - const label = i.data.components?.[1]?.components?.[0].value + const emoji = i.data.components?.[0]?.components?.[0].value; + const label = i.data.components?.[1]?.components?.[0].value; // Verify that the emoji was given if (!emoji) { - throw new Error('Unable to get the information for the role to add') + throw new Error('Unable to get the information for the role to add'); } // Save them to our partial - partialRoleInfo.emoji = emoji - partialRoleInfo.label = label + partialRoleInfo.emoji = emoji; + partialRoleInfo.label = label; // Save role and display the new message editing the old one // We are sure that in this place the entire object has been assembled - roles.push(partialRoleInfo as (typeof roles)[number]) + roles.push(partialRoleInfo as (typeof roles)[number]); await bot.helpers.editMessage(interaction.channelId, roleMessage.id, { components: getRoleButtons(roles), - }) + }); // Clear our partial roleInfo, we are done with it - partialRoleInfo = undefined + partialRoleInfo = undefined; // In case the delete button was disabled (all the roles were deleted) re-enable it - messageActionRow.components[1]!.disabled = false + messageActionRow.components[1]!.disabled = false; // Discord imposes a limit of 5 action rows and 5 buttons for actionRow = 25 buttons max // more than 25 will give an error, so we disable the new button if (roles.length === 25) { - const button = messageActionRow.components[0] as ButtonComponent - button.disabled = true + const button = messageActionRow.components[0] as ButtonComponent; + button.disabled = true; } // Show again the main edit menu await interaction.edit({ content: 'Use the buttons in this message to edit the message below.', components: [messageActionRow], - }) + }); // Respond to the modal. A modal submit (type 5) interaction can't edit the original response - await i.respond('Reaction role created successfully. You can use the message above to add/remove a role', { isPrivate: true }) + await i.respond('Reaction role created successfully. You can use the message above to add/remove a role', { isPrivate: true }); - return + return; } // Remove button if (i.data?.customId === 'reactionRoles-remove') { // Clone the actionRow for the remove select menu, this is to prevent unwanted data to appear to other users - const removeActionRow = structuredClone(removeActionRowTemplate) - const selectMenu = removeActionRow.components[0] as SelectMenuComponent + const removeActionRow = structuredClone(removeActionRowTemplate); + const selectMenu = removeActionRow.components[0] as SelectMenuComponent; // Add the possible values for this select menu for (const roleInfo of roles) { selectMenu.options.push({ label: `${roleInfo.emoji} ${roleInfo.label ?? ''}`, value: roleInfo.role.id.toString(), - }) + }); } // Ask the user for what reaction role they want to remove await i.edit({ content: 'Select what reaction role to remove', components: [removeActionRow], - }) + }); - return + return; } // Remove button - role select menu if (i.data?.customId === 'reactionRoles-remove-selectMenu') { // Ensure that we can get the channelId from the interaction if (!interaction.channelId) { - throw new Error('Unable to get current channel') + throw new Error('Unable to get current channel'); } // Get the role to delete from discord - const roleToRemove = i.data?.values?.[0] + const roleToRemove = i.data?.values?.[0]; // Ensure we got it if (!roleToRemove) { - throw new Error('Unable to get the role to remove') + throw new Error('Unable to get the role to remove'); } - await i.deferEdit() + await i.deferEdit(); // Remove the role from the list - roles = roles.filter((roleInfo) => roleInfo.role.id.toString() !== roleToRemove) + roles = roles.filter((roleInfo) => roleInfo.role.id.toString() !== roleToRemove); // Edit the main button await bot.helpers.editMessage(interaction.channelId, roleMessage.id, { components: getRoleButtons(roles), - }) + }); // If the new button was disabled (we were at 25 buttons) we re-enable it - const button = messageActionRow.components[0] as ButtonComponent - button.disabled = false + const button = messageActionRow.components[0] as ButtonComponent; + button.disabled = false; // If we are at 0 roles, and the user tried to delete a role they will get locked in the menu, so we disable it if (roles.length === 0) { - messageActionRow.components[1]!.disabled = true + messageActionRow.components[1]!.disabled = true; } // Show the main edit ui (new, remove, save) await i.edit({ content: 'Use the buttons in this message to edit the message below.', components: [messageActionRow], - }) + }); - return + return; } // We don't know what code to run for this interaction - throw new Error('Unknown button') - }) + throw new Error('Unknown button'); + }); } }, -} +}; -export default command +export default command; // Interface to type the arguments that we receive from discord interface CommandArgs { reactions?: { create?: { - role: typeof bot.transformers.$inferredTypes.role - emoji: string - color: ButtonStyles - label?: string - } - } + role: typeof bot.transformers.$inferredTypes.role; + emoji: string; + color: ButtonStyles; + label?: string; + }; + }; } // Templates/ActionRows for the command to then be referenced in the various part of the code @@ -357,7 +357,7 @@ const messageActionRowTemplate: ActionRow = { label: 'Save', }, ], -} as const +} as const; const removeActionRowTemplate: ActionRow = { type: MessageComponentTypes.ActionRow, @@ -371,7 +371,7 @@ const removeActionRowTemplate: ActionRow = { options: [], }, ], -} as const +} as const; const selectRoleActionRow: ActionRow = { type: MessageComponentTypes.ActionRow, @@ -384,7 +384,7 @@ const selectRoleActionRow: ActionRow = { placeholder: 'Select a role', }, ], -} as const +} as const; const selectColorActionRow: ActionRow = { type: MessageComponentTypes.ActionRow, @@ -400,7 +400,7 @@ const selectColorActionRow: ActionRow = { ], }, ], -} as const +} as const; const selectEmojiActionRow: ActionRow = { type: MessageComponentTypes.ActionRow, @@ -413,7 +413,7 @@ const selectEmojiActionRow: ActionRow = { required: true, }, ], -} as const +} as const; const selectLabelActionRow: ActionRow = { type: MessageComponentTypes.ActionRow, @@ -427,37 +427,37 @@ const selectLabelActionRow: ActionRow = { maxLength: 80, }, ], -} as const +} as const; // Function to get all the actionRows with buttons for the reaction roles message function getRoleButtons( roles: Array<{ - role: typeof bot.transformers.$inferredTypes.role - emoji: string - color: ButtonStyles - label?: string | undefined + role: typeof bot.transformers.$inferredTypes.role; + emoji: string; + color: ButtonStyles; + label?: string | undefined; }>, ): ActionRow[] { - const actionRows: ActionRow[] = [] + const actionRows: ActionRow[] = []; // If there aren't any roles, we don't need any buttons - if (roles.length === 0) return actionRows + if (roles.length === 0) return actionRows; // We add the components later, so we need to make typescript know that we are sure that it will be a compatibile components array - actionRows.push({ type: MessageComponentTypes.ActionRow, components: [] as unknown as ActionRow['components'] }) + actionRows.push({ type: MessageComponentTypes.ActionRow, components: [] as unknown as ActionRow['components'] }); for (const roleInfo of roles) { - let actionRow = actionRows.at(-1) + let actionRow = actionRows.at(-1); // Ensure that we were able to get the actionRow if (!actionRow) { - throw new Error('Unable to get actionRow') + throw new Error('Unable to get actionRow'); } // If the actionRow is full (has 5 buttons) add a new one if (actionRow.components.length === 5) { - actionRow = { type: MessageComponentTypes.ActionRow, components: [] as unknown as ActionRow['components'] } - actionRows.push(actionRow) + actionRow = { type: MessageComponentTypes.ActionRow, components: [] as unknown as ActionRow['components'] }; + actionRows.push(actionRow); } // Add the new button to this actionRow @@ -469,8 +469,8 @@ function getRoleButtons( }, label: roleInfo.label, customId: `reactionRoles-role-${roleInfo.role.id}`, - }) + }); } - return actionRows + return actionRows; } diff --git a/examples/reaction-roles/src/events/index.ts b/examples/reaction-roles/src/events/index.ts index c7b5585ec..3d4cb5bb8 100644 --- a/examples/reaction-roles/src/events/index.ts +++ b/examples/reaction-roles/src/events/index.ts @@ -1,10 +1,10 @@ -import type { bot } from '../bot.js' -import { event as interactionCreateEvent } from './interactionCreate.js' -import { event as readyEvent } from './ready.js' +import type { bot } from '../bot.js'; +import { event as interactionCreateEvent } from './interactionCreate.js'; +import { event as readyEvent } from './ready.js'; export const events = { interactionCreate: interactionCreateEvent, ready: readyEvent, -} as typeof bot.events +} as typeof bot.events; -export default events +export default events; diff --git a/examples/reaction-roles/src/events/interactionCreate.ts b/examples/reaction-roles/src/events/interactionCreate.ts index a8f9aaf49..5136beba8 100644 --- a/examples/reaction-roles/src/events/interactionCreate.ts +++ b/examples/reaction-roles/src/events/interactionCreate.ts @@ -1,59 +1,59 @@ -import { commandOptionsParser, InteractionTypes, MessageComponentTypes } from '@discordeno/bot' -import { bot } from '../bot.js' -import type ItemCollector from '../collector.js' -import commands from '../commands/index.js' +import { commandOptionsParser, InteractionTypes, MessageComponentTypes } from '@discordeno/bot'; +import { bot } from '../bot.js'; +import type ItemCollector from '../collector.js'; +import commands from '../commands/index.js'; -export const collectors = new Set>() +export const collectors = new Set>(); export const event: typeof bot.events.interactionCreate = async (interaction) => { // Give to all the collectors the interaction to use for (const collector of collectors) { - collector.collect(interaction) + collector.collect(interaction); } // If the interaction is a command check if it is a command and run it if (interaction.type === InteractionTypes.ApplicationCommand) { - if (!interaction.data) return + if (!interaction.data) return; - const command = commands.get(interaction.data.name) - if (!command) return + const command = commands.get(interaction.data.name); + if (!command) return; try { - await command.execute(interaction, commandOptionsParser(interaction)) + await command.execute(interaction, commandOptionsParser(interaction)); } catch (error) { - console.error(error) + console.error(error); } } // If the interaction is a button it might be the button press on our reaction role message if (interaction.type === InteractionTypes.MessageComponent && interaction.data?.componentType === MessageComponentTypes.Button) { // The interaction is not a button press on the role button - if (!interaction.data?.customId?.startsWith('reactionRoles-role-')) return - if (!interaction.guildId || !interaction.member) return + if (!interaction.data?.customId?.startsWith('reactionRoles-role-')) return; + if (!interaction.guildId || !interaction.member) return; // Remove the prefix and get the roleId - const roleId = BigInt(interaction.data.customId.slice('reactionRoles-role-'.length)) + const roleId = BigInt(interaction.data.customId.slice('reactionRoles-role-'.length)); // Check if we need to remove or add the role to the user - const alreadyHasRole = !!interaction.member.roles.find((role) => role === roleId) + const alreadyHasRole = !!interaction.member.roles.find((role) => role === roleId); try { if (alreadyHasRole) { - await bot.helpers.removeRole(interaction.guildId, interaction.user.id, roleId, `Reaction role button for role id ${roleId}`) - await interaction.respond(`I removed from you the <@&${roleId}> role.`, { isPrivate: true }) - return + await bot.helpers.removeRole(interaction.guildId, interaction.user.id, roleId, `Reaction role button for role id ${roleId}`); + await interaction.respond(`I removed from you the <@&${roleId}> role.`, { isPrivate: true }); + return; } // You will get an invalid request made if the bot attempts to give a bot role, a role higher then him hightest role, a link role or if it does not have the Manage Roles permission // This could be prevented by checking for the roles that the bot owns and the role that the bot is trying to add - await bot.helpers.addRole(interaction.guildId, interaction.user.id, roleId, `Reaction role button for role id ${roleId}`) - await interaction.respond(`I added to you the <@&${roleId}> role.`, { isPrivate: true }) + await bot.helpers.addRole(interaction.guildId, interaction.user.id, roleId, `Reaction role button for role id ${roleId}`); + await interaction.respond(`I added to you the <@&${roleId}> role.`, { isPrivate: true }); } catch { // Respond with an error message await interaction.respond( 'I could not give you the role. Possible reasons are:\n- My permissions are not configured correctly, make sure i have the `Manage Roles` permission\n- The role is **above** my hightest role in the server setup\n- The role does not exist or is non-manageable (for example: bot roles, link roles or @everyone)', { isPrivate: true }, - ) + ); } } -} +}; diff --git a/examples/reaction-roles/src/events/ready.ts b/examples/reaction-roles/src/events/ready.ts index 5b883adad..18f686b08 100644 --- a/examples/reaction-roles/src/events/ready.ts +++ b/examples/reaction-roles/src/events/ready.ts @@ -1,6 +1,6 @@ -import { bot } from '../bot.js' +import { bot } from '../bot.js'; export const event: typeof bot.events.ready = () => { // Print to the console when the bot has connected to discord and is ready to handle the events - bot.logger.info('The bot is ready!') -} + bot.logger.info('The bot is ready!'); +}; diff --git a/examples/reaction-roles/src/index.ts b/examples/reaction-roles/src/index.ts index ffe24c1a4..058da016c 100644 --- a/examples/reaction-roles/src/index.ts +++ b/examples/reaction-roles/src/index.ts @@ -1,5 +1,5 @@ -import { bot } from './bot.js' +import { bot } from './bot.js'; -await bot.start() +await bot.start(); -process.on('unhandledRejection', bot.logger.error) +process.on('unhandledRejection', bot.logger.error); diff --git a/examples/reaction-roles/src/register-commands.ts b/examples/reaction-roles/src/register-commands.ts index c289dba44..dc8d88fb2 100644 --- a/examples/reaction-roles/src/register-commands.ts +++ b/examples/reaction-roles/src/register-commands.ts @@ -1,12 +1,12 @@ -import 'dotenv/config' +import 'dotenv/config'; -import { bot } from './bot.js' -import commands from './commands/index.js' +import { bot } from './bot.js'; +import commands from './commands/index.js'; -const guildId = 'REPLACE WITH YOUR GUILD ID' +const guildId = 'REPLACE WITH YOUR GUILD ID'; await bot.rest .upsertGuildApplicationCommands(guildId, [...commands.values()]) - .catch((e) => bot.logger.error('There was an error when updating the global commands', e)) + .catch((e) => bot.logger.error('There was an error when updating the global commands', e)); -process.exit(0) +process.exit(0); diff --git a/packages/bot/src/bot.ts b/packages/bot/src/bot.ts index cb394bedc..46feedb6c 100644 --- a/packages/bot/src/bot.ts +++ b/packages/bot/src/bot.ts @@ -1,20 +1,20 @@ -import type { CreateGatewayManagerOptions, GatewayManager } from '@discordeno/gateway' -import { createGatewayManager, ShardSocketCloseCodes } from '@discordeno/gateway' -import type { CreateRestManagerOptions, RestManager } from '@discordeno/rest' -import { createRestManager } from '@discordeno/rest' -import type { BigString, GatewayDispatchEventNames, GatewayIntents, RecursivePartial } from '@discordeno/types' -import { createLogger, getBotIdFromToken, type logger } from '@discordeno/utils' +import type { CreateGatewayManagerOptions, GatewayManager } from '@discordeno/gateway'; +import { createGatewayManager, ShardSocketCloseCodes } from '@discordeno/gateway'; +import type { CreateRestManagerOptions, RestManager } from '@discordeno/rest'; +import { createRestManager } from '@discordeno/rest'; +import type { BigString, GatewayDispatchEventNames, GatewayIntents, RecursivePartial } from '@discordeno/types'; +import { createLogger, getBotIdFromToken, type logger } from '@discordeno/utils'; import type { CompleteDesiredProperties, DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties, TransformersObjects, -} from './desiredProperties.js' -import type { EventHandlers } from './events.js' -import { type BotGatewayHandler, createBotGatewayHandlers, type GatewayHandlers } from './handlers.js' -import { type BotHelpers, createBotHelpers } from './helpers.js' -import { createTransformers, type Transformers } from './transformers.js' +} from './desiredProperties.js'; +import type { EventHandlers } from './events.js'; +import { type BotGatewayHandler, createBotGatewayHandlers, type GatewayHandlers } from './handlers.js'; +import { type BotHelpers, createBotHelpers } from './helpers.js'; +import { createTransformers, type Transformers } from './transformers.js'; /** * Create a bot object that will maintain the rest and gateway connection. @@ -27,44 +27,44 @@ import { createTransformers, type Transformers } from './transformers.js' export function createBot< TProps extends TransformersDesiredProperties, TBehavior extends DesiredPropertiesBehavior = DesiredPropertiesBehavior.RemoveKey, ->(options: CreateBotOptions): Bot +>(options: CreateBotOptions): Bot; export function createBot< TProps extends RecursivePartial, TBehavior extends DesiredPropertiesBehavior = DesiredPropertiesBehavior.RemoveKey, ->(options: CreateBotOptions): Bot, TBehavior> +>(options: CreateBotOptions): Bot, TBehavior>; export function createBot< TProps extends RecursivePartial, TBehavior extends DesiredPropertiesBehavior = DesiredPropertiesBehavior.RemoveKey, >(options: CreateBotOptions): Bot, TBehavior> { - type CompleteProps = CompleteDesiredProperties - type TypedBot = Bot + type CompleteProps = CompleteDesiredProperties; + type TypedBot = Bot; - if (!options.transformers) options.transformers = {} - if (!options.rest) options.rest = { token: options.token, applicationId: options.applicationId } - if (!options.rest.token) options.rest.token = options.token - if (!options.rest.logger && options.loggerFactory) options.rest.logger = options.loggerFactory('REST') - if (!options.gateway) options.gateway = { token: options.token } - if (!options.gateway.token) options.gateway.token = options.token - if (!options.gateway.events) options.gateway.events = {} - if (!options.gateway.logger && options.loggerFactory) options.gateway.logger = options.loggerFactory('GATEWAY') + if (!options.transformers) options.transformers = {}; + if (!options.rest) options.rest = { token: options.token, applicationId: options.applicationId }; + if (!options.rest.token) options.rest.token = options.token; + if (!options.rest.logger && options.loggerFactory) options.rest.logger = options.loggerFactory('REST'); + if (!options.gateway) options.gateway = { token: options.token }; + if (!options.gateway.token) options.gateway.token = options.token; + if (!options.gateway.events) options.gateway.events = {}; + if (!options.gateway.logger && options.loggerFactory) options.gateway.logger = options.loggerFactory('GATEWAY'); if (!options.gateway.events.message) { options.gateway.events.message = async (shard, data) => { // TRIGGER RAW EVENT - bot.events.raw?.(data, shard.id) + bot.events.raw?.(data, shard.id); - if (!data.t) return + if (!data.t) return; // RUN DISPATCH CHECK - await bot.events.dispatchRequirements?.(data, shard.id) - bot.handlers[data.t as GatewayDispatchEventNames]?.(bot, data, shard.id) - } + await bot.events.dispatchRequirements?.(data, shard.id); + bot.handlers[data.t as GatewayDispatchEventNames]?.(bot, data, shard.id); + }; } - options.gateway.intents = options.intents - ;(options.transformers as Transformers).desiredProperties = options.desiredProperties as CompleteProps + options.gateway.intents = options.intents; + (options.transformers as Transformers).desiredProperties = options.desiredProperties as CompleteProps; - const id = getBotIdFromToken(options.token) + const id = getBotIdFromToken(options.token); const bot: TypedBot = { id, @@ -79,63 +79,63 @@ export function createBot< helpers: {} as BotHelpers, async start() { if (!options.gateway?.connection) { - bot.gateway.connection = await bot.rest.getSessionInfo() + bot.gateway.connection = await bot.rest.getSessionInfo(); // Check for overrides in the configuration - if (!options.gateway?.url) bot.gateway.url = bot.gateway.connection.url + if (!options.gateway?.url) bot.gateway.url = bot.gateway.connection.url; - if (!options.gateway?.totalShards) bot.gateway.totalShards = bot.gateway.connection.shards + if (!options.gateway?.totalShards) bot.gateway.totalShards = bot.gateway.connection.shards; - if (!options.gateway?.lastShardId && !options.gateway?.totalShards) bot.gateway.lastShardId = bot.gateway.connection.shards - 1 + if (!options.gateway?.lastShardId && !options.gateway?.totalShards) bot.gateway.lastShardId = bot.gateway.connection.shards - 1; } if (!bot.gateway.resharding.getSessionInfo) { bot.gateway.resharding.getSessionInfo = async () => { - return await bot.rest.getGatewayBot() - } + return await bot.rest.getGatewayBot(); + }; } - await bot.gateway.spawnShards() + await bot.gateway.spawnShards(); }, async shutdown() { - return await bot.gateway.shutdown(ShardSocketCloseCodes.Shutdown, 'User requested bot stop') + return await bot.gateway.shutdown(ShardSocketCloseCodes.Shutdown, 'User requested bot stop'); }, - } + }; - bot.helpers = createBotHelpers(bot) - if (options.applicationId) bot.applicationId = bot.transformers.snowflake(options.applicationId) + bot.helpers = createBotHelpers(bot); + if (options.applicationId) bot.applicationId = bot.transformers.snowflake(options.applicationId); - return bot + return bot; } export interface CreateBotOptions, TBehavior extends DesiredPropertiesBehavior> { /** The bot's token. */ - token: string + token: string; /** Application Id of the bot incase it is an old bot token. */ - applicationId?: BigString + applicationId?: BigString; /** The bot's intents that will be used to make a connection with discords gateway. */ - intents?: GatewayIntents + intents?: GatewayIntents; /** Any options you wish to provide to the rest manager. */ - rest?: Omit & Partial> + rest?: Omit & Partial>; /** Any options you wish to provide to the gateway manager. */ - gateway?: Omit & Partial> + gateway?: Omit & Partial>; /** The event handlers. */ - events?: Partial>, TBehavior>> + events?: Partial>, TBehavior>>; /** The functions that should transform discord objects to discordeno shaped objects. */ - transformers?: RecursivePartial>, TBehavior>, 'desiredProperties'>> + transformers?: RecursivePartial>, TBehavior>, 'desiredProperties'>>; /** The handler functions that should handle incoming discord payloads from gateway and call an event. */ - handlers?: Partial>, TBehavior>>> + handlers?: Partial>, TBehavior>>>; /** * Set the desired properties for the bot */ - desiredProperties: TProps + desiredProperties: TProps; /** * Set the desired properties behavior for undesired properties * * @default DesiredPropertiesBehavior.RemoveKey */ - desiredPropertiesBehavior?: TBehavior + desiredPropertiesBehavior?: TBehavior; /** * This factory will be invoked to create the logger for gateway, rest and bot * @@ -144,7 +144,7 @@ export interface CreateBotOptions Pick + loggerFactory?: (name: 'REST' | 'GATEWAY' | 'BOT') => Pick; } export interface Bot< @@ -152,28 +152,28 @@ export interface Bot< TBehavior extends DesiredPropertiesBehavior = DesiredPropertiesBehavior.RemoveKey, > { /** The id of the bot. */ - id: bigint + id: bigint; /** The application id of the bot. This is usually the same as id but in the case of old bots can be different. */ - applicationId: bigint + applicationId: bigint; /** The rest manager. */ - rest: RestManager + rest: RestManager; /** The gateway manager. */ - gateway: GatewayManager + gateway: GatewayManager; /** The event handlers. */ - events: Partial> + events: Partial>; /** A logger utility to make it easy to log nice and useful things in the bot code. */ - logger: Pick + logger: Pick; /** The functions that should transform discord objects to discordeno shaped objects. */ transformers: Transformers & { $inferredTypes: { - [K in keyof TransformersObjects]: SetupDesiredProps - } - } + [K in keyof TransformersObjects]: SetupDesiredProps; + }; + }; /** The handler functions that should handle incoming discord payloads from gateway and call an event. */ - handlers: GatewayHandlers - helpers: BotHelpers + handlers: GatewayHandlers; + helpers: BotHelpers; /** Start the bot connection to the gateway. */ - start: () => Promise + start: () => Promise; /** Shuts down all the bot connections to the gateway. */ - shutdown: () => Promise + shutdown: () => Promise; } diff --git a/packages/bot/src/commandOptionsParser.ts b/packages/bot/src/commandOptionsParser.ts index a902b1b3e..0bd0bb6fd 100644 --- a/packages/bot/src/commandOptionsParser.ts +++ b/packages/bot/src/commandOptionsParser.ts @@ -1,6 +1,6 @@ -import { ApplicationCommandOptionTypes } from '@discordeno/types' -import type { CompleteDesiredProperties, DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from './desiredProperties.js' -import type { Attachment, Channel, Interaction, InteractionDataOption, Member, Role, User } from './transformers/types.js' +import { ApplicationCommandOptionTypes } from '@discordeno/types'; +import type { CompleteDesiredProperties, DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from './desiredProperties.js'; +import type { Attachment, Channel, Interaction, InteractionDataOption, Member, Role, User } from './transformers/types.js'; export function commandOptionsParser< TProps extends TransformersDesiredProperties & { interaction: { data: true } }, @@ -11,51 +11,51 @@ export function commandOptionsParser< Interaction, CompleteDesiredProperties<{ interaction: { data: true } }>, DesiredPropertiesBehavior.RemoveKey - > + >; - if (!interaction.data) return {} - if (!options) options = interaction.data.options ?? [] + if (!interaction.data) return {}; + if (!options) options = interaction.data.options ?? []; - const args: ParsedInteractionOption = {} + const args: ParsedInteractionOption = {}; for (const option of options) { switch (option.type) { case ApplicationCommandOptionTypes.SubCommandGroup: case ApplicationCommandOptionTypes.SubCommand: - args[option.name] = commandOptionsParser(interaction, option.options) as InteractionResolvedData - break + args[option.name] = commandOptionsParser(interaction, option.options) as InteractionResolvedData; + break; case ApplicationCommandOptionTypes.Channel: - args[option.name] = interaction.data.resolved?.channels?.get(BigInt(option.value!)) as InteractionResolvedData - break + args[option.name] = interaction.data.resolved?.channels?.get(BigInt(option.value!)) as InteractionResolvedData; + break; case ApplicationCommandOptionTypes.Role: - args[option.name] = interaction.data.resolved?.roles?.get(BigInt(option.value!)) as InteractionResolvedData - break + args[option.name] = interaction.data.resolved?.roles?.get(BigInt(option.value!)) as InteractionResolvedData; + break; case ApplicationCommandOptionTypes.User: args[option.name] = { user: interaction.data.resolved?.users?.get(BigInt(option.value!)) as InteractionResolvedData, member: interaction.data.resolved?.members?.get(BigInt(option.value!)) as InteractionResolvedData, - } - break + }; + break; case ApplicationCommandOptionTypes.Attachment: - args[option.name] = interaction.data.resolved?.attachments?.get(BigInt(option.value!)) as InteractionResolvedData - break + args[option.name] = interaction.data.resolved?.attachments?.get(BigInt(option.value!)) as InteractionResolvedData; + break; case ApplicationCommandOptionTypes.Mentionable: // Mentionable are roles or users args[option.name] = (interaction.data.resolved?.roles?.get(BigInt(option.value!)) as ParsedInteractionOption[string]) ?? { user: interaction.data.resolved?.users?.get(BigInt(option.value!)) as InteractionResolvedData, member: interaction.data.resolved?.members?.get(BigInt(option.value!)) as InteractionResolvedData, - } - break + }; + break; default: - args[option.name] = option.value as InteractionResolvedData + args[option.name] = option.value as InteractionResolvedData; } } - return args + return args; } export interface ParsedInteractionOption { - [key: string]: InteractionResolvedData + [key: string]: InteractionResolvedData; } export type InteractionResolvedData = @@ -66,11 +66,11 @@ export type InteractionResolvedData | SetupDesiredProps | SetupDesiredProps - | ParsedInteractionOption + | ParsedInteractionOption; export interface InteractionResolvedDataUser { - user: SetupDesiredProps - member: InteractionResolvedDataMember + user: SetupDesiredProps; + member: InteractionResolvedDataMember; } export type InteractionResolvedDataChannel = Pick< @@ -92,17 +92,17 @@ export type InteractionResolvedDataChannel -> +>; export type InteractionResolvedDataMember = Omit< SetupDesiredProps, 'user' | 'deaf' | 'mute' -> +>; /** @deprecated Use {@link InteractionResolvedDataUser} */ export interface InteractionResolvedUser { - user: User - member: InteractionResolvedMember + user: User; + member: InteractionResolvedMember; } /** @deprecated Use {@link InteractionResolvedDataChannel} */ @@ -122,7 +122,7 @@ export type InteractionResolvedChannel = Pick< | 'topic' | 'position' | 'threadMetadata' -> +>; /** @deprecated Use {@link InteractionResolvedDataMember} */ -export type InteractionResolvedMember = Omit +export type InteractionResolvedMember = Omit; diff --git a/packages/bot/src/constants.ts b/packages/bot/src/constants.ts index b9bbf617f..c5334e730 100644 --- a/packages/bot/src/constants.ts +++ b/packages/bot/src/constants.ts @@ -1,4 +1,4 @@ -export const SLASH_COMMANDS_NAME_REGEX = /^[-_ʼ\p{L}\p{N}\p{sc=Deva}\p{sc=Thai}]{1,32}$/u -export const CONTEXT_MENU_COMMANDS_NAME_REGEX = /^[\w-\s]{1,32}$/ -export const CHANNEL_MENTION_REGEX = /<#[0-9]+>/g -export const DISCORD_SNOWFLAKE_REGEX = /^(?\d{17,19})$/ +export const SLASH_COMMANDS_NAME_REGEX = /^[-_ʼ\p{L}\p{N}\p{sc=Deva}\p{sc=Thai}]{1,32}$/u; +export const CONTEXT_MENU_COMMANDS_NAME_REGEX = /^[\w-\s]{1,32}$/; +export const CHANNEL_MENTION_REGEX = /<#[0-9]+>/g; +export const DISCORD_SNOWFLAKE_REGEX = /^(?\d{17,19})$/; diff --git a/packages/bot/src/desiredProperties.ts b/packages/bot/src/desiredProperties.ts index 4fe0d5a9c..1847931ae 100644 --- a/packages/bot/src/desiredProperties.ts +++ b/packages/bot/src/desiredProperties.ts @@ -1,7 +1,7 @@ -import type { RecursivePartial } from '@discordeno/types' -import type { Collection } from '@discordeno/utils' -import type { Bot } from './bot.js' -import type { InteractionResolvedDataChannel, InteractionResolvedDataMember } from './commandOptionsParser.js' +import type { RecursivePartial } from '@discordeno/types'; +import type { Collection } from '@discordeno/utils'; +import type { Bot } from './bot.js'; +import type { InteractionResolvedDataChannel, InteractionResolvedDataMember } from './commandOptionsParser.js'; import type { ActivityInstance, ActivityLocation, @@ -56,7 +56,7 @@ import type { UserPrimaryGuild, VoiceState, Webhook, -} from './transformers/types.js' +} from './transformers/types.js'; /** * All the objects that support desired properties @@ -64,59 +64,59 @@ import type { * @private This is subject to breaking changes at any time */ export interface TransformersObjects { - activityInstance: ActivityInstance - activityLocation: ActivityLocation - attachment: Attachment - avatarDecorationData: AvatarDecorationData - channel: Channel - collectibles: Collectibles - component: Component - defaultReactionEmoji: DefaultReactionEmoji - emoji: Emoji - entitlement: Entitlement - forumTag: ForumTag - guild: Guild - guildOnboarding: GuildOnboarding - guildOnboardingPrompt: GuildOnboardingPrompt - guildOnboardingPromptOption: GuildOnboardingPromptOption - incidentsData: IncidentsData - interaction: Interaction - interactionCallback: InteractionCallback - interactionCallbackResponse: InteractionCallbackResponse - interactionResource: InteractionResource - invite: Invite - inviteStageInstance: InviteStageInstance - lobby: Lobby - lobbyMember: LobbyMember - mediaGalleryItem: MediaGalleryItem - member: Member - message: Message - messageCall: MessageCall - messageInteraction: MessageInteraction - messageInteractionMetadata: MessageInteractionMetadata - messagePin: MessagePin - messageReference: MessageReference - messageSnapshot: MessageSnapshot - nameplate: Nameplate - poll: Poll - pollAnswer: PollAnswer - pollAnswerCount: PollAnswerCount - pollMedia: PollMedia - pollResult: PollResult - role: Role - roleColors: RoleColors - scheduledEvent: ScheduledEvent - scheduledEventRecurrenceRule: ScheduledEventRecurrenceRule - sku: Sku - soundboardSound: SoundboardSound - stageInstance: StageInstance - sticker: Sticker - subscription: Subscription - unfurledMediaItem: UnfurledMediaItem - user: User - userPrimaryGuild: UserPrimaryGuild - voiceState: VoiceState - webhook: Webhook + activityInstance: ActivityInstance; + activityLocation: ActivityLocation; + attachment: Attachment; + avatarDecorationData: AvatarDecorationData; + channel: Channel; + collectibles: Collectibles; + component: Component; + defaultReactionEmoji: DefaultReactionEmoji; + emoji: Emoji; + entitlement: Entitlement; + forumTag: ForumTag; + guild: Guild; + guildOnboarding: GuildOnboarding; + guildOnboardingPrompt: GuildOnboardingPrompt; + guildOnboardingPromptOption: GuildOnboardingPromptOption; + incidentsData: IncidentsData; + interaction: Interaction; + interactionCallback: InteractionCallback; + interactionCallbackResponse: InteractionCallbackResponse; + interactionResource: InteractionResource; + invite: Invite; + inviteStageInstance: InviteStageInstance; + lobby: Lobby; + lobbyMember: LobbyMember; + mediaGalleryItem: MediaGalleryItem; + member: Member; + message: Message; + messageCall: MessageCall; + messageInteraction: MessageInteraction; + messageInteractionMetadata: MessageInteractionMetadata; + messagePin: MessagePin; + messageReference: MessageReference; + messageSnapshot: MessageSnapshot; + nameplate: Nameplate; + poll: Poll; + pollAnswer: PollAnswer; + pollAnswerCount: PollAnswerCount; + pollMedia: PollMedia; + pollResult: PollResult; + role: Role; + roleColors: RoleColors; + scheduledEvent: ScheduledEvent; + scheduledEventRecurrenceRule: ScheduledEventRecurrenceRule; + sku: Sku; + soundboardSound: SoundboardSound; + stageInstance: StageInstance; + sticker: Sticker; + subscription: Subscription; + unfurledMediaItem: UnfurledMediaItem; + user: User; + userPrimaryGuild: UserPrimaryGuild; + voiceState: VoiceState; + webhook: Webhook; } // NOTE: the top-level objects need both the dependencies and alwaysPresents even if empty when the key is specified, this is due the extends & nullability on DesiredPropertiesMetadata @@ -130,107 +130,107 @@ export interface TransformersObjects { export interface TransformersDesiredPropertiesMetadata extends DesiredPropertiesMetadata { channel: { dependencies: { - archived: ['toggles'] - invitable: ['toggles'] - locked: ['toggles'] - nsfw: ['toggles'] - newlyCreated: ['toggles'] - managed: ['toggles'] - } - alwaysPresents: ['toggles', 'internalOverwrites', 'internalThreadMetadata'] - } + archived: ['toggles']; + invitable: ['toggles']; + locked: ['toggles']; + nsfw: ['toggles']; + newlyCreated: ['toggles']; + managed: ['toggles']; + }; + alwaysPresents: ['toggles', 'internalOverwrites', 'internalThreadMetadata']; + }; guild: { dependencies: { - threads: ['channels'] - features: ['toggles'] - } - alwaysPresents: [] - } + threads: ['channels']; + features: ['toggles']; + }; + alwaysPresents: []; + }; interaction: { dependencies: { - respond: ['type', 'token', 'id'] - edit: ['type', 'token', 'id'] - deferEdit: ['type', 'token', 'id'] - defer: ['type', 'token', 'id'] - delete: ['type', 'token'] - } - alwaysPresents: ['bot', 'acknowledged'] - } + respond: ['type', 'token', 'id']; + edit: ['type', 'token', 'id']; + deferEdit: ['type', 'token', 'id']; + defer: ['type', 'token', 'id']; + delete: ['type', 'token']; + }; + alwaysPresents: ['bot', 'acknowledged']; + }; member: { dependencies: { - deaf: ['toggles'] - mute: ['toggles'] - pending: ['toggles'] - flags: ['toggles'] - didRejoin: ['toggles'] - startedOnboarding: ['toggles'] - bypassesVerification: ['toggles'] - completedOnboarding: ['toggles'] - } - alwaysPresents: [] - } + deaf: ['toggles']; + mute: ['toggles']; + pending: ['toggles']; + flags: ['toggles']; + didRejoin: ['toggles']; + startedOnboarding: ['toggles']; + bypassesVerification: ['toggles']; + completedOnboarding: ['toggles']; + }; + alwaysPresents: []; + }; message: { dependencies: { - crossposted: ['flags'] - ephemeral: ['flags'] - failedToMentionSomeRolesInThread: ['flags'] - hasThread: ['flags'] - isCrosspost: ['flags'] - loading: ['flags'] - mentionedUserIds: ['mentions'] - mentionEveryone: ['bitfield'] - pinned: ['bitfield'] - sourceMessageDeleted: ['flags'] - suppressEmbeds: ['flags'] - suppressNotifications: ['flags'] - timestamp: ['id'] - tts: ['bitfield'] - urgent: ['flags'] - } - alwaysPresents: ['bitfield', 'flags'] - } + crossposted: ['flags']; + ephemeral: ['flags']; + failedToMentionSomeRolesInThread: ['flags']; + hasThread: ['flags']; + isCrosspost: ['flags']; + loading: ['flags']; + mentionedUserIds: ['mentions']; + mentionEveryone: ['bitfield']; + pinned: ['bitfield']; + sourceMessageDeleted: ['flags']; + suppressEmbeds: ['flags']; + suppressNotifications: ['flags']; + timestamp: ['id']; + tts: ['bitfield']; + urgent: ['flags']; + }; + alwaysPresents: ['bitfield', 'flags']; + }; role: { dependencies: { - hoist: ['toggles'] - managed: ['toggles'] - mentionable: ['toggles'] - premiumSubscriber: ['toggles'] - availableForPurchase: ['toggles'] - guildConnections: ['toggles'] - } - alwaysPresents: ['internalTags'] - } + hoist: ['toggles']; + managed: ['toggles']; + mentionable: ['toggles']; + premiumSubscriber: ['toggles']; + availableForPurchase: ['toggles']; + guildConnections: ['toggles']; + }; + alwaysPresents: ['internalTags']; + }; user: { dependencies: { - tag: ['username', 'discriminator'] - bot: ['toggles'] - system: ['toggles'] - mfaEnabled: ['toggles'] - verified: ['toggles'] - avatarUrl: ['avatar', 'id'] - displayName: ['username', 'globalName'] - defaultAvatarUrl: ['id', 'discriminator'] - displayAvatarUrl: ['avatar', 'id', 'discriminator'] - createdTimestamp: ['id'] - } - alwaysPresents: [] - } + tag: ['username', 'discriminator']; + bot: ['toggles']; + system: ['toggles']; + mfaEnabled: ['toggles']; + verified: ['toggles']; + avatarUrl: ['avatar', 'id']; + displayName: ['username', 'globalName']; + defaultAvatarUrl: ['id', 'discriminator']; + displayAvatarUrl: ['avatar', 'id', 'discriminator']; + createdTimestamp: ['id']; + }; + alwaysPresents: []; + }; emoji: { dependencies: { - animated: ['toggles'] - available: ['toggles'] - managed: ['toggles'] - requireColons: ['toggles'] - } - alwaysPresents: ['toggles'] - } + animated: ['toggles']; + available: ['toggles']; + managed: ['toggles']; + requireColons: ['toggles']; + }; + alwaysPresents: ['toggles']; + }; } export function createDesiredPropertiesObject, TDefault extends boolean = false>( @@ -859,35 +859,35 @@ export function createDesiredPropertiesObject + } satisfies TransformersDesiredProperties as CompleteDesiredProperties; } /** @private This is subject to breaking changes without notices */ export type KeyByValue = { - [Key in keyof TObj]: TObj[Key] extends TValue ? Key : never -}[keyof TObj] + [Key in keyof TObj]: TObj[Key] extends TValue ? Key : never; +}[keyof TObj]; /** @private This is subject to breaking changes without notices */ export type Complete = { - [K in keyof TObj]-?: undefined extends TObj[K] ? TDefault : Exclude -} + [K in keyof TObj]-?: undefined extends TObj[K] ? TDefault : Exclude; +}; /** @private This is subject to breaking changes without notices */ export type JoinTuple = T extends readonly [infer F extends string, ...infer R extends string[]] ? R['length'] extends 0 ? F : `${F}${TDelimiter}${JoinTuple}` - : '' + : ''; /** @private This is subject to breaking changes without notices */ export type DesiredPropertiesMetadata = { [K in keyof TransformersObjects]: { dependencies?: { - [Key in keyof TransformersObjects[K]]?: (keyof TransformersObjects[K])[] - } - alwaysPresents?: (keyof TransformersObjects[K])[] - } -} + [Key in keyof TransformersObjects[K]]?: (keyof TransformersObjects[K])[]; + }; + alwaysPresents?: (keyof TransformersObjects[K])[]; + }; +}; /** @private This is subject to breaking changes without notices */ export type DesirableProperties< @@ -901,24 +901,24 @@ export type DesirableProperties< | (keyof T extends NonNullable[number] ? never : NonNullable[number]) -> +>; /** @private This is subject to breaking changes without notices */ export type DesiredPropertiesMapper = { - [Key in DesirableProperties]: boolean -} + [Key in DesirableProperties]: boolean; +}; -declare const TypeErrorSymbol: unique symbol +declare const TypeErrorSymbol: unique symbol; /** @private This is subject to breaking changes without notices */ export interface DesiredPropertiesError { - [TypeErrorSymbol]: T + [TypeErrorSymbol]: T; } /** @private This is subject to breaking changes without notices */ export type AreDependenciesSatisfied | undefined, TProps> = { - [K in keyof T]: IsKeyDesired extends true ? true : false -} + [K in keyof T]: IsKeyDesired extends true ? true : false; +}; /** @private This is subject to breaking changes without notices */ export type IsKeyDesired | undefined, TProps> = TKey extends keyof TProps // The key has a desired props? @@ -937,7 +937,7 @@ export type IsKeyDesired | : // No, this is a key to not include DesiredPropertiesError<`This property depends on the following properties: ${JoinTuple[TKey], ', '>}. Not all of these props are set as desired in desiredProperties option in createBot(), so you can't use it. More info here: https://discordeno.js.org/desired-props`> : // No, we include it but it does not have neither props nor dependencies - true + true; /** The behavior it should be used when resolving an undesired property */ export enum DesiredPropertiesBehavior { @@ -954,7 +954,7 @@ export type RemoveKeyIfUndesired] > extends true ? Key - : never + : never; /** @private This is subject to breaking changes without notices */ export type GetErrorWhenUndesired< @@ -968,10 +968,10 @@ export type GetErrorWhenUndesired< TransformersDesiredPropertiesMetadata[KeyByValue]['dependencies'], TProps[KeyByValue] >, -> = TIsDesired extends true ? TransformProperty : TIsDesired +> = TIsDesired extends true ? TransformProperty : TIsDesired; /** @private This is subject to breaking changes without notices */ -export type IsObject = T extends object ? (T extends Function ? false : true) : false +export type IsObject = T extends object ? (T extends Function ? false : true) : false; // If the object is a transformed object, a collection of transformed object or an array of transformed objects we need to apply the desired props to them as well // NOTE: changing the order of these ternaries can cause bugs, for this reason we check in this order: @@ -1015,7 +1015,7 @@ export type TransformProperty } : // No, this is a normal value such as string / bigint / number - T + T; /** * Apply desired properties to a transformer object. @@ -1031,17 +1031,17 @@ export type SetupDesiredProps< : Key]: // When the behavior is to change the type we use the GetErrorWhenUndesired type helper else apply the desired props to the key and return TBehavior extends DesiredPropertiesBehavior.ChangeType ? GetErrorWhenUndesired - : TransformProperty -} + : TransformProperty; +}; /** * The desired properties for each transformer object. */ export type TransformersDesiredProperties = { - [Key in keyof TransformersObjects]: DesiredPropertiesMapper -} + [Key in keyof TransformersObjects]: DesiredPropertiesMapper; +}; /** @private This is subject to breaking changes without notices */ export type CompleteDesiredProperties, TTDefault extends boolean = false> = { - [K in keyof TransformersDesiredProperties]: Complete & T[K], TTDefault> -} + [K in keyof TransformersDesiredProperties]: Complete & T[K], TTDefault>; +}; diff --git a/packages/bot/src/events.ts b/packages/bot/src/events.ts index d110fed2d..fc397408d 100644 --- a/packages/bot/src/events.ts +++ b/packages/bot/src/events.ts @@ -1,6 +1,6 @@ -import type { DiscordGatewayPayload, DiscordRateLimited, DiscordReady, DiscordVoiceChannelEffectAnimationType } from '@discordeno/types' -import type { Collection } from '@discordeno/utils' -import type { DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from './desiredProperties.js' +import type { DiscordGatewayPayload, DiscordRateLimited, DiscordReady, DiscordVoiceChannelEffectAnimationType } from '@discordeno/types'; +import type { Collection } from '@discordeno/utils'; +import type { DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from './desiredProperties.js'; import type { AuditLogEntry, AutoModerationActionExecution, @@ -24,137 +24,137 @@ import type { ThreadMember, User, VoiceState, -} from './transformers/types.js' +} from './transformers/types.js'; export type EventHandlers = { - applicationCommandPermissionsUpdate: (command: GuildApplicationCommandPermissions) => unknown - guildAuditLogEntryCreate: (log: AuditLogEntry, guildId: bigint) => unknown - automodRuleCreate: (rule: AutoModerationRule) => unknown - automodRuleUpdate: (rule: AutoModerationRule) => unknown - automodRuleDelete: (rule: AutoModerationRule) => unknown - automodActionExecution: (payload: AutoModerationActionExecution) => unknown - threadCreate: (thread: SetupDesiredProps) => unknown - threadDelete: (thread: SetupDesiredProps) => unknown + applicationCommandPermissionsUpdate: (command: GuildApplicationCommandPermissions) => unknown; + guildAuditLogEntryCreate: (log: AuditLogEntry, guildId: bigint) => unknown; + automodRuleCreate: (rule: AutoModerationRule) => unknown; + automodRuleUpdate: (rule: AutoModerationRule) => unknown; + automodRuleDelete: (rule: AutoModerationRule) => unknown; + automodActionExecution: (payload: AutoModerationActionExecution) => unknown; + threadCreate: (thread: SetupDesiredProps) => unknown; + threadDelete: (thread: SetupDesiredProps) => unknown; threadListSync: (payload: { - guildId: bigint - channelIds?: bigint[] - threads: SetupDesiredProps[] - members: ThreadMember[] - }) => unknown - threadMemberUpdate: (payload: { id: bigint; guildId: bigint; joinedTimestamp: number; flags: number }) => unknown - threadMembersUpdate: (payload: { id: bigint; guildId: bigint; addedMembers?: ThreadMember[]; removedMemberIds?: bigint[] }) => unknown - threadUpdate: (thread: SetupDesiredProps) => unknown - scheduledEventCreate: (event: SetupDesiredProps) => unknown - scheduledEventUpdate: (event: SetupDesiredProps) => unknown - scheduledEventDelete: (event: SetupDesiredProps) => unknown - scheduledEventUserAdd: (payload: { guildScheduledEventId: bigint; guildId: bigint; userId: bigint }) => unknown - scheduledEventUserRemove: (payload: { guildScheduledEventId: bigint; guildId: bigint; userId: bigint }) => unknown + guildId: bigint; + channelIds?: bigint[]; + threads: SetupDesiredProps[]; + members: ThreadMember[]; + }) => unknown; + threadMemberUpdate: (payload: { id: bigint; guildId: bigint; joinedTimestamp: number; flags: number }) => unknown; + threadMembersUpdate: (payload: { id: bigint; guildId: bigint; addedMembers?: ThreadMember[]; removedMemberIds?: bigint[] }) => unknown; + threadUpdate: (thread: SetupDesiredProps) => unknown; + scheduledEventCreate: (event: SetupDesiredProps) => unknown; + scheduledEventUpdate: (event: SetupDesiredProps) => unknown; + scheduledEventDelete: (event: SetupDesiredProps) => unknown; + scheduledEventUserAdd: (payload: { guildScheduledEventId: bigint; guildId: bigint; userId: bigint }) => unknown; + scheduledEventUserRemove: (payload: { guildScheduledEventId: bigint; guildId: bigint; userId: bigint }) => unknown; ready: ( payload: { - shardId: number - v: number - user: SetupDesiredProps - guilds: bigint[] - sessionId: string - shard?: number[] - applicationId: bigint + shardId: number; + v: number; + user: SetupDesiredProps; + guilds: bigint[]; + sessionId: string; + shard?: number[]; + applicationId: bigint; }, rawPayload: DiscordReady, - ) => unknown - resumed: (shardId: number) => unknown - rateLimited: (data: DiscordRateLimited, shardId: number) => unknown - interactionCreate: (interaction: SetupDesiredProps) => unknown - integrationCreate: (integration: Integration) => unknown - integrationDelete: (payload: { id: bigint; guildId: bigint; applicationId?: bigint }) => unknown - integrationUpdate: (payload: { guildId: bigint }) => unknown - inviteCreate: (invite: SetupDesiredProps) => unknown - inviteDelete: (payload: { channelId: bigint; guildId?: bigint; code: string }) => unknown - guildMemberAdd: (member: SetupDesiredProps, user: SetupDesiredProps) => unknown - guildMemberRemove: (user: SetupDesiredProps, guildId: bigint) => unknown - guildMemberUpdate: (member: SetupDesiredProps, user: SetupDesiredProps) => unknown - guildStickersUpdate: (payload: { guildId: bigint; stickers: SetupDesiredProps[] }) => unknown - messageCreate: (message: SetupDesiredProps) => unknown - messageDelete: (payload: { id: bigint; channelId: bigint; guildId?: bigint }, message?: SetupDesiredProps) => unknown - messageDeleteBulk: (payload: { ids: bigint[]; channelId: bigint; guildId?: bigint }) => unknown - messageUpdate: (message: SetupDesiredProps) => unknown + ) => unknown; + resumed: (shardId: number) => unknown; + rateLimited: (data: DiscordRateLimited, shardId: number) => unknown; + interactionCreate: (interaction: SetupDesiredProps) => unknown; + integrationCreate: (integration: Integration) => unknown; + integrationDelete: (payload: { id: bigint; guildId: bigint; applicationId?: bigint }) => unknown; + integrationUpdate: (payload: { guildId: bigint }) => unknown; + inviteCreate: (invite: SetupDesiredProps) => unknown; + inviteDelete: (payload: { channelId: bigint; guildId?: bigint; code: string }) => unknown; + guildMemberAdd: (member: SetupDesiredProps, user: SetupDesiredProps) => unknown; + guildMemberRemove: (user: SetupDesiredProps, guildId: bigint) => unknown; + guildMemberUpdate: (member: SetupDesiredProps, user: SetupDesiredProps) => unknown; + guildStickersUpdate: (payload: { guildId: bigint; stickers: SetupDesiredProps[] }) => unknown; + messageCreate: (message: SetupDesiredProps) => unknown; + messageDelete: (payload: { id: bigint; channelId: bigint; guildId?: bigint }, message?: SetupDesiredProps) => unknown; + messageDeleteBulk: (payload: { ids: bigint[]; channelId: bigint; guildId?: bigint }) => unknown; + messageUpdate: (message: SetupDesiredProps) => unknown; reactionAdd: (payload: { - userId: bigint - channelId: bigint - messageId: bigint - guildId?: bigint - member?: SetupDesiredProps - user?: SetupDesiredProps - emoji: SetupDesiredProps - messageAuthorId?: bigint - burst: boolean - burstColors?: string[] - }) => unknown + userId: bigint; + channelId: bigint; + messageId: bigint; + guildId?: bigint; + member?: SetupDesiredProps; + user?: SetupDesiredProps; + emoji: SetupDesiredProps; + messageAuthorId?: bigint; + burst: boolean; + burstColors?: string[]; + }) => unknown; reactionRemove: (payload: { - userId: bigint - channelId: bigint - messageId: bigint - guildId?: bigint - emoji: SetupDesiredProps - burst: boolean - }) => unknown + userId: bigint; + channelId: bigint; + messageId: bigint; + guildId?: bigint; + emoji: SetupDesiredProps; + burst: boolean; + }) => unknown; reactionRemoveEmoji: (payload: { - channelId: bigint - messageId: bigint - guildId?: bigint - emoji: SetupDesiredProps - }) => unknown - reactionRemoveAll: (payload: { channelId: bigint; messageId: bigint; guildId?: bigint }) => unknown - presenceUpdate: (presence: PresenceUpdate) => unknown + channelId: bigint; + messageId: bigint; + guildId?: bigint; + emoji: SetupDesiredProps; + }) => unknown; + reactionRemoveAll: (payload: { channelId: bigint; messageId: bigint; guildId?: bigint }) => unknown; + presenceUpdate: (presence: PresenceUpdate) => unknown; voiceChannelEffectSend: (payload: { - channelId: bigint - guildId: bigint - userId: bigint - emoji?: SetupDesiredProps - animationType?: DiscordVoiceChannelEffectAnimationType - animationId?: number - soundId?: bigint | number - soundVolume?: number - }) => unknown - voiceServerUpdate: (payload: { token: string; endpoint?: string; guildId: bigint }) => unknown - voiceStateUpdate: (voiceState: SetupDesiredProps) => unknown - channelCreate: (channel: SetupDesiredProps) => unknown - dispatchRequirements: (data: DiscordGatewayPayload, shardId: number) => unknown - channelDelete: (channel: SetupDesiredProps) => unknown - channelPinsUpdate: (data: { guildId?: bigint; channelId: bigint; lastPinTimestamp?: number }) => unknown - channelUpdate: (channel: SetupDesiredProps) => unknown - stageInstanceCreate: (data: { id: bigint; guildId: bigint; channelId: bigint; topic: string }) => unknown - stageInstanceDelete: (data: { id: bigint; guildId: bigint; channelId: bigint; topic: string }) => unknown - stageInstanceUpdate: (data: { id: bigint; guildId: bigint; channelId: bigint; topic: string }) => unknown - guildEmojisUpdate: (payload: { guildId: bigint; emojis: Collection> }) => unknown - guildBanAdd: (user: SetupDesiredProps, guildId: bigint) => unknown - guildBanRemove: (user: SetupDesiredProps, guildId: bigint) => unknown - guildCreate: (guild: SetupDesiredProps) => unknown - guildDelete: (data: { id: bigint; unavailable: boolean }, shardId: number) => unknown - guildUpdate: (guild: SetupDesiredProps) => unknown - raw: (data: DiscordGatewayPayload, shardId: number) => unknown - roleCreate: (role: SetupDesiredProps) => unknown - roleDelete: (payload: { guildId: bigint; roleId: bigint }) => unknown - roleUpdate: (role: SetupDesiredProps) => unknown - webhooksUpdate: (payload: { channelId: bigint; guildId: bigint }) => unknown - botUpdate: (user: SetupDesiredProps) => unknown + channelId: bigint; + guildId: bigint; + userId: bigint; + emoji?: SetupDesiredProps; + animationType?: DiscordVoiceChannelEffectAnimationType; + animationId?: number; + soundId?: bigint | number; + soundVolume?: number; + }) => unknown; + voiceServerUpdate: (payload: { token: string; endpoint?: string; guildId: bigint }) => unknown; + voiceStateUpdate: (voiceState: SetupDesiredProps) => unknown; + channelCreate: (channel: SetupDesiredProps) => unknown; + dispatchRequirements: (data: DiscordGatewayPayload, shardId: number) => unknown; + channelDelete: (channel: SetupDesiredProps) => unknown; + channelPinsUpdate: (data: { guildId?: bigint; channelId: bigint; lastPinTimestamp?: number }) => unknown; + channelUpdate: (channel: SetupDesiredProps) => unknown; + stageInstanceCreate: (data: { id: bigint; guildId: bigint; channelId: bigint; topic: string }) => unknown; + stageInstanceDelete: (data: { id: bigint; guildId: bigint; channelId: bigint; topic: string }) => unknown; + stageInstanceUpdate: (data: { id: bigint; guildId: bigint; channelId: bigint; topic: string }) => unknown; + guildEmojisUpdate: (payload: { guildId: bigint; emojis: Collection> }) => unknown; + guildBanAdd: (user: SetupDesiredProps, guildId: bigint) => unknown; + guildBanRemove: (user: SetupDesiredProps, guildId: bigint) => unknown; + guildCreate: (guild: SetupDesiredProps) => unknown; + guildDelete: (data: { id: bigint; unavailable: boolean }, shardId: number) => unknown; + guildUpdate: (guild: SetupDesiredProps) => unknown; + raw: (data: DiscordGatewayPayload, shardId: number) => unknown; + roleCreate: (role: SetupDesiredProps) => unknown; + roleDelete: (payload: { guildId: bigint; roleId: bigint }) => unknown; + roleUpdate: (role: SetupDesiredProps) => unknown; + webhooksUpdate: (payload: { channelId: bigint; guildId: bigint }) => unknown; + botUpdate: (user: SetupDesiredProps) => unknown; typingStart: (payload: { - guildId: bigint | undefined - channelId: bigint - userId: bigint - timestamp: number - member: SetupDesiredProps | undefined - }) => unknown - entitlementCreate: (entitlement: SetupDesiredProps) => unknown - entitlementUpdate: (entitlement: SetupDesiredProps) => unknown - entitlementDelete: (entitlement: SetupDesiredProps) => unknown - subscriptionCreate: (subscription: SetupDesiredProps) => unknown - subscriptionUpdate: (subscription: SetupDesiredProps) => unknown - subscriptionDelete: (subscription: SetupDesiredProps) => unknown - messagePollVoteAdd: (payload: { userId: bigint; channelId: bigint; messageId: bigint; guildId?: bigint; answerId: number }) => unknown - messagePollVoteRemove: (payload: { userId: bigint; channelId: bigint; messageId: bigint; guildId?: bigint; answerId: number }) => unknown - soundboardSoundCreate: (payload: SetupDesiredProps) => unknown - soundboardSoundUpdate: (payload: SetupDesiredProps) => unknown - soundboardSoundDelete: (payload: { soundId: bigint; guildId: bigint }) => unknown - soundboardSoundsUpdate: (payload: { soundboardSounds: SetupDesiredProps[]; guildId: bigint }) => unknown - soundboardSounds: (payload: { soundboardSounds: SetupDesiredProps[]; guildId: bigint }) => unknown -} + guildId: bigint | undefined; + channelId: bigint; + userId: bigint; + timestamp: number; + member: SetupDesiredProps | undefined; + }) => unknown; + entitlementCreate: (entitlement: SetupDesiredProps) => unknown; + entitlementUpdate: (entitlement: SetupDesiredProps) => unknown; + entitlementDelete: (entitlement: SetupDesiredProps) => unknown; + subscriptionCreate: (subscription: SetupDesiredProps) => unknown; + subscriptionUpdate: (subscription: SetupDesiredProps) => unknown; + subscriptionDelete: (subscription: SetupDesiredProps) => unknown; + messagePollVoteAdd: (payload: { userId: bigint; channelId: bigint; messageId: bigint; guildId?: bigint; answerId: number }) => unknown; + messagePollVoteRemove: (payload: { userId: bigint; channelId: bigint; messageId: bigint; guildId?: bigint; answerId: number }) => unknown; + soundboardSoundCreate: (payload: SetupDesiredProps) => unknown; + soundboardSoundUpdate: (payload: SetupDesiredProps) => unknown; + soundboardSoundDelete: (payload: { soundId: bigint; guildId: bigint }) => unknown; + soundboardSoundsUpdate: (payload: { soundboardSounds: SetupDesiredProps[]; guildId: bigint }) => unknown; + soundboardSounds: (payload: { soundboardSounds: SetupDesiredProps[]; guildId: bigint }) => unknown; +}; diff --git a/packages/bot/src/handlers.ts b/packages/bot/src/handlers.ts index e55e3ab49..5fc4c6e85 100644 --- a/packages/bot/src/handlers.ts +++ b/packages/bot/src/handlers.ts @@ -1,12 +1,12 @@ -import type { DiscordGatewayPayload, GatewayDispatchEventNames } from '@discordeno/types' -import type { Bot } from './bot.js' -import type { DesiredPropertiesBehavior, TransformersDesiredProperties } from './desiredProperties.js' -import * as handlers from './handlers/index.js' +import type { DiscordGatewayPayload, GatewayDispatchEventNames } from '@discordeno/types'; +import type { Bot } from './bot.js'; +import type { DesiredPropertiesBehavior, TransformersDesiredProperties } from './desiredProperties.js'; +import * as handlers from './handlers/index.js'; export function createBotGatewayHandlers( options: Partial>, ): GatewayHandlers { - const _options = options as Partial> + const _options = options as Partial>; return { APPLICATION_COMMAND_PERMISSIONS_UPDATE: _options.APPLICATION_COMMAND_PERMISSIONS_UPDATE ?? handlers.handleApplicationCommandPermissionsUpdate, @@ -85,16 +85,16 @@ export function createBotGatewayHandlers as unknown as GatewayHandlers + } satisfies GatewayHandlers as unknown as GatewayHandlers; } export type GatewayHandlers = Record< GatewayDispatchEventNames, BotGatewayHandler -> +>; export type BotGatewayHandler = ( bot: Bot, data: DiscordGatewayPayload, shardId: number, -) => unknown +) => unknown; diff --git a/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts b/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts index 5f9115c56..ddc1f24ec 100644 --- a/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts +++ b/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts @@ -1,11 +1,11 @@ -import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleChannelCreate(bot: Bot, payload: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.channelCreate) return + if (!bot.events.channelCreate) return; - const data = payload.d as DiscordChannel - const channel = bot.transformers.channel(bot, data, { guildId: data.guild_id }) + const data = payload.d as DiscordChannel; + const channel = bot.transformers.channel(bot, data, { guildId: data.guild_id }); - bot.events.channelCreate(channel) + bot.events.channelCreate(channel); } diff --git a/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts b/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts index cbf477771..53891a1e2 100644 --- a/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts +++ b/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts @@ -1,10 +1,10 @@ -import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleChannelDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.channelDelete) return + if (!bot.events.channelDelete) return; - const payload = data.d as DiscordChannel + const payload = data.d as DiscordChannel; - bot.events.channelDelete(bot.transformers.channel(bot, payload, { guildId: payload.guild_id })) + bot.events.channelDelete(bot.transformers.channel(bot, payload, { guildId: payload.guild_id })); } diff --git a/packages/bot/src/handlers/channels/CHANNEL_PINS_UPDATE.ts b/packages/bot/src/handlers/channels/CHANNEL_PINS_UPDATE.ts index e85131fd9..cf345b5c5 100644 --- a/packages/bot/src/handlers/channels/CHANNEL_PINS_UPDATE.ts +++ b/packages/bot/src/handlers/channels/CHANNEL_PINS_UPDATE.ts @@ -1,14 +1,14 @@ -import type { DiscordChannelPinsUpdate, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordChannelPinsUpdate, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleChannelPinsUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.channelPinsUpdate) return + if (!bot.events.channelPinsUpdate) return; - const payload = data.d as DiscordChannelPinsUpdate + const payload = data.d as DiscordChannelPinsUpdate; bot.events.channelPinsUpdate({ guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, channelId: bot.transformers.snowflake(payload.channel_id), lastPinTimestamp: payload.last_pin_timestamp ? Date.parse(payload.last_pin_timestamp) : undefined, - }) + }); } diff --git a/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts b/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts index e787b10e7..942a9f219 100644 --- a/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts +++ b/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts @@ -1,11 +1,11 @@ -import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleChannelUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.channelUpdate) return + if (!bot.events.channelUpdate) return; - const payload = data.d as DiscordChannel - const channel = bot.transformers.channel(bot, payload) + const payload = data.d as DiscordChannel; + const channel = bot.transformers.channel(bot, payload); - bot.events.channelUpdate(channel) + bot.events.channelUpdate(channel); } diff --git a/packages/bot/src/handlers/channels/STAGE_INSTANCE_CREATE.ts b/packages/bot/src/handlers/channels/STAGE_INSTANCE_CREATE.ts index 13371637f..16df8f90d 100644 --- a/packages/bot/src/handlers/channels/STAGE_INSTANCE_CREATE.ts +++ b/packages/bot/src/handlers/channels/STAGE_INSTANCE_CREATE.ts @@ -1,15 +1,15 @@ -import type { DiscordGatewayPayload, DiscordStageInstance } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordStageInstance } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleStageInstanceCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.stageInstanceCreate) return + if (!bot.events.stageInstanceCreate) return; - const payload = data.d as DiscordStageInstance + const payload = data.d as DiscordStageInstance; bot.events.stageInstanceCreate({ id: bot.transformers.snowflake(payload.id), guildId: bot.transformers.snowflake(payload.guild_id), channelId: bot.transformers.snowflake(payload.channel_id), topic: payload.topic, - }) + }); } diff --git a/packages/bot/src/handlers/channels/STAGE_INSTANCE_DELETE.ts b/packages/bot/src/handlers/channels/STAGE_INSTANCE_DELETE.ts index 85ffce523..39db4c8bd 100644 --- a/packages/bot/src/handlers/channels/STAGE_INSTANCE_DELETE.ts +++ b/packages/bot/src/handlers/channels/STAGE_INSTANCE_DELETE.ts @@ -1,15 +1,15 @@ -import type { DiscordGatewayPayload, DiscordStageInstance } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordStageInstance } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleStageInstanceDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.stageInstanceDelete) return + if (!bot.events.stageInstanceDelete) return; - const payload = data.d as DiscordStageInstance + const payload = data.d as DiscordStageInstance; bot.events.stageInstanceDelete({ id: bot.transformers.snowflake(payload.id), guildId: bot.transformers.snowflake(payload.guild_id), channelId: bot.transformers.snowflake(payload.channel_id), topic: payload.topic, - }) + }); } diff --git a/packages/bot/src/handlers/channels/STAGE_INSTANCE_UPDATE.ts b/packages/bot/src/handlers/channels/STAGE_INSTANCE_UPDATE.ts index febad080b..814b4f115 100644 --- a/packages/bot/src/handlers/channels/STAGE_INSTANCE_UPDATE.ts +++ b/packages/bot/src/handlers/channels/STAGE_INSTANCE_UPDATE.ts @@ -1,15 +1,15 @@ -import type { DiscordGatewayPayload, DiscordStageInstance } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordStageInstance } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleStageInstanceUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.stageInstanceUpdate) return + if (!bot.events.stageInstanceUpdate) return; - const payload = data.d as DiscordStageInstance + const payload = data.d as DiscordStageInstance; bot.events.stageInstanceUpdate({ id: bot.transformers.snowflake(payload.id), guildId: bot.transformers.snowflake(payload.guild_id), channelId: bot.transformers.snowflake(payload.channel_id), topic: payload.topic, - }) + }); } diff --git a/packages/bot/src/handlers/channels/THREAD_CREATE.ts b/packages/bot/src/handlers/channels/THREAD_CREATE.ts index 5942694cd..c91f96ba7 100644 --- a/packages/bot/src/handlers/channels/THREAD_CREATE.ts +++ b/packages/bot/src/handlers/channels/THREAD_CREATE.ts @@ -1,10 +1,10 @@ -import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleThreadCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.threadCreate) return + if (!bot.events.threadCreate) return; - const payload = data.d as DiscordChannel + const payload = data.d as DiscordChannel; - bot.events.threadCreate(bot.transformers.channel(bot, payload)) + bot.events.threadCreate(bot.transformers.channel(bot, payload)); } diff --git a/packages/bot/src/handlers/channels/THREAD_DELETE.ts b/packages/bot/src/handlers/channels/THREAD_DELETE.ts index 0aa66f008..d05da8f35 100644 --- a/packages/bot/src/handlers/channels/THREAD_DELETE.ts +++ b/packages/bot/src/handlers/channels/THREAD_DELETE.ts @@ -1,10 +1,10 @@ -import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleThreadDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.threadDelete) return + if (!bot.events.threadDelete) return; - const payload = data.d as DiscordChannel + const payload = data.d as DiscordChannel; - bot.events.threadDelete(bot.transformers.channel(bot, payload)) + bot.events.threadDelete(bot.transformers.channel(bot, payload)); } diff --git a/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts b/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts index 49210d3d1..4ac4680b5 100644 --- a/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts +++ b/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts @@ -1,12 +1,12 @@ -import type { DiscordGatewayPayload, DiscordThreadListSync } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordThreadListSync } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleThreadListSync(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.threadListSync) return + if (!bot.events.threadListSync) return; - const payload = data.d as DiscordThreadListSync + const payload = data.d as DiscordThreadListSync; - const guildId = bot.transformers.snowflake(payload.guild_id) + const guildId = bot.transformers.snowflake(payload.guild_id); bot.events.threadListSync({ guildId, @@ -18,5 +18,5 @@ export async function handleThreadListSync(bot: Bot, data: DiscordGatewayPayload joinTimestamp: Date.parse(member.join_timestamp), flags: member.flags, })), - }) + }); } diff --git a/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts b/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts index c189566c6..8e81f468e 100644 --- a/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts +++ b/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts @@ -1,15 +1,15 @@ -import type { DiscordGatewayPayload, DiscordThreadMembersUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordThreadMembersUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleThreadMembersUpdate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.threadMembersUpdate) return + if (!bot.events.threadMembersUpdate) return; - const payload = data.d as DiscordThreadMembersUpdate + const payload = data.d as DiscordThreadMembersUpdate; bot.events.threadMembersUpdate({ id: bot.transformers.snowflake(payload.id), guildId: bot.transformers.snowflake(payload.guild_id), addedMembers: payload.added_members?.map((member) => bot.transformers.threadMember?.(bot, member, { guildId: payload.guild_id })), removedMemberIds: payload.removed_member_ids?.map((id) => bot.transformers.snowflake(id)), - }) + }); } diff --git a/packages/bot/src/handlers/channels/THREAD_MEMBER_UPDATE.ts b/packages/bot/src/handlers/channels/THREAD_MEMBER_UPDATE.ts index 3591e299e..67d081c46 100644 --- a/packages/bot/src/handlers/channels/THREAD_MEMBER_UPDATE.ts +++ b/packages/bot/src/handlers/channels/THREAD_MEMBER_UPDATE.ts @@ -1,15 +1,15 @@ -import type { DiscordGatewayPayload, DiscordThreadMemberUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordThreadMemberUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleThreadMemberUpdate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.threadMemberUpdate) return + if (!bot.events.threadMemberUpdate) return; - const payload = data.d as DiscordThreadMemberUpdate + const payload = data.d as DiscordThreadMemberUpdate; bot.events.threadMemberUpdate({ id: bot.transformers.snowflake(payload.id), guildId: bot.transformers.snowflake(payload.guild_id), joinedTimestamp: Date.parse(payload.join_timestamp), flags: payload.flags, - }) + }); } diff --git a/packages/bot/src/handlers/channels/THREAD_UPDATE.ts b/packages/bot/src/handlers/channels/THREAD_UPDATE.ts index 2b5e0031c..5ef9da56c 100644 --- a/packages/bot/src/handlers/channels/THREAD_UPDATE.ts +++ b/packages/bot/src/handlers/channels/THREAD_UPDATE.ts @@ -1,10 +1,10 @@ -import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordChannel, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleThreadUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.threadUpdate) return + if (!bot.events.threadUpdate) return; - const payload = data.d as DiscordChannel + const payload = data.d as DiscordChannel; - bot.events.threadUpdate(bot.transformers.channel(bot, payload)) + bot.events.threadUpdate(bot.transformers.channel(bot, payload)); } diff --git a/packages/bot/src/handlers/channels/index.ts b/packages/bot/src/handlers/channels/index.ts index 5e61f52d1..cfdceab2a 100644 --- a/packages/bot/src/handlers/channels/index.ts +++ b/packages/bot/src/handlers/channels/index.ts @@ -1,13 +1,13 @@ -export * from './CHANNEL_CREATE.js' -export * from './CHANNEL_DELETE.js' -export * from './CHANNEL_PINS_UPDATE.js' -export * from './CHANNEL_UPDATE.js' -export * from './STAGE_INSTANCE_CREATE.js' -export * from './STAGE_INSTANCE_DELETE.js' -export * from './STAGE_INSTANCE_UPDATE.js' -export * from './THREAD_CREATE.js' -export * from './THREAD_DELETE.js' -export * from './THREAD_LIST_SYNC.js' -export * from './THREAD_MEMBER_UPDATE.js' -export * from './THREAD_MEMBERS_UPDATE.js' -export * from './THREAD_UPDATE.js' +export * from './CHANNEL_CREATE.js'; +export * from './CHANNEL_DELETE.js'; +export * from './CHANNEL_PINS_UPDATE.js'; +export * from './CHANNEL_UPDATE.js'; +export * from './STAGE_INSTANCE_CREATE.js'; +export * from './STAGE_INSTANCE_DELETE.js'; +export * from './STAGE_INSTANCE_UPDATE.js'; +export * from './THREAD_CREATE.js'; +export * from './THREAD_DELETE.js'; +export * from './THREAD_LIST_SYNC.js'; +export * from './THREAD_MEMBER_UPDATE.js'; +export * from './THREAD_MEMBERS_UPDATE.js'; +export * from './THREAD_UPDATE.js'; diff --git a/packages/bot/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts b/packages/bot/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts index 42869208f..24e1b4f5e 100644 --- a/packages/bot/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts +++ b/packages/bot/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordGuildEmojisUpdate } from '@discordeno/types' -import { Collection } from '@discordeno/utils' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildEmojisUpdate } from '@discordeno/types'; +import { Collection } from '@discordeno/utils'; +import type { Bot } from '../../bot.js'; export async function handleGuildEmojisUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.guildEmojisUpdate) return + if (!bot.events.guildEmojisUpdate) return; - const payload = data.d as DiscordGuildEmojisUpdate + const payload = data.d as DiscordGuildEmojisUpdate; bot.events.guildEmojisUpdate({ guildId: bot.transformers.snowflake(payload.guild_id), emojis: new Collection(payload.emojis.map((emoji) => [bot.transformers.snowflake(emoji.id!), bot.transformers.emoji(bot, emoji)])), - }) + }); } diff --git a/packages/bot/src/handlers/emojis/index.ts b/packages/bot/src/handlers/emojis/index.ts index f98466c7d..8a01f0aee 100644 --- a/packages/bot/src/handlers/emojis/index.ts +++ b/packages/bot/src/handlers/emojis/index.ts @@ -1 +1 @@ -export * from './GUILD_EMOJIS_UPDATE.js' +export * from './GUILD_EMOJIS_UPDATE.js'; diff --git a/packages/bot/src/handlers/entitlements/ENTITLEMENT_CREATE.ts b/packages/bot/src/handlers/entitlements/ENTITLEMENT_CREATE.ts index 24c701e2a..a19bd4fa9 100644 --- a/packages/bot/src/handlers/entitlements/ENTITLEMENT_CREATE.ts +++ b/packages/bot/src/handlers/entitlements/ENTITLEMENT_CREATE.ts @@ -1,9 +1,9 @@ -import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleEntitlementCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.entitlementCreate) return + if (!bot.events.entitlementCreate) return; - const payload = data.d as DiscordEntitlement - bot.events.entitlementCreate(bot.transformers.entitlement(bot, payload)) + const payload = data.d as DiscordEntitlement; + bot.events.entitlementCreate(bot.transformers.entitlement(bot, payload)); } diff --git a/packages/bot/src/handlers/entitlements/ENTITLEMENT_DELETE.ts b/packages/bot/src/handlers/entitlements/ENTITLEMENT_DELETE.ts index 742296dfc..05fe5d074 100644 --- a/packages/bot/src/handlers/entitlements/ENTITLEMENT_DELETE.ts +++ b/packages/bot/src/handlers/entitlements/ENTITLEMENT_DELETE.ts @@ -1,9 +1,9 @@ -import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleEntitlementDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.entitlementDelete) return + if (!bot.events.entitlementDelete) return; - const payload = data.d as DiscordEntitlement - bot.events.entitlementDelete(bot.transformers.entitlement(bot, payload)) + const payload = data.d as DiscordEntitlement; + bot.events.entitlementDelete(bot.transformers.entitlement(bot, payload)); } diff --git a/packages/bot/src/handlers/entitlements/ENTITLEMENT_UPDATE.ts b/packages/bot/src/handlers/entitlements/ENTITLEMENT_UPDATE.ts index fe9c764f4..b72200f2d 100644 --- a/packages/bot/src/handlers/entitlements/ENTITLEMENT_UPDATE.ts +++ b/packages/bot/src/handlers/entitlements/ENTITLEMENT_UPDATE.ts @@ -1,9 +1,9 @@ -import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordEntitlement, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleEntitlementUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.entitlementUpdate) return + if (!bot.events.entitlementUpdate) return; - const payload = data.d as DiscordEntitlement - bot.events.entitlementUpdate(bot.transformers.entitlement(bot, payload)) + const payload = data.d as DiscordEntitlement; + bot.events.entitlementUpdate(bot.transformers.entitlement(bot, payload)); } diff --git a/packages/bot/src/handlers/entitlements/index.ts b/packages/bot/src/handlers/entitlements/index.ts index 920971554..47f0f2d86 100644 --- a/packages/bot/src/handlers/entitlements/index.ts +++ b/packages/bot/src/handlers/entitlements/index.ts @@ -1,3 +1,3 @@ -export * from './ENTITLEMENT_CREATE.js' -export * from './ENTITLEMENT_DELETE.js' -export * from './ENTITLEMENT_UPDATE.js' +export * from './ENTITLEMENT_CREATE.js'; +export * from './ENTITLEMENT_DELETE.js'; +export * from './ENTITLEMENT_UPDATE.js'; diff --git a/packages/bot/src/handlers/guilds/GUILD_AUDIT_LOG_ENTRY_CREATE.ts b/packages/bot/src/handlers/guilds/GUILD_AUDIT_LOG_ENTRY_CREATE.ts index 7c058d881..90cf6bce9 100644 --- a/packages/bot/src/handlers/guilds/GUILD_AUDIT_LOG_ENTRY_CREATE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_AUDIT_LOG_ENTRY_CREATE.ts @@ -1,10 +1,10 @@ -import type { DiscordAuditLogEntry, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordAuditLogEntry, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildAuditLogEntryCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.guildAuditLogEntryCreate) return + if (!bot.events.guildAuditLogEntryCreate) return; // TODO: better type here - const payload = data.d as DiscordAuditLogEntry & { guild_id: string } - bot.events.guildAuditLogEntryCreate(bot.transformers.auditLogEntry(bot, payload), bot.transformers.snowflake(payload.guild_id)) + const payload = data.d as DiscordAuditLogEntry & { guild_id: string }; + bot.events.guildAuditLogEntryCreate(bot.transformers.auditLogEntry(bot, payload), bot.transformers.snowflake(payload.guild_id)); } diff --git a/packages/bot/src/handlers/guilds/GUILD_BAN_ADD.ts b/packages/bot/src/handlers/guilds/GUILD_BAN_ADD.ts index 5e81c85b0..392685b70 100644 --- a/packages/bot/src/handlers/guilds/GUILD_BAN_ADD.ts +++ b/packages/bot/src/handlers/guilds/GUILD_BAN_ADD.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordGuildBanAddRemove } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildBanAddRemove } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildBanAdd(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.guildBanAdd) return + if (!bot.events.guildBanAdd) return; - const payload = data.d as DiscordGuildBanAddRemove - bot.events.guildBanAdd(bot.transformers.user(bot, payload.user), bot.transformers.snowflake(payload.guild_id)) + const payload = data.d as DiscordGuildBanAddRemove; + bot.events.guildBanAdd(bot.transformers.user(bot, payload.user), bot.transformers.snowflake(payload.guild_id)); } diff --git a/packages/bot/src/handlers/guilds/GUILD_BAN_REMOVE.ts b/packages/bot/src/handlers/guilds/GUILD_BAN_REMOVE.ts index 91d7488fd..be309e559 100644 --- a/packages/bot/src/handlers/guilds/GUILD_BAN_REMOVE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_BAN_REMOVE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordGuildBanAddRemove } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildBanAddRemove } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildBanRemove(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.guildBanRemove) return + if (!bot.events.guildBanRemove) return; - const payload = data.d as DiscordGuildBanAddRemove + const payload = data.d as DiscordGuildBanAddRemove; - await bot.events.guildBanRemove(bot.transformers.user(bot, payload.user), bot.transformers.snowflake(payload.guild_id)) + await bot.events.guildBanRemove(bot.transformers.user(bot, payload.user), bot.transformers.snowflake(payload.guild_id)); } diff --git a/packages/bot/src/handlers/guilds/GUILD_CREATE.ts b/packages/bot/src/handlers/guilds/GUILD_CREATE.ts index aad323629..f07ea89e1 100644 --- a/packages/bot/src/handlers/guilds/GUILD_CREATE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_CREATE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordGuild } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuild } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.guildCreate) return + if (!bot.events.guildCreate) return; - const payload = data.d as DiscordGuild - bot.events.guildCreate(bot.transformers.guild(bot, payload, { shardId })) + const payload = data.d as DiscordGuild; + bot.events.guildCreate(bot.transformers.guild(bot, payload, { shardId })); } diff --git a/packages/bot/src/handlers/guilds/GUILD_DELETE.ts b/packages/bot/src/handlers/guilds/GUILD_DELETE.ts index 9c540955a..4d068f141 100644 --- a/packages/bot/src/handlers/guilds/GUILD_DELETE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_DELETE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordUnavailableGuild } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordUnavailableGuild } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildDelete(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.guildDelete) return + if (!bot.events.guildDelete) return; - const payload = data.d as DiscordUnavailableGuild + const payload = data.d as DiscordUnavailableGuild; bot.events.guildDelete( { @@ -12,5 +12,5 @@ export async function handleGuildDelete(bot: Bot, data: DiscordGatewayPayload, s unavailable: payload.unavailable ?? false, }, shardId, - ) + ); } diff --git a/packages/bot/src/handlers/guilds/GUILD_INTEGRATIONS_UPDATE.ts b/packages/bot/src/handlers/guilds/GUILD_INTEGRATIONS_UPDATE.ts index b40cd8928..0e23b72ef 100644 --- a/packages/bot/src/handlers/guilds/GUILD_INTEGRATIONS_UPDATE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_INTEGRATIONS_UPDATE.ts @@ -1,12 +1,12 @@ -import type { DiscordGatewayPayload, DiscordGuildIntegrationsUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildIntegrationsUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildIntegrationsUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.integrationUpdate) return + if (!bot.events.integrationUpdate) return; - const payload = data.d as DiscordGuildIntegrationsUpdate + const payload = data.d as DiscordGuildIntegrationsUpdate; bot.events.integrationUpdate({ guildId: bot.transformers.snowflake(payload.guild_id), - }) + }); } diff --git a/packages/bot/src/handlers/guilds/GUILD_STICKERS_UPDATE.ts b/packages/bot/src/handlers/guilds/GUILD_STICKERS_UPDATE.ts index d03cc3a13..ab3f14ca1 100644 --- a/packages/bot/src/handlers/guilds/GUILD_STICKERS_UPDATE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_STICKERS_UPDATE.ts @@ -1,16 +1,16 @@ -import type { DiscordGatewayPayload, DiscordGuildStickersUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildStickersUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildStickersUpdate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.guildStickersUpdate) return + if (!bot.events.guildStickersUpdate) return; - const payload = data.d as DiscordGuildStickersUpdate + const payload = data.d as DiscordGuildStickersUpdate; bot.events.guildStickersUpdate({ guildId: bot.transformers.snowflake(payload.guild_id), stickers: payload.stickers.map((sticker) => { - sticker.guild_id = payload.guild_id - return bot.transformers.sticker(bot, sticker) + sticker.guild_id = payload.guild_id; + return bot.transformers.sticker(bot, sticker); }), - }) + }); } diff --git a/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts b/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts index 18fe12855..7e42ce17a 100644 --- a/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordGuild } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuild } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildUpdate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.guildUpdate) return + if (!bot.events.guildUpdate) return; - const payload = data.d as DiscordGuild + const payload = data.d as DiscordGuild; - bot.events.guildUpdate(bot.transformers.guild(bot, payload, { shardId })) + bot.events.guildUpdate(bot.transformers.guild(bot, payload, { shardId })); } diff --git a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_ACTION_EXECUTION.ts b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_ACTION_EXECUTION.ts index ad153f126..776466c88 100644 --- a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_ACTION_EXECUTION.ts +++ b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_ACTION_EXECUTION.ts @@ -1,10 +1,10 @@ -import type { DiscordAutoModerationActionExecution, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordAutoModerationActionExecution, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; /** Requires the MANAGE_GUILD permission. */ export async function handleAutoModerationActionExecution(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.automodActionExecution) return + if (!bot.events.automodActionExecution) return; - const payload = data.d as DiscordAutoModerationActionExecution - bot.events.automodActionExecution(bot.transformers.automodActionExecution(bot, payload)) + const payload = data.d as DiscordAutoModerationActionExecution; + bot.events.automodActionExecution(bot.transformers.automodActionExecution(bot, payload)); } diff --git a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_CREATE.ts b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_CREATE.ts index 56b8307a6..3abe3c7aa 100644 --- a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_CREATE.ts +++ b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_CREATE.ts @@ -1,10 +1,10 @@ -import type { DiscordAutoModerationRule, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordAutoModerationRule, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; /** Requires the MANAGE_GUILD permission. */ export async function handleAutoModerationRuleCreate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.automodRuleCreate) return + if (!bot.events.automodRuleCreate) return; - const payload = data.d as DiscordAutoModerationRule - bot.events.automodRuleCreate(bot.transformers.automodRule(bot, payload)) + const payload = data.d as DiscordAutoModerationRule; + bot.events.automodRuleCreate(bot.transformers.automodRule(bot, payload)); } diff --git a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_DELETE.ts b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_DELETE.ts index 1b32764da..076ef4211 100644 --- a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_DELETE.ts +++ b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_DELETE.ts @@ -1,10 +1,10 @@ -import type { DiscordAutoModerationRule, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordAutoModerationRule, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; /** Requires the MANAGE_GUILD permission. */ export async function handleAutoModerationRuleDelete(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.automodRuleDelete) return + if (!bot.events.automodRuleDelete) return; - const payload = data.d as DiscordAutoModerationRule - bot.events.automodRuleDelete(bot.transformers.automodRule(bot, payload)) + const payload = data.d as DiscordAutoModerationRule; + bot.events.automodRuleDelete(bot.transformers.automodRule(bot, payload)); } diff --git a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_UPDATE.ts b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_UPDATE.ts index 8e84211cf..74d9b40bd 100644 --- a/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_UPDATE.ts +++ b/packages/bot/src/handlers/guilds/automod/AUTO_MODERATION_RULE_UPDATE.ts @@ -1,10 +1,10 @@ -import type { DiscordAutoModerationRule, DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordAutoModerationRule, DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; /** Requires the MANAGE_GUILD permission. */ export async function handleAutoModerationRuleUpdate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.automodRuleUpdate) return + if (!bot.events.automodRuleUpdate) return; - const payload = data.d as DiscordAutoModerationRule - bot.events.automodRuleUpdate(bot.transformers.automodRule(bot, payload)) + const payload = data.d as DiscordAutoModerationRule; + bot.events.automodRuleUpdate(bot.transformers.automodRule(bot, payload)); } diff --git a/packages/bot/src/handlers/guilds/automod/index.ts b/packages/bot/src/handlers/guilds/automod/index.ts index c47db435f..44694afae 100644 --- a/packages/bot/src/handlers/guilds/automod/index.ts +++ b/packages/bot/src/handlers/guilds/automod/index.ts @@ -1,4 +1,4 @@ -export * from './AUTO_MODERATION_ACTION_EXECUTION.js' -export * from './AUTO_MODERATION_RULE_CREATE.js' -export * from './AUTO_MODERATION_RULE_DELETE.js' -export * from './AUTO_MODERATION_RULE_UPDATE.js' +export * from './AUTO_MODERATION_ACTION_EXECUTION.js'; +export * from './AUTO_MODERATION_RULE_CREATE.js'; +export * from './AUTO_MODERATION_RULE_DELETE.js'; +export * from './AUTO_MODERATION_RULE_UPDATE.js'; diff --git a/packages/bot/src/handlers/guilds/index.ts b/packages/bot/src/handlers/guilds/index.ts index a67ad513b..4c5341e58 100644 --- a/packages/bot/src/handlers/guilds/index.ts +++ b/packages/bot/src/handlers/guilds/index.ts @@ -1,10 +1,10 @@ -export * from './automod/index.js' -export * from './GUILD_AUDIT_LOG_ENTRY_CREATE.js' -export * from './GUILD_BAN_ADD.js' -export * from './GUILD_BAN_REMOVE.js' -export * from './GUILD_CREATE.js' -export * from './GUILD_DELETE.js' -export * from './GUILD_INTEGRATIONS_UPDATE.js' -export * from './GUILD_STICKERS_UPDATE.js' -export * from './GUILD_UPDATE.js' -export * from './scheduledEvents/index.js' +export * from './automod/index.js'; +export * from './GUILD_AUDIT_LOG_ENTRY_CREATE.js'; +export * from './GUILD_BAN_ADD.js'; +export * from './GUILD_BAN_REMOVE.js'; +export * from './GUILD_CREATE.js'; +export * from './GUILD_DELETE.js'; +export * from './GUILD_INTEGRATIONS_UPDATE.js'; +export * from './GUILD_STICKERS_UPDATE.js'; +export * from './GUILD_UPDATE.js'; +export * from './scheduledEvents/index.js'; diff --git a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_CREATE.ts b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_CREATE.ts index 2e63d7c96..766c8a33d 100644 --- a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_CREATE.ts +++ b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_CREATE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordScheduledEvent } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordGatewayPayload, DiscordScheduledEvent } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; export async function handleGuildScheduledEventCreate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.scheduledEventCreate) return + if (!bot.events.scheduledEventCreate) return; - const payload = data.d as DiscordScheduledEvent - bot.events.scheduledEventCreate(bot.transformers.scheduledEvent(bot, payload)) + const payload = data.d as DiscordScheduledEvent; + bot.events.scheduledEventCreate(bot.transformers.scheduledEvent(bot, payload)); } diff --git a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_DELETE.ts b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_DELETE.ts index ea51d6bac..7f70b4f12 100644 --- a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_DELETE.ts +++ b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_DELETE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordScheduledEvent } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordGatewayPayload, DiscordScheduledEvent } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; export async function handleGuildScheduledEventDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.scheduledEventDelete) return + if (!bot.events.scheduledEventDelete) return; - const payload = data.d as DiscordScheduledEvent - bot.events.scheduledEventDelete(bot.transformers.scheduledEvent(bot, payload)) + const payload = data.d as DiscordScheduledEvent; + bot.events.scheduledEventDelete(bot.transformers.scheduledEvent(bot, payload)); } diff --git a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_UPDATE.ts b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_UPDATE.ts index 3dac5cf3d..f193a39eb 100644 --- a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_UPDATE.ts +++ b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_UPDATE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordScheduledEvent } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordGatewayPayload, DiscordScheduledEvent } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; export async function handleGuildScheduledEventUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.scheduledEventUpdate) return + if (!bot.events.scheduledEventUpdate) return; - const payload = data.d as DiscordScheduledEvent - bot.events.scheduledEventUpdate(bot.transformers.scheduledEvent(bot, payload)) + const payload = data.d as DiscordScheduledEvent; + bot.events.scheduledEventUpdate(bot.transformers.scheduledEvent(bot, payload)); } diff --git a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_ADD.ts b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_ADD.ts index 0d8395458..d7ac08876 100644 --- a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_ADD.ts +++ b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_ADD.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordScheduledEventUserAdd } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordGatewayPayload, DiscordScheduledEventUserAdd } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; export async function handleGuildScheduledEventUserAdd(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.scheduledEventUserAdd) return + if (!bot.events.scheduledEventUserAdd) return; - const payload = data.d as DiscordScheduledEventUserAdd + const payload = data.d as DiscordScheduledEventUserAdd; bot.events.scheduledEventUserAdd({ guildScheduledEventId: bot.transformers.snowflake(payload.guild_scheduled_event_id), userId: bot.transformers.snowflake(payload.user_id), guildId: bot.transformers.snowflake(payload.guild_id), - }) + }); } diff --git a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_REMOVE.ts b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_REMOVE.ts index 0fe50d865..e2b011079 100644 --- a/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_REMOVE.ts +++ b/packages/bot/src/handlers/guilds/scheduledEvents/GUILD_SCHEDULED_EVENT_USER_REMOVE.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordScheduledEventUserRemove } from '@discordeno/types' -import type { Bot } from '../../../bot.js' +import type { DiscordGatewayPayload, DiscordScheduledEventUserRemove } from '@discordeno/types'; +import type { Bot } from '../../../bot.js'; export async function handleGuildScheduledEventUserRemove(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.scheduledEventUserRemove) return + if (!bot.events.scheduledEventUserRemove) return; - const payload = data.d as DiscordScheduledEventUserRemove + const payload = data.d as DiscordScheduledEventUserRemove; bot.events.scheduledEventUserRemove({ guildScheduledEventId: bot.transformers.snowflake(payload.guild_scheduled_event_id), userId: bot.transformers.snowflake(payload.user_id), guildId: bot.transformers.snowflake(payload.guild_id), - }) + }); } diff --git a/packages/bot/src/handlers/guilds/scheduledEvents/index.ts b/packages/bot/src/handlers/guilds/scheduledEvents/index.ts index 7c4d5397a..27c7048f9 100644 --- a/packages/bot/src/handlers/guilds/scheduledEvents/index.ts +++ b/packages/bot/src/handlers/guilds/scheduledEvents/index.ts @@ -1,5 +1,5 @@ -export * from './GUILD_SCHEDULED_EVENT_CREATE.js' -export * from './GUILD_SCHEDULED_EVENT_DELETE.js' -export * from './GUILD_SCHEDULED_EVENT_UPDATE.js' -export * from './GUILD_SCHEDULED_EVENT_USER_ADD.js' -export * from './GUILD_SCHEDULED_EVENT_USER_REMOVE.js' +export * from './GUILD_SCHEDULED_EVENT_CREATE.js'; +export * from './GUILD_SCHEDULED_EVENT_DELETE.js'; +export * from './GUILD_SCHEDULED_EVENT_UPDATE.js'; +export * from './GUILD_SCHEDULED_EVENT_USER_ADD.js'; +export * from './GUILD_SCHEDULED_EVENT_USER_REMOVE.js'; diff --git a/packages/bot/src/handlers/index.ts b/packages/bot/src/handlers/index.ts index cac7dbfaa..c919559a1 100644 --- a/packages/bot/src/handlers/index.ts +++ b/packages/bot/src/handlers/index.ts @@ -1,16 +1,16 @@ -export * from './channels/index.js' -export * from './emojis/index.js' -export * from './entitlements/index.js' -export * from './guilds/index.js' -export * from './integrations/index.js' -export * from './interactions/index.js' -export * from './invites/index.js' -export * from './members/index.js' -export * from './messages/index.js' -export * from './misc/index.js' -export * from './poll/index.js' -export * from './roles/index.js' -export * from './soundboard/index.js' -export * from './subscriptions/index.js' -export * from './voice/index.js' -export * from './webhooks/index.js' +export * from './channels/index.js'; +export * from './emojis/index.js'; +export * from './entitlements/index.js'; +export * from './guilds/index.js'; +export * from './integrations/index.js'; +export * from './interactions/index.js'; +export * from './invites/index.js'; +export * from './members/index.js'; +export * from './messages/index.js'; +export * from './misc/index.js'; +export * from './poll/index.js'; +export * from './roles/index.js'; +export * from './soundboard/index.js'; +export * from './subscriptions/index.js'; +export * from './voice/index.js'; +export * from './webhooks/index.js'; diff --git a/packages/bot/src/handlers/integrations/INTEGRATION_CREATE.ts b/packages/bot/src/handlers/integrations/INTEGRATION_CREATE.ts index 4f804e96e..599d62efa 100644 --- a/packages/bot/src/handlers/integrations/INTEGRATION_CREATE.ts +++ b/packages/bot/src/handlers/integrations/INTEGRATION_CREATE.ts @@ -1,8 +1,8 @@ -import type { DiscordGatewayPayload, DiscordIntegrationCreateUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordIntegrationCreateUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleIntegrationCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.integrationCreate) return + if (!bot.events.integrationCreate) return; - bot.events.integrationCreate(bot.transformers.integration(bot, data.d as DiscordIntegrationCreateUpdate)) + bot.events.integrationCreate(bot.transformers.integration(bot, data.d as DiscordIntegrationCreateUpdate)); } diff --git a/packages/bot/src/handlers/integrations/INTEGRATION_DELETE.ts b/packages/bot/src/handlers/integrations/INTEGRATION_DELETE.ts index 6eb85be96..4aa62b0cb 100644 --- a/packages/bot/src/handlers/integrations/INTEGRATION_DELETE.ts +++ b/packages/bot/src/handlers/integrations/INTEGRATION_DELETE.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordIntegrationDelete } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordIntegrationDelete } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleIntegrationDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.integrationDelete) return + if (!bot.events.integrationDelete) return; - const payload = data.d as DiscordIntegrationDelete + const payload = data.d as DiscordIntegrationDelete; bot.events.integrationDelete({ id: bot.transformers.snowflake(payload.id), guildId: bot.transformers.snowflake(payload.guild_id), applicationId: payload.application_id ? bot.transformers.snowflake(payload.application_id) : undefined, - }) + }); } diff --git a/packages/bot/src/handlers/integrations/INTEGRATION_UPDATE.ts b/packages/bot/src/handlers/integrations/INTEGRATION_UPDATE.ts index 534999bba..f75554329 100644 --- a/packages/bot/src/handlers/integrations/INTEGRATION_UPDATE.ts +++ b/packages/bot/src/handlers/integrations/INTEGRATION_UPDATE.ts @@ -1,8 +1,8 @@ -import type { DiscordGatewayPayload, DiscordIntegrationCreateUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordIntegrationCreateUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleIntegrationUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.integrationUpdate) return + if (!bot.events.integrationUpdate) return; - bot.events.integrationUpdate(bot.transformers.integration(bot, data.d as DiscordIntegrationCreateUpdate)) + bot.events.integrationUpdate(bot.transformers.integration(bot, data.d as DiscordIntegrationCreateUpdate)); } diff --git a/packages/bot/src/handlers/integrations/index.ts b/packages/bot/src/handlers/integrations/index.ts index 9cffc13bd..efcbdc49c 100644 --- a/packages/bot/src/handlers/integrations/index.ts +++ b/packages/bot/src/handlers/integrations/index.ts @@ -1,3 +1,3 @@ -export * from './INTEGRATION_CREATE.js' -export * from './INTEGRATION_DELETE.js' -export * from './INTEGRATION_UPDATE.js' +export * from './INTEGRATION_CREATE.js'; +export * from './INTEGRATION_DELETE.js'; +export * from './INTEGRATION_UPDATE.js'; diff --git a/packages/bot/src/handlers/interactions/APPLICATION_COMMAND_PERMISSIONS_UPDATE.ts b/packages/bot/src/handlers/interactions/APPLICATION_COMMAND_PERMISSIONS_UPDATE.ts index 3c3a19ab7..c3d21bb3e 100644 --- a/packages/bot/src/handlers/interactions/APPLICATION_COMMAND_PERMISSIONS_UPDATE.ts +++ b/packages/bot/src/handlers/interactions/APPLICATION_COMMAND_PERMISSIONS_UPDATE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordGuildApplicationCommandPermissions } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildApplicationCommandPermissions } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleApplicationCommandPermissionsUpdate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.applicationCommandPermissionsUpdate) return + if (!bot.events.applicationCommandPermissionsUpdate) return; - const payload = data.d as DiscordGuildApplicationCommandPermissions - bot.events.applicationCommandPermissionsUpdate(bot.transformers.applicationCommandPermission(bot, payload)) + const payload = data.d as DiscordGuildApplicationCommandPermissions; + bot.events.applicationCommandPermissionsUpdate(bot.transformers.applicationCommandPermission(bot, payload)); } diff --git a/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts b/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts index a3083640f..83eaaeebc 100644 --- a/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts +++ b/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordInteraction } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordInteraction } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleInteractionCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.interactionCreate) return + if (!bot.events.interactionCreate) return; - const payload = data.d as DiscordInteraction + const payload = data.d as DiscordInteraction; - bot.events.interactionCreate(bot.transformers.interaction(bot, payload, { shardId })) + bot.events.interactionCreate(bot.transformers.interaction(bot, payload, { shardId })); } diff --git a/packages/bot/src/handlers/interactions/index.ts b/packages/bot/src/handlers/interactions/index.ts index 224d68b0e..557e607a2 100644 --- a/packages/bot/src/handlers/interactions/index.ts +++ b/packages/bot/src/handlers/interactions/index.ts @@ -1,2 +1,2 @@ -export * from './APPLICATION_COMMAND_PERMISSIONS_UPDATE.js' -export * from './INTERACTION_CREATE.js' +export * from './APPLICATION_COMMAND_PERMISSIONS_UPDATE.js'; +export * from './INTERACTION_CREATE.js'; diff --git a/packages/bot/src/handlers/invites/INVITE_CREATE.ts b/packages/bot/src/handlers/invites/INVITE_CREATE.ts index e1b971eb8..7243c9752 100644 --- a/packages/bot/src/handlers/invites/INVITE_CREATE.ts +++ b/packages/bot/src/handlers/invites/INVITE_CREATE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordInviteCreate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordInviteCreate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleInviteCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.inviteCreate) return + if (!bot.events.inviteCreate) return; - const payload = data.d as DiscordInviteCreate + const payload = data.d as DiscordInviteCreate; - bot.events.inviteCreate(bot.transformers.invite(bot, payload, { shardId })) + bot.events.inviteCreate(bot.transformers.invite(bot, payload, { shardId })); } diff --git a/packages/bot/src/handlers/invites/INVITE_DELETE.ts b/packages/bot/src/handlers/invites/INVITE_DELETE.ts index 569d70263..37918ed1b 100644 --- a/packages/bot/src/handlers/invites/INVITE_DELETE.ts +++ b/packages/bot/src/handlers/invites/INVITE_DELETE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordInviteDelete } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordInviteDelete } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleInviteDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.inviteDelete) return + if (!bot.events.inviteDelete) return; - const payload = data.d as DiscordInviteDelete + const payload = data.d as DiscordInviteDelete; bot.events.inviteDelete({ /** The channel of the invite */ @@ -13,5 +13,5 @@ export async function handleInviteDelete(bot: Bot, data: DiscordGatewayPayload): guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, /** The unique invite code */ code: payload.code, - }) + }); } diff --git a/packages/bot/src/handlers/invites/index.ts b/packages/bot/src/handlers/invites/index.ts index 34e4fb5df..43ce3bb75 100644 --- a/packages/bot/src/handlers/invites/index.ts +++ b/packages/bot/src/handlers/invites/index.ts @@ -1,2 +1,2 @@ -export * from './INVITE_CREATE.js' -export * from './INVITE_DELETE.js' +export * from './INVITE_CREATE.js'; +export * from './INVITE_DELETE.js'; diff --git a/packages/bot/src/handlers/members/GUILD_MEMBERS_CHUNK.ts b/packages/bot/src/handlers/members/GUILD_MEMBERS_CHUNK.ts index 04814a9e0..4aff83ae3 100644 --- a/packages/bot/src/handlers/members/GUILD_MEMBERS_CHUNK.ts +++ b/packages/bot/src/handlers/members/GUILD_MEMBERS_CHUNK.ts @@ -1,29 +1,29 @@ -import type { DiscordGatewayPayload, DiscordGuildMembersChunk } from '@discordeno/types' -import { camelize } from '@discordeno/utils' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildMembersChunk } from '@discordeno/types'; +import { camelize } from '@discordeno/utils'; +import type { Bot } from '../../bot.js'; export async function handleGuildMembersChunk(bot: Bot, data: DiscordGatewayPayload): Promise { - const payload = data.d as DiscordGuildMembersChunk + const payload = data.d as DiscordGuildMembersChunk; // If it's not enabled skip checks. - if (!bot.gateway.cache.requestMembers.enabled) return + if (!bot.gateway.cache.requestMembers.enabled) return; // If this request has no nonce, skip checks. - if (!payload.nonce) return + if (!payload.nonce) return; - const pending = bot.gateway.cache.requestMembers.pending.get(payload.nonce) + const pending = bot.gateway.cache.requestMembers.pending.get(payload.nonce); - if (!pending) return + if (!pending) return; - if (payload.chunk_count === 1) pending.members = payload.members - else pending.members.push(...payload.members) + if (payload.chunk_count === 1) pending.members = payload.members; + else pending.members.push(...payload.members); // If this is not the final chunk, just save to cache. - if (payload.chunk_index + 1 < payload.chunk_count) return + if (payload.chunk_index + 1 < payload.chunk_count) return; // Resolve the promise that all requests are done. - pending.resolve(camelize(pending.members)) + pending.resolve(camelize(pending.members)); // Delete the cache to clean up once its done. - bot.gateway.cache.requestMembers.pending.delete(payload.nonce) + bot.gateway.cache.requestMembers.pending.delete(payload.nonce); } diff --git a/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts b/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts index 22706f21a..285074b38 100644 --- a/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts +++ b/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts @@ -1,12 +1,12 @@ -import type { DiscordGatewayPayload, DiscordGuildMemberAdd } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildMemberAdd } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildMemberAdd(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.guildMemberAdd) return + if (!bot.events.guildMemberAdd) return; - const payload = data.d as DiscordGuildMemberAdd - const guildId = bot.transformers.snowflake(payload.guild_id) - const user = bot.transformers.user(bot, payload.user) - const member = bot.transformers.member(bot, payload, { guildId, userId: payload.user.id }) - bot.events.guildMemberAdd(member, user) + const payload = data.d as DiscordGuildMemberAdd; + const guildId = bot.transformers.snowflake(payload.guild_id); + const user = bot.transformers.user(bot, payload.user); + const member = bot.transformers.member(bot, payload, { guildId, userId: payload.user.id }); + bot.events.guildMemberAdd(member, user); } diff --git a/packages/bot/src/handlers/members/GUILD_MEMBER_REMOVE.ts b/packages/bot/src/handlers/members/GUILD_MEMBER_REMOVE.ts index c4f08837d..bd8038932 100644 --- a/packages/bot/src/handlers/members/GUILD_MEMBER_REMOVE.ts +++ b/packages/bot/src/handlers/members/GUILD_MEMBER_REMOVE.ts @@ -1,12 +1,12 @@ -import type { DiscordGatewayPayload, DiscordGuildMemberRemove } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildMemberRemove } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildMemberRemove(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.guildMemberRemove) return + if (!bot.events.guildMemberRemove) return; - const payload = data.d as DiscordGuildMemberRemove - const guildId = bot.transformers.snowflake(payload.guild_id) - const user = bot.transformers.user(bot, payload.user) + const payload = data.d as DiscordGuildMemberRemove; + const guildId = bot.transformers.snowflake(payload.guild_id); + const user = bot.transformers.user(bot, payload.user); - bot.events.guildMemberRemove(user, guildId) + bot.events.guildMemberRemove(user, guildId); } diff --git a/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts b/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts index 23431ff70..52b37264a 100644 --- a/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts +++ b/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts @@ -1,15 +1,15 @@ -import type { DiscordGatewayPayload, DiscordGuildMemberUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildMemberUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildMemberUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.guildMemberUpdate) return + if (!bot.events.guildMemberUpdate) return; - const payload = data.d as DiscordGuildMemberUpdate + const payload = data.d as DiscordGuildMemberUpdate; - const user = bot.transformers.user(bot, payload.user) + const user = bot.transformers.user(bot, payload.user); bot.events.guildMemberUpdate( // @ts-expect-error Flags in the update are nullable, while on the member they are be always present bot.transformers.member(bot, payload, { guildId: payload.guild_id, userId: payload.user.id }), user, - ) + ); } diff --git a/packages/bot/src/handlers/members/index.ts b/packages/bot/src/handlers/members/index.ts index a0921f465..206966bc6 100644 --- a/packages/bot/src/handlers/members/index.ts +++ b/packages/bot/src/handlers/members/index.ts @@ -1,4 +1,4 @@ -export * from './GUILD_MEMBER_ADD.js' -export * from './GUILD_MEMBER_REMOVE.js' -export * from './GUILD_MEMBER_UPDATE.js' -export * from './GUILD_MEMBERS_CHUNK.js' +export * from './GUILD_MEMBER_ADD.js'; +export * from './GUILD_MEMBER_REMOVE.js'; +export * from './GUILD_MEMBER_UPDATE.js'; +export * from './GUILD_MEMBERS_CHUNK.js'; diff --git a/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts b/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts index efd1400e1..cb76c1141 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordMessage } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessage } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.messageCreate) return + if (!bot.events.messageCreate) return; - const payload = data.d as DiscordMessage + const payload = data.d as DiscordMessage; - bot.events.messageCreate(bot.transformers.message(bot, payload, { shardId })) + bot.events.messageCreate(bot.transformers.message(bot, payload, { shardId })); } diff --git a/packages/bot/src/handlers/messages/MESSAGE_DELETE.ts b/packages/bot/src/handlers/messages/MESSAGE_DELETE.ts index 8215f7b2b..9a2572409 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_DELETE.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_DELETE.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordMessageDelete } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessageDelete } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.messageDelete) return + if (!bot.events.messageDelete) return; - const payload = data.d as DiscordMessageDelete + const payload = data.d as DiscordMessageDelete; bot.events.messageDelete({ id: bot.transformers.snowflake(payload.id), channelId: bot.transformers.snowflake(payload.channel_id), guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, - }) + }); } diff --git a/packages/bot/src/handlers/messages/MESSAGE_DELETE_BULK.ts b/packages/bot/src/handlers/messages/MESSAGE_DELETE_BULK.ts index 435ef96d1..3150278f2 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_DELETE_BULK.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_DELETE_BULK.ts @@ -1,17 +1,17 @@ -import type { DiscordGatewayPayload, DiscordMessageDeleteBulk } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessageDeleteBulk } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageDeleteBulk(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.messageDeleteBulk) return + if (!bot.events.messageDeleteBulk) return; - const payload = data.d as DiscordMessageDeleteBulk + const payload = data.d as DiscordMessageDeleteBulk; - const channelId = bot.transformers.snowflake(payload.channel_id) - const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined + const channelId = bot.transformers.snowflake(payload.channel_id); + const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined; bot.events.messageDeleteBulk({ ids: payload.ids.map((id) => bot.transformers.snowflake(id)), channelId, guildId, - }) + }); } diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts index 36a71bd02..4f06f09f5 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts @@ -1,13 +1,13 @@ -import type { DiscordGatewayPayload, DiscordMessageReactionAdd } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessageReactionAdd } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageReactionAdd(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.reactionAdd) return + if (!bot.events.reactionAdd) return; - const payload = data.d as DiscordMessageReactionAdd + const payload = data.d as DiscordMessageReactionAdd; - const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined - const userId = bot.transformers.snowflake(payload.user_id) + const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined; + const userId = bot.transformers.snowflake(payload.user_id); bot.events.reactionAdd({ userId, channelId: bot.transformers.snowflake(payload.channel_id), @@ -20,5 +20,5 @@ export async function handleMessageReactionAdd(bot: Bot, data: DiscordGatewayPay messageAuthorId: payload.message_author_id ? bot.transformers.snowflake(payload.message_author_id) : undefined, burst: payload.burst, burstColors: payload.burst_colors, - }) + }); } diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts index 39492f2ab..727a2805a 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordMessageReactionRemove } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessageReactionRemove } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageReactionRemove(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.reactionRemove) return + if (!bot.events.reactionRemove) return; - const payload = data.d as DiscordMessageReactionRemove + const payload = data.d as DiscordMessageReactionRemove; bot.events.reactionRemove({ userId: bot.transformers.snowflake(payload.user_id), @@ -14,5 +14,5 @@ export async function handleMessageReactionRemove(bot: Bot, data: DiscordGateway // @ts-expect-error TODO: Deal with partials emoji: bot.transformers.emoji(bot, payload.emoji), burst: payload.burst, - }) + }); } diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts index 006d145ec..4eefa6a0a 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordMessageReactionRemoveAll } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessageReactionRemoveAll } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageReactionRemoveAll(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.reactionRemoveAll) return + if (!bot.events.reactionRemoveAll) return; - const payload = data.d as DiscordMessageReactionRemoveAll + const payload = data.d as DiscordMessageReactionRemoveAll; bot.events.reactionRemoveAll({ channelId: bot.transformers.snowflake(payload.channel_id), messageId: bot.transformers.snowflake(payload.message_id), guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, - }) + }); } diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts index efa3cb4a0..07e87fbe6 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordMessageReactionRemoveEmoji } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessageReactionRemoveEmoji } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageReactionRemoveEmoji(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.reactionRemoveEmoji) return + if (!bot.events.reactionRemoveEmoji) return; - const payload = data.d as DiscordMessageReactionRemoveEmoji + const payload = data.d as DiscordMessageReactionRemoveEmoji; bot.events.reactionRemoveEmoji({ channelId: bot.transformers.snowflake(payload.channel_id), @@ -12,5 +12,5 @@ export async function handleMessageReactionRemoveEmoji(bot: Bot, data: DiscordGa guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, // @ts-expect-error TODO: Deal with partials emoji: bot.transformers.emoji(bot, payload.emoji), - }) + }); } diff --git a/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts b/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts index 5e976d2fe..0bd13ff36 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts @@ -1,11 +1,11 @@ -import type { DiscordGatewayPayload, DiscordMessage } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordMessage } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessageUpdate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.messageUpdate) return + if (!bot.events.messageUpdate) return; - const payload = data.d as DiscordMessage - if (!payload.edited_timestamp) return + const payload = data.d as DiscordMessage; + if (!payload.edited_timestamp) return; - bot.events.messageUpdate(bot.transformers.message(bot, payload, { shardId })) + bot.events.messageUpdate(bot.transformers.message(bot, payload, { shardId })); } diff --git a/packages/bot/src/handlers/messages/index.ts b/packages/bot/src/handlers/messages/index.ts index 4668f7827..66327f971 100644 --- a/packages/bot/src/handlers/messages/index.ts +++ b/packages/bot/src/handlers/messages/index.ts @@ -1,8 +1,8 @@ -export * from './MESSAGE_CREATE.js' -export * from './MESSAGE_DELETE.js' -export * from './MESSAGE_DELETE_BULK.js' -export * from './MESSAGE_REACTION_ADD.js' -export * from './MESSAGE_REACTION_REMOVE.js' -export * from './MESSAGE_REACTION_REMOVE_ALL.js' -export * from './MESSAGE_REACTION_REMOVE_EMOJI.js' -export * from './MESSAGE_UPDATE.js' +export * from './MESSAGE_CREATE.js'; +export * from './MESSAGE_DELETE.js'; +export * from './MESSAGE_DELETE_BULK.js'; +export * from './MESSAGE_REACTION_ADD.js'; +export * from './MESSAGE_REACTION_REMOVE.js'; +export * from './MESSAGE_REACTION_REMOVE_ALL.js'; +export * from './MESSAGE_REACTION_REMOVE_EMOJI.js'; +export * from './MESSAGE_UPDATE.js'; diff --git a/packages/bot/src/handlers/misc/PRESENCE_UPDATE.ts b/packages/bot/src/handlers/misc/PRESENCE_UPDATE.ts index eec7cda04..a3427e0fb 100644 --- a/packages/bot/src/handlers/misc/PRESENCE_UPDATE.ts +++ b/packages/bot/src/handlers/misc/PRESENCE_UPDATE.ts @@ -1,8 +1,8 @@ -import type { DiscordGatewayPayload, DiscordPresenceUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordPresenceUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handlePresenceUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.presenceUpdate) return + if (!bot.events.presenceUpdate) return; - bot.events.presenceUpdate(bot.transformers.presence(bot, data.d as DiscordPresenceUpdate)) + bot.events.presenceUpdate(bot.transformers.presence(bot, data.d as DiscordPresenceUpdate)); } diff --git a/packages/bot/src/handlers/misc/RATE_LIMITED.ts b/packages/bot/src/handlers/misc/RATE_LIMITED.ts index e2843ae77..0aab79dc3 100644 --- a/packages/bot/src/handlers/misc/RATE_LIMITED.ts +++ b/packages/bot/src/handlers/misc/RATE_LIMITED.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordRateLimited } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordRateLimited } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleRateLimited(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.rateLimited) return + if (!bot.events.rateLimited) return; - const payload = data.d as DiscordRateLimited - bot.events.rateLimited(payload, shardId) + const payload = data.d as DiscordRateLimited; + bot.events.rateLimited(payload, shardId); } diff --git a/packages/bot/src/handlers/misc/READY.ts b/packages/bot/src/handlers/misc/READY.ts index ebed8231c..2e03d3a2f 100644 --- a/packages/bot/src/handlers/misc/READY.ts +++ b/packages/bot/src/handlers/misc/READY.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordReady } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordReady } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleReady(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.ready) return + if (!bot.events.ready) return; - const payload = data.d as DiscordReady + const payload = data.d as DiscordReady; // Triggered on each shard bot.events.ready( { @@ -17,8 +17,8 @@ export async function handleReady(bot: Bot, data: DiscordGatewayPayload, shardId applicationId: bot.transformers.snowflake(payload.application.id), }, payload, - ) + ); - bot.id = bot.transformers.snowflake(payload.user.id) - bot.applicationId = bot.transformers.snowflake(payload.application.id) + bot.id = bot.transformers.snowflake(payload.user.id); + bot.applicationId = bot.transformers.snowflake(payload.application.id); } diff --git a/packages/bot/src/handlers/misc/RESUMED.ts b/packages/bot/src/handlers/misc/RESUMED.ts index f8935e1b6..0281ee3d0 100644 --- a/packages/bot/src/handlers/misc/RESUMED.ts +++ b/packages/bot/src/handlers/misc/RESUMED.ts @@ -1,8 +1,8 @@ -import type { DiscordGatewayPayload } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleResumed(bot: Bot, _data: DiscordGatewayPayload, shardId: number): Promise { - if (!bot.events.resumed) return + if (!bot.events.resumed) return; - bot.events.resumed(shardId) + bot.events.resumed(shardId); } diff --git a/packages/bot/src/handlers/misc/TYPING_START.ts b/packages/bot/src/handlers/misc/TYPING_START.ts index 58329bf4a..f46672340 100644 --- a/packages/bot/src/handlers/misc/TYPING_START.ts +++ b/packages/bot/src/handlers/misc/TYPING_START.ts @@ -1,13 +1,13 @@ -import type { DiscordGatewayPayload, DiscordTypingStart } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordTypingStart } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleTypingStart(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.typingStart) return + if (!bot.events.typingStart) return; - const payload = data.d as DiscordTypingStart + const payload = data.d as DiscordTypingStart; - const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined - const userId = bot.transformers.snowflake(payload.user_id) + const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined; + const userId = bot.transformers.snowflake(payload.user_id); bot.events.typingStart({ guildId, @@ -15,5 +15,5 @@ export async function handleTypingStart(bot: Bot, data: DiscordGatewayPayload): userId, timestamp: payload.timestamp, member: payload.member && guildId ? bot.transformers.member(bot, payload.member, { guildId, userId }) : undefined, - }) + }); } diff --git a/packages/bot/src/handlers/misc/USER_UPDATE.ts b/packages/bot/src/handlers/misc/USER_UPDATE.ts index 8ffc74e92..9bed37808 100644 --- a/packages/bot/src/handlers/misc/USER_UPDATE.ts +++ b/packages/bot/src/handlers/misc/USER_UPDATE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordUser } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordUser } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleUserUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.botUpdate) return + if (!bot.events.botUpdate) return; - const payload = data.d as DiscordUser - bot.events.botUpdate(bot.transformers.user(bot, payload)) + const payload = data.d as DiscordUser; + bot.events.botUpdate(bot.transformers.user(bot, payload)); } diff --git a/packages/bot/src/handlers/misc/index.ts b/packages/bot/src/handlers/misc/index.ts index 4be796b12..c4eec9709 100644 --- a/packages/bot/src/handlers/misc/index.ts +++ b/packages/bot/src/handlers/misc/index.ts @@ -1,6 +1,6 @@ -export * from './PRESENCE_UPDATE.js' -export * from './RATE_LIMITED.js' -export * from './READY.js' -export * from './RESUMED.js' -export * from './TYPING_START.js' -export * from './USER_UPDATE.js' +export * from './PRESENCE_UPDATE.js'; +export * from './RATE_LIMITED.js'; +export * from './READY.js'; +export * from './RESUMED.js'; +export * from './TYPING_START.js'; +export * from './USER_UPDATE.js'; diff --git a/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_ADD.ts b/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_ADD.ts index 49e8cbcc3..96a02fb00 100644 --- a/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_ADD.ts +++ b/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_ADD.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordPollVoteAdd } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordPollVoteAdd } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessagePollVoteAdd(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.messagePollVoteAdd) return + if (!bot.events.messagePollVoteAdd) return; - const payload = data.d as DiscordPollVoteAdd + const payload = data.d as DiscordPollVoteAdd; bot.events.messagePollVoteAdd({ userId: bot.transformers.snowflake(payload.user_id), @@ -12,5 +12,5 @@ export async function handleMessagePollVoteAdd(bot: Bot, data: DiscordGatewayPay messageId: bot.transformers.snowflake(payload.message_id), guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, answerId: payload.answer_id, - }) + }); } diff --git a/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_REMOVE.ts b/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_REMOVE.ts index 7c475cf11..a7cb1e4ad 100644 --- a/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_REMOVE.ts +++ b/packages/bot/src/handlers/poll/MESSAGE_POLL_VOTE_REMOVE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordPollVoteRemove } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordPollVoteRemove } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleMessagePollVoteRemove(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.messagePollVoteRemove) return + if (!bot.events.messagePollVoteRemove) return; - const payload = data.d as DiscordPollVoteRemove + const payload = data.d as DiscordPollVoteRemove; bot.events.messagePollVoteRemove({ userId: bot.transformers.snowflake(payload.user_id), @@ -12,5 +12,5 @@ export async function handleMessagePollVoteRemove(bot: Bot, data: DiscordGateway messageId: bot.transformers.snowflake(payload.message_id), guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, answerId: payload.answer_id, - }) + }); } diff --git a/packages/bot/src/handlers/poll/index.ts b/packages/bot/src/handlers/poll/index.ts index 74fc15476..169c3e81a 100644 --- a/packages/bot/src/handlers/poll/index.ts +++ b/packages/bot/src/handlers/poll/index.ts @@ -1,2 +1,2 @@ -export * from './MESSAGE_POLL_VOTE_ADD.js' -export * from './MESSAGE_POLL_VOTE_REMOVE.js' +export * from './MESSAGE_POLL_VOTE_ADD.js'; +export * from './MESSAGE_POLL_VOTE_REMOVE.js'; diff --git a/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts b/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts index 929752ab4..3ff97cfc9 100644 --- a/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts +++ b/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts @@ -1,13 +1,13 @@ -import type { DiscordGatewayPayload, DiscordGuildRoleCreate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildRoleCreate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildRoleCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.roleCreate) return + if (!bot.events.roleCreate) return; - const payload = data.d as DiscordGuildRoleCreate + const payload = data.d as DiscordGuildRoleCreate; bot.events.roleCreate( bot.transformers.role(bot, payload.role, { guildId: bot.transformers.snowflake(payload.guild_id), }), - ) + ); } diff --git a/packages/bot/src/handlers/roles/GUILD_ROLE_DELETE.ts b/packages/bot/src/handlers/roles/GUILD_ROLE_DELETE.ts index c04fdfcb3..c3c80cc31 100644 --- a/packages/bot/src/handlers/roles/GUILD_ROLE_DELETE.ts +++ b/packages/bot/src/handlers/roles/GUILD_ROLE_DELETE.ts @@ -1,12 +1,12 @@ -import type { DiscordGatewayPayload, DiscordGuildRoleDelete } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildRoleDelete } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildRoleDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.roleDelete) return + if (!bot.events.roleDelete) return; - const payload = data.d as DiscordGuildRoleDelete + const payload = data.d as DiscordGuildRoleDelete; bot.events.roleDelete({ roleId: bot.transformers.snowflake(payload.role_id), guildId: bot.transformers.snowflake(payload.guild_id), - }) + }); } diff --git a/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts b/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts index 98051cde2..5e05df46f 100644 --- a/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts +++ b/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordGuildRoleUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordGuildRoleUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildRoleUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.roleUpdate) return + if (!bot.events.roleUpdate) return; - const payload = data.d as DiscordGuildRoleUpdate + const payload = data.d as DiscordGuildRoleUpdate; bot.events.roleUpdate( bot.transformers.role(bot, payload.role, { guildId: bot.transformers.snowflake(payload.guild_id), }), - ) + ); } diff --git a/packages/bot/src/handlers/roles/index.ts b/packages/bot/src/handlers/roles/index.ts index 9e369134f..85009d58d 100644 --- a/packages/bot/src/handlers/roles/index.ts +++ b/packages/bot/src/handlers/roles/index.ts @@ -1,3 +1,3 @@ -export * from './GUILD_ROLE_CREATE.js' -export * from './GUILD_ROLE_DELETE.js' -export * from './GUILD_ROLE_UPDATE.js' +export * from './GUILD_ROLE_CREATE.js'; +export * from './GUILD_ROLE_DELETE.js'; +export * from './GUILD_ROLE_UPDATE.js'; diff --git a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUNDS_UPDATE.ts b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUNDS_UPDATE.ts index 8474b149e..955eee704 100644 --- a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUNDS_UPDATE.ts +++ b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUNDS_UPDATE.ts @@ -1,13 +1,13 @@ -import type { DiscordGatewayPayload, DiscordSoundboardSoundsUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSoundboardSoundsUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildSoundboardSoundsUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.soundboardSoundsUpdate) return + if (!bot.events.soundboardSoundsUpdate) return; - const payload = data.d as DiscordSoundboardSoundsUpdate + const payload = data.d as DiscordSoundboardSoundsUpdate; bot.events.soundboardSoundsUpdate({ guildId: bot.transformers.snowflake(payload.guild_id), soundboardSounds: payload.soundboard_sounds.map((sound) => bot.transformers.soundboardSound(bot, sound)), - }) + }); } diff --git a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_CREATE.ts b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_CREATE.ts index 574d9ed10..ea7485966 100644 --- a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_CREATE.ts +++ b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_CREATE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordSoundboardSound } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSoundboardSound } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildSoundboardSoundCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.soundboardSoundCreate) return + if (!bot.events.soundboardSoundCreate) return; - const payload = data.d as DiscordSoundboardSound + const payload = data.d as DiscordSoundboardSound; - bot.events.soundboardSoundCreate(bot.transformers.soundboardSound(bot, payload)) + bot.events.soundboardSoundCreate(bot.transformers.soundboardSound(bot, payload)); } diff --git a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_DELETE.ts b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_DELETE.ts index c10fb4554..b24fc29bb 100644 --- a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_DELETE.ts +++ b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_DELETE.ts @@ -1,13 +1,13 @@ -import type { DiscordGatewayPayload, DiscordSoundboardSoundDelete } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSoundboardSoundDelete } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildSoundboardSoundDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.soundboardSoundDelete) return + if (!bot.events.soundboardSoundDelete) return; - const payload = data.d as DiscordSoundboardSoundDelete + const payload = data.d as DiscordSoundboardSoundDelete; bot.events.soundboardSoundDelete({ guildId: bot.transformers.snowflake(payload.guild_id), soundId: bot.transformers.snowflake(payload.sound_id), - }) + }); } diff --git a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_UPDATE.ts b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_UPDATE.ts index 6a830a262..3e639b0a6 100644 --- a/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_UPDATE.ts +++ b/packages/bot/src/handlers/soundboard/GUILD_SOUNDBOARD_SOUND_UPDATE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordSoundboardSound } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSoundboardSound } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleGuildSoundboardSoundUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.soundboardSoundUpdate) return + if (!bot.events.soundboardSoundUpdate) return; - const payload = data.d as DiscordSoundboardSound + const payload = data.d as DiscordSoundboardSound; - bot.events.soundboardSoundUpdate(bot.transformers.soundboardSound(bot, payload)) + bot.events.soundboardSoundUpdate(bot.transformers.soundboardSound(bot, payload)); } diff --git a/packages/bot/src/handlers/soundboard/SOUNDBOARD_SOUNDS.ts b/packages/bot/src/handlers/soundboard/SOUNDBOARD_SOUNDS.ts index c92d3efa1..b2b3833b5 100644 --- a/packages/bot/src/handlers/soundboard/SOUNDBOARD_SOUNDS.ts +++ b/packages/bot/src/handlers/soundboard/SOUNDBOARD_SOUNDS.ts @@ -1,13 +1,13 @@ -import type { DiscordGatewayPayload, DiscordSoundboardSounds } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSoundboardSounds } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleSoundboardSounds(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.soundboardSounds) return + if (!bot.events.soundboardSounds) return; - const payload = data.d as DiscordSoundboardSounds + const payload = data.d as DiscordSoundboardSounds; bot.events.soundboardSounds({ guildId: bot.transformers.snowflake(payload.guild_id), soundboardSounds: payload.soundboard_sounds.map((sound) => bot.transformers.soundboardSound(bot, sound)), - }) + }); } diff --git a/packages/bot/src/handlers/soundboard/index.ts b/packages/bot/src/handlers/soundboard/index.ts index 4be6088be..a5902a478 100644 --- a/packages/bot/src/handlers/soundboard/index.ts +++ b/packages/bot/src/handlers/soundboard/index.ts @@ -1,5 +1,5 @@ -export * from './GUILD_SOUNDBOARD_SOUND_CREATE.js' -export * from './GUILD_SOUNDBOARD_SOUND_DELETE.js' -export * from './GUILD_SOUNDBOARD_SOUND_UPDATE.js' -export * from './GUILD_SOUNDBOARD_SOUNDS_UPDATE.js' -export * from './SOUNDBOARD_SOUNDS.js' +export * from './GUILD_SOUNDBOARD_SOUND_CREATE.js'; +export * from './GUILD_SOUNDBOARD_SOUND_DELETE.js'; +export * from './GUILD_SOUNDBOARD_SOUND_UPDATE.js'; +export * from './GUILD_SOUNDBOARD_SOUNDS_UPDATE.js'; +export * from './SOUNDBOARD_SOUNDS.js'; diff --git a/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_CREATE.ts b/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_CREATE.ts index ac9b7fbf2..32ce6128a 100644 --- a/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_CREATE.ts +++ b/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_CREATE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordSubscription } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSubscription } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleSubscriptionCreate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.subscriptionCreate) return + if (!bot.events.subscriptionCreate) return; - const payload = data.d as DiscordSubscription - bot.events.subscriptionCreate(bot.transformers.subscription(bot, payload)) + const payload = data.d as DiscordSubscription; + bot.events.subscriptionCreate(bot.transformers.subscription(bot, payload)); } diff --git a/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_DELETE.ts b/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_DELETE.ts index 30c0356e2..ce285fe81 100644 --- a/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_DELETE.ts +++ b/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_DELETE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordSubscription } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSubscription } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleSubscriptionDelete(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.subscriptionDelete) return + if (!bot.events.subscriptionDelete) return; - const payload = data.d as DiscordSubscription - bot.events.subscriptionDelete(bot.transformers.subscription(bot, payload)) + const payload = data.d as DiscordSubscription; + bot.events.subscriptionDelete(bot.transformers.subscription(bot, payload)); } diff --git a/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_UPDATE.ts b/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_UPDATE.ts index bdeb42b95..d592aae1c 100644 --- a/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_UPDATE.ts +++ b/packages/bot/src/handlers/subscriptions/SUBSCRIPTION_UPDATE.ts @@ -1,9 +1,9 @@ -import type { DiscordGatewayPayload, DiscordSubscription } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordSubscription } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleSubscriptionUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.subscriptionUpdate) return + if (!bot.events.subscriptionUpdate) return; - const payload = data.d as DiscordSubscription - bot.events.subscriptionUpdate(bot.transformers.subscription(bot, payload)) + const payload = data.d as DiscordSubscription; + bot.events.subscriptionUpdate(bot.transformers.subscription(bot, payload)); } diff --git a/packages/bot/src/handlers/subscriptions/index.ts b/packages/bot/src/handlers/subscriptions/index.ts index 6b102b5ee..9fab46d6c 100644 --- a/packages/bot/src/handlers/subscriptions/index.ts +++ b/packages/bot/src/handlers/subscriptions/index.ts @@ -1,3 +1,3 @@ -export * from './SUBSCRIPTION_CREATE.js' -export * from './SUBSCRIPTION_DELETE.js' -export * from './SUBSCRIPTION_UPDATE.js' +export * from './SUBSCRIPTION_CREATE.js'; +export * from './SUBSCRIPTION_DELETE.js'; +export * from './SUBSCRIPTION_UPDATE.js'; diff --git a/packages/bot/src/handlers/voice/VOICE_CHANNEL_EFFECT_SEND.ts b/packages/bot/src/handlers/voice/VOICE_CHANNEL_EFFECT_SEND.ts index c93d3b89c..e10e75b3c 100644 --- a/packages/bot/src/handlers/voice/VOICE_CHANNEL_EFFECT_SEND.ts +++ b/packages/bot/src/handlers/voice/VOICE_CHANNEL_EFFECT_SEND.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordVoiceChannelEffectSend } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordVoiceChannelEffectSend } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleVoiceChannelEffectSend(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.voiceChannelEffectSend) return + if (!bot.events.voiceChannelEffectSend) return; - const payload = data.d as DiscordVoiceChannelEffectSend + const payload = data.d as DiscordVoiceChannelEffectSend; bot.events.voiceChannelEffectSend({ guildId: bot.transformers.snowflake(payload.guild_id), @@ -15,5 +15,5 @@ export async function handleVoiceChannelEffectSend(bot: Bot, data: DiscordGatewa emoji: payload.emoji ? bot.transformers.emoji(bot, payload.emoji) : undefined, soundId: typeof payload.sound_id === 'string' ? bot.transformers.snowflake(payload.sound_id) : payload.sound_id, soundVolume: payload.sound_volume, - }) + }); } diff --git a/packages/bot/src/handlers/voice/VOICE_SERVER_UPDATE.ts b/packages/bot/src/handlers/voice/VOICE_SERVER_UPDATE.ts index a0a712115..9f85fe64d 100644 --- a/packages/bot/src/handlers/voice/VOICE_SERVER_UPDATE.ts +++ b/packages/bot/src/handlers/voice/VOICE_SERVER_UPDATE.ts @@ -1,14 +1,14 @@ -import type { DiscordGatewayPayload, DiscordVoiceServerUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordVoiceServerUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleVoiceServerUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.voiceServerUpdate) return + if (!bot.events.voiceServerUpdate) return; - const payload = data.d as DiscordVoiceServerUpdate + const payload = data.d as DiscordVoiceServerUpdate; bot.events.voiceServerUpdate({ token: payload.token, guildId: bot.transformers.snowflake(payload.guild_id), endpoint: payload.endpoint ?? undefined, - }) + }); } diff --git a/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts b/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts index 6562b4ea9..73aed3cc3 100644 --- a/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts +++ b/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts @@ -1,10 +1,10 @@ -import type { DiscordGatewayPayload, DiscordVoiceState } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordVoiceState } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleVoiceStateUpdate(bot: Bot, data: DiscordGatewayPayload): Promise { - if (!bot.events.voiceStateUpdate) return + if (!bot.events.voiceStateUpdate) return; - const payload = data.d as DiscordVoiceState + const payload = data.d as DiscordVoiceState; - bot.events.voiceStateUpdate(bot.transformers.voiceState(bot, payload, { guildId: payload.guild_id })) + bot.events.voiceStateUpdate(bot.transformers.voiceState(bot, payload, { guildId: payload.guild_id })); } diff --git a/packages/bot/src/handlers/voice/index.ts b/packages/bot/src/handlers/voice/index.ts index b70327438..19c0a4276 100644 --- a/packages/bot/src/handlers/voice/index.ts +++ b/packages/bot/src/handlers/voice/index.ts @@ -1,3 +1,3 @@ -export * from './VOICE_CHANNEL_EFFECT_SEND.js' -export * from './VOICE_SERVER_UPDATE.js' -export * from './VOICE_STATE_UPDATE.js' +export * from './VOICE_CHANNEL_EFFECT_SEND.js'; +export * from './VOICE_SERVER_UPDATE.js'; +export * from './VOICE_STATE_UPDATE.js'; diff --git a/packages/bot/src/handlers/webhooks/WEBHOOKS_UPDATE.ts b/packages/bot/src/handlers/webhooks/WEBHOOKS_UPDATE.ts index 488041afd..1596f1d3e 100644 --- a/packages/bot/src/handlers/webhooks/WEBHOOKS_UPDATE.ts +++ b/packages/bot/src/handlers/webhooks/WEBHOOKS_UPDATE.ts @@ -1,12 +1,12 @@ -import type { DiscordGatewayPayload, DiscordWebhookUpdate } from '@discordeno/types' -import type { Bot } from '../../bot.js' +import type { DiscordGatewayPayload, DiscordWebhookUpdate } from '@discordeno/types'; +import type { Bot } from '../../bot.js'; export async function handleWebhooksUpdate(bot: Bot, data: DiscordGatewayPayload, _shardId: number): Promise { - if (!bot.events.webhooksUpdate) return + if (!bot.events.webhooksUpdate) return; - const payload = data.d as DiscordWebhookUpdate + const payload = data.d as DiscordWebhookUpdate; bot.events.webhooksUpdate({ channelId: bot.transformers.snowflake(payload.channel_id), guildId: bot.transformers.snowflake(payload.guild_id), - }) + }); } diff --git a/packages/bot/src/handlers/webhooks/index.ts b/packages/bot/src/handlers/webhooks/index.ts index baf5f8d4d..d92fd52e3 100644 --- a/packages/bot/src/handlers/webhooks/index.ts +++ b/packages/bot/src/handlers/webhooks/index.ts @@ -1 +1 @@ -export * from './WEBHOOKS_UPDATE.js' +export * from './WEBHOOKS_UPDATE.js'; diff --git a/packages/bot/src/helpers.ts b/packages/bot/src/helpers.ts index 52b1620d8..3afa2038d 100644 --- a/packages/bot/src/helpers.ts +++ b/packages/bot/src/helpers.ts @@ -105,11 +105,11 @@ import type { StartThreadWithoutMessage, UpsertGlobalApplicationCommandOptions, UpsertGuildApplicationCommandOptions, -} from '@discordeno/types' -import { snakelize } from '@discordeno/utils' -import type { Bot } from './bot.js' -import type { DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from './desiredProperties.js' -import type { ThreadMemberTransformerExtra } from './transformers/threadMember.js' +} from '@discordeno/types'; +import { snakelize } from '@discordeno/utils'; +import type { Bot } from './bot.js'; +import type { DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from './desiredProperties.js'; +import type { ThreadMemberTransformerExtra } from './transformers/threadMember.js'; import type { Application, ApplicationCommand, @@ -144,1053 +144,1068 @@ import type { VoiceState, Webhook, WelcomeScreen, -} from './transformers/types.js' +} from './transformers/types.js'; export function createBotHelpers( bot: Bot, ): BotHelpers { return { createAutomodRule: async (guildId, options, reason) => { - return bot.transformers.automodRule(bot, snakelize(await bot.rest.createAutomodRule(guildId, options, reason))) + return bot.transformers.automodRule(bot, snakelize(await bot.rest.createAutomodRule(guildId, options, reason))); }, createChannel: async (guildId, options, reason) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.createChannel(guildId, options, reason)), { guildId }) + return bot.transformers.channel(bot, snakelize(await bot.rest.createChannel(guildId, options, reason)), { guildId }); }, createEmoji: async (guildId, options, reason) => { - return bot.transformers.emoji(bot, snakelize(await bot.rest.createEmoji(guildId, options, reason))) + return bot.transformers.emoji(bot, snakelize(await bot.rest.createEmoji(guildId, options, reason))); }, createApplicationEmoji: async (options) => { - return bot.transformers.emoji(bot, snakelize(await bot.rest.createApplicationEmoji(options))) + return bot.transformers.emoji(bot, snakelize(await bot.rest.createApplicationEmoji(options))); }, createForumThread: async (channelId, options, reason) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.createForumThread(channelId, options, reason))) + return bot.transformers.channel(bot, snakelize(await bot.rest.createForumThread(channelId, options, reason))); }, createGlobalApplicationCommand: async (command, options) => { - return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.createGlobalApplicationCommand(command, options))) + return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.createGlobalApplicationCommand(command, options))); }, createGuildApplicationCommand: async (command, guildId, options) => { - return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.createGuildApplicationCommand(command, guildId, options))) + return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.createGuildApplicationCommand(command, guildId, options))); }, createGuildSticker: async (guildId, options, reason) => { - return bot.transformers.sticker(bot, snakelize(await bot.rest.createGuildSticker(guildId, options, reason))) + return bot.transformers.sticker(bot, snakelize(await bot.rest.createGuildSticker(guildId, options, reason))); }, createGuildTemplate: async (guildId, options) => { - return bot.transformers.template(bot, snakelize(await bot.rest.createGuildTemplate(guildId, options))) + return bot.transformers.template(bot, snakelize(await bot.rest.createGuildTemplate(guildId, options))); }, createInvite: async (channelId, options, reason) => { - return await bot.rest.createInvite(channelId, options, reason) + return await bot.rest.createInvite(channelId, options, reason); }, getGuildRoleMemberCounts: async (guildId) => { - return await bot.rest.getGuildRoleMemberCounts(guildId) + return await bot.rest.getGuildRoleMemberCounts(guildId); }, createRole: async (guildId, options, reason) => { - return bot.transformers.role(bot, snakelize(await bot.rest.createRole(guildId, options, reason)), { guildId }) + return bot.transformers.role(bot, snakelize(await bot.rest.createRole(guildId, options, reason)), { guildId }); }, createScheduledEvent: async (guildId, options, reason) => { - return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.createScheduledEvent(guildId, options, reason))) + return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.createScheduledEvent(guildId, options, reason))); }, createStageInstance: async (options, reason) => { - return bot.transformers.stageInstance(bot, snakelize(await bot.rest.createStageInstance(options, reason))) + return bot.transformers.stageInstance(bot, snakelize(await bot.rest.createStageInstance(options, reason))); }, createWebhook: async (channelId, options, reason) => { - return bot.transformers.webhook(bot, snakelize(await bot.rest.createWebhook(channelId, options, reason))) + return bot.transformers.webhook(bot, snakelize(await bot.rest.createWebhook(channelId, options, reason))); }, editApplicationCommandPermissions: async (guildId, commandId, bearerToken, options) => { return bot.transformers.applicationCommandPermission( bot, snakelize(await bot.rest.editApplicationCommandPermissions(guildId, commandId, bearerToken, options)), - ) + ); }, editAutomodRule: async (guildId, ruleId, options, reason) => { - return bot.transformers.automodRule(bot, snakelize(await bot.rest.editAutomodRule(guildId, ruleId, options, reason))) + return bot.transformers.automodRule(bot, snakelize(await bot.rest.editAutomodRule(guildId, ruleId, options, reason))); }, editBotProfile: async (options) => { - return bot.transformers.user(bot, snakelize(await bot.rest.editBotProfile(options))) + return bot.transformers.user(bot, snakelize(await bot.rest.editBotProfile(options))); }, editChannel: async (channelId, options, reason) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.editChannel(channelId, options, reason))) + return bot.transformers.channel(bot, snakelize(await bot.rest.editChannel(channelId, options, reason))); }, editEmoji: async (guildId, id, options, reason) => { - return bot.transformers.emoji(bot, snakelize(await bot.rest.editEmoji(guildId, id, options, reason))) + return bot.transformers.emoji(bot, snakelize(await bot.rest.editEmoji(guildId, id, options, reason))); }, editApplicationEmoji: async (id, options) => { - return bot.transformers.emoji(bot, snakelize(await bot.rest.editApplicationEmoji(id, options))) + return bot.transformers.emoji(bot, snakelize(await bot.rest.editApplicationEmoji(id, options))); }, editFollowupMessage: async (token, messageId, options) => { - return bot.transformers.message(bot, snakelize(await bot.rest.editFollowupMessage(token, messageId, options))) + return bot.transformers.message(bot, snakelize(await bot.rest.editFollowupMessage(token, messageId, options))); }, editGlobalApplicationCommand: async (commandId, options) => { - return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.editGlobalApplicationCommand(commandId, options))) + return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.editGlobalApplicationCommand(commandId, options))); }, editGuild: async (guildId, options, reason) => { - return bot.transformers.guild(bot, snakelize(await bot.rest.editGuild(guildId, options, reason))) + return bot.transformers.guild(bot, snakelize(await bot.rest.editGuild(guildId, options, reason))); }, editGuildApplicationCommand: async (commandId, guildId, options) => { - return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.editGuildApplicationCommand(commandId, guildId, options))) + return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.editGuildApplicationCommand(commandId, guildId, options))); }, editGuildSticker: async (guildId, stickerId, options, reason) => { - return bot.transformers.sticker(bot, snakelize(await bot.rest.editGuildSticker(guildId, stickerId, options, reason))) + return bot.transformers.sticker(bot, snakelize(await bot.rest.editGuildSticker(guildId, stickerId, options, reason))); }, editGuildTemplate: async (guildId, templateCode, options) => { - return bot.transformers.template(bot, snakelize(await bot.rest.editGuildTemplate(guildId, templateCode, options))) + return bot.transformers.template(bot, snakelize(await bot.rest.editGuildTemplate(guildId, templateCode, options))); }, editMessage: async (channelId, messageId, options) => { - return bot.transformers.message(bot, snakelize(await bot.rest.editMessage(channelId, messageId, options))) + return bot.transformers.message(bot, snakelize(await bot.rest.editMessage(channelId, messageId, options))); }, editOriginalInteractionResponse: async (token, options) => { - return bot.transformers.message(bot, snakelize(await bot.rest.editOriginalInteractionResponse(token, options))) + return bot.transformers.message(bot, snakelize(await bot.rest.editOriginalInteractionResponse(token, options))); }, editRole: async (guildId, roleId, options, reason) => { - return bot.transformers.role(bot, snakelize(await bot.rest.editRole(guildId, roleId, options, reason)), { guildId }) + return bot.transformers.role(bot, snakelize(await bot.rest.editRole(guildId, roleId, options, reason)), { guildId }); }, editRolePositions: async (guildId, options, reason) => { - return snakelize(await bot.rest.editRolePositions(guildId, options, reason)).map((role) => bot.transformers.role(bot, role, { guildId })) + return snakelize(await bot.rest.editRolePositions(guildId, options, reason)).map((role) => bot.transformers.role(bot, role, { guildId })); }, editScheduledEvent: async (guildId, eventId, options, reason) => { - return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.editScheduledEvent(guildId, eventId, options, reason))) + return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.editScheduledEvent(guildId, eventId, options, reason))); }, editStageInstance: async (channelId, topic, reason) => { - return bot.transformers.stageInstance(bot, snakelize(await bot.rest.editStageInstance(channelId, topic, reason))) + return bot.transformers.stageInstance(bot, snakelize(await bot.rest.editStageInstance(channelId, topic, reason))); }, editWebhook: async (webhookId, options, reason) => { - return bot.transformers.webhook(bot, snakelize(await bot.rest.editWebhook(webhookId, options, reason))) + return bot.transformers.webhook(bot, snakelize(await bot.rest.editWebhook(webhookId, options, reason))); }, editWebhookMessage: async (webhookId, token, messageId, options) => { - return bot.transformers.message(bot, snakelize(await bot.rest.editWebhookMessage(webhookId, token, messageId, options))) + return bot.transformers.message(bot, snakelize(await bot.rest.editWebhookMessage(webhookId, token, messageId, options))); }, editWebhookWithToken: async (webhookId, token, options) => { - return bot.transformers.webhook(bot, snakelize(await bot.rest.editWebhookWithToken(webhookId, token, options))) + return bot.transformers.webhook(bot, snakelize(await bot.rest.editWebhookWithToken(webhookId, token, options))); }, editWelcomeScreen: async (guildId, options, reason) => { - return bot.transformers.welcomeScreen(bot, snakelize(await bot.rest.editWelcomeScreen(guildId, options, reason))) + return bot.transformers.welcomeScreen(bot, snakelize(await bot.rest.editWelcomeScreen(guildId, options, reason))); }, editWidgetSettings: async (guildId, options, reason) => { - return bot.transformers.widgetSettings(bot, snakelize(await bot.rest.editWidgetSettings(guildId, options, reason))) + return bot.transformers.widgetSettings(bot, snakelize(await bot.rest.editWidgetSettings(guildId, options, reason))); }, executeWebhook: async (webhookId, token, options) => { - const result = await bot.rest.executeWebhook(webhookId, token, options) - if (!result) return + const result = await bot.rest.executeWebhook(webhookId, token, options); + if (!result) return; - return bot.transformers.message(bot, snakelize(result)) + return bot.transformers.message(bot, snakelize(result)); }, followAnnouncement: async (sourceChannelId, targetChannelId) => { - return await bot.rest.followAnnouncement(sourceChannelId, targetChannelId) + return await bot.rest.followAnnouncement(sourceChannelId, targetChannelId); }, getActiveThreads: async (guildId) => { - const result = await bot.rest.getActiveThreads(guildId) + const result = await bot.rest.getActiveThreads(guildId); return { threads: result.threads.map((thread) => bot.transformers.channel(bot, snakelize(thread), { guildId })), members: result.members.map((member) => bot.transformers.threadMember(bot, snakelize(member), { guildId })), - } + }; }, getApplicationInfo: async () => { - return bot.transformers.application(bot, snakelize(await bot.rest.getApplicationInfo())) + return bot.transformers.application(bot, snakelize(await bot.rest.getApplicationInfo())); }, editApplicationInfo: async (body) => { - return bot.transformers.application(bot, snakelize(await bot.rest.editApplicationInfo(body))) + return bot.transformers.application(bot, snakelize(await bot.rest.editApplicationInfo(body))); }, getCurrentAuthenticationInfo: async (bearerToken) => { - return await bot.rest.getCurrentAuthenticationInfo(bearerToken) + return await bot.rest.getCurrentAuthenticationInfo(bearerToken); }, exchangeToken: async (clientId, clientSecret, options) => { - return await bot.rest.exchangeToken(clientId, clientSecret, options) + return await bot.rest.exchangeToken(clientId, clientSecret, options); }, revokeToken: async (clientId, clientSecret, options) => { - return await bot.rest.revokeToken(clientId, clientSecret, options) + return await bot.rest.revokeToken(clientId, clientSecret, options); }, getApplicationCommandPermission: async (guildId, commandId, options) => { - const res = await bot.rest.getApplicationCommandPermission(guildId, commandId, options) - const snakedRes = snakelize(res) + const res = await bot.rest.getApplicationCommandPermission(guildId, commandId, options); + const snakedRes = snakelize(res); - return bot.transformers.applicationCommandPermission(bot, snakedRes) + return bot.transformers.applicationCommandPermission(bot, snakedRes); }, getApplicationCommandPermissions: async (guildId, options) => { return (await bot.rest.getApplicationCommandPermissions(guildId, options)).map((res) => bot.transformers.applicationCommandPermission(bot, snakelize(res)), - ) + ); }, getAuditLog: async (guildId, options) => { - return await bot.rest.getAuditLog(guildId, options) + return await bot.rest.getAuditLog(guildId, options); }, getAutomodRule: async (guildId, ruleId) => { - return bot.transformers.automodRule(bot, snakelize(await bot.rest.getAutomodRule(guildId, ruleId))) + return bot.transformers.automodRule(bot, snakelize(await bot.rest.getAutomodRule(guildId, ruleId))); }, getAutomodRules: async (guildId) => { - return (await bot.rest.getAutomodRules(guildId)).map((res) => bot.transformers.automodRule(bot, snakelize(res))) + return (await bot.rest.getAutomodRules(guildId)).map((res) => bot.transformers.automodRule(bot, snakelize(res))); }, getAvailableVoiceRegions: async () => { - return (await bot.rest.getAvailableVoiceRegions()).map((res) => bot.transformers.voiceRegion(bot, snakelize(res))) + return (await bot.rest.getAvailableVoiceRegions()).map((res) => bot.transformers.voiceRegion(bot, snakelize(res))); }, getBan: async (guildId, userId) => { - return await bot.rest.getBan(guildId, userId) + return await bot.rest.getBan(guildId, userId); }, getBans: async (guildId, options) => { - return await bot.rest.getBans(guildId, options) + return await bot.rest.getBans(guildId, options); }, getChannel: async (channelId) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.getChannel(channelId))) + return bot.transformers.channel(bot, snakelize(await bot.rest.getChannel(channelId))); }, getChannelInvites: async (channelId) => { - return await bot.rest.getChannelInvites(channelId) + return await bot.rest.getChannelInvites(channelId); // return (await bot.rest.getChannelInvites(channelId)).map((res) => bot.transformers.invite(bot, snakelize(res))) }, getChannels: async (guildId) => { - return (await bot.rest.getChannels(guildId)).map((res) => bot.transformers.channel(bot, snakelize(res), { guildId })) + return (await bot.rest.getChannels(guildId)).map((res) => bot.transformers.channel(bot, snakelize(res), { guildId })); }, getChannelWebhooks: async (channelId) => { - return (await bot.rest.getChannelWebhooks(channelId)).map((res) => bot.transformers.webhook(bot, snakelize(res))) + return (await bot.rest.getChannelWebhooks(channelId)).map((res) => bot.transformers.webhook(bot, snakelize(res))); }, getDmChannel: async (userId) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.getDmChannel(userId))) + return bot.transformers.channel(bot, snakelize(await bot.rest.getDmChannel(userId))); }, getGroupDmChannel: async (options) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.getGroupDmChannel(options))) + return bot.transformers.channel(bot, snakelize(await bot.rest.getGroupDmChannel(options))); }, getEmoji: async (guildId, emojiId) => { - return bot.transformers.emoji(bot, snakelize(await bot.rest.getEmoji(guildId, emojiId))) + return bot.transformers.emoji(bot, snakelize(await bot.rest.getEmoji(guildId, emojiId))); }, getApplicationEmoji: async (emojiId) => { - return bot.transformers.emoji(bot, snakelize(await bot.rest.getApplicationEmoji(emojiId))) + return bot.transformers.emoji(bot, snakelize(await bot.rest.getApplicationEmoji(emojiId))); }, getEmojis: async (guildId) => { - return (await bot.rest.getEmojis(guildId)).map((res) => bot.transformers.emoji(bot, snakelize(res))) + return (await bot.rest.getEmojis(guildId)).map((res) => bot.transformers.emoji(bot, snakelize(res))); }, getApplicationEmojis: async () => { - const res = await bot.rest.getApplicationEmojis() + const res = await bot.rest.getApplicationEmojis(); return { items: res.items.map((item) => bot.transformers.emoji(bot, snakelize(item))), - } + }; }, getFollowupMessage: async (token, messageId) => { - return bot.transformers.message(bot, snakelize(await bot.rest.getFollowupMessage(token, messageId))) + return bot.transformers.message(bot, snakelize(await bot.rest.getFollowupMessage(token, messageId))); }, getGatewayBot: async () => { - return bot.transformers.gatewayBot(bot, snakelize(await bot.rest.getGatewayBot())) + return bot.transformers.gatewayBot(bot, snakelize(await bot.rest.getGatewayBot())); }, getGlobalApplicationCommand: async (commandId) => { - return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.getGlobalApplicationCommand(commandId))) + return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.getGlobalApplicationCommand(commandId))); }, getGlobalApplicationCommands: async (options) => { - return (await bot.rest.getGlobalApplicationCommands(options)).map((res) => bot.transformers.applicationCommand(bot, snakelize(res))) + return (await bot.rest.getGlobalApplicationCommands(options)).map((res) => bot.transformers.applicationCommand(bot, snakelize(res))); }, getGuild: async (guildId, options) => { - return bot.transformers.guild(bot, snakelize(await bot.rest.getGuild(guildId, options))) + return bot.transformers.guild(bot, snakelize(await bot.rest.getGuild(guildId, options))); }, getGuilds: async (bearerToken, options) => { return (await bot.rest.getGuilds(bearerToken, options)).map>((res) => // @ts-expect-error getGuilds returns partial guilds bot.transformers.guild(bot, snakelize(res)), - ) + ); }, getGuildApplicationCommand: async (commandId, guildId) => { - return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.getGuildApplicationCommand(commandId, guildId))) + return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.getGuildApplicationCommand(commandId, guildId))); }, getGuildApplicationCommands: async (guildId, options) => { - return (await bot.rest.getGuildApplicationCommands(guildId, options)).map((res) => bot.transformers.applicationCommand(bot, snakelize(res))) + return (await bot.rest.getGuildApplicationCommands(guildId, options)).map((res) => bot.transformers.applicationCommand(bot, snakelize(res))); }, getGuildPreview: async (guildId) => { - return await bot.rest.getGuildPreview(guildId) + return await bot.rest.getGuildPreview(guildId); // return bot.transformers.xxx(bot, snakelize(await bot.rest.getGuildPreview(guildId))) }, getGuildSticker: async (guildId, stickerId) => { - return bot.transformers.sticker(bot, snakelize(await bot.rest.getGuildSticker(guildId, stickerId))) + return bot.transformers.sticker(bot, snakelize(await bot.rest.getGuildSticker(guildId, stickerId))); }, getGuildStickers: async (guildId) => { - return (await bot.rest.getGuildStickers(guildId)).map((res) => bot.transformers.sticker(bot, snakelize(res))) + return (await bot.rest.getGuildStickers(guildId)).map((res) => bot.transformers.sticker(bot, snakelize(res))); }, getGuildTemplate: async (templateCode) => { - return bot.transformers.template(bot, snakelize(await bot.rest.getGuildTemplate(templateCode))) + return bot.transformers.template(bot, snakelize(await bot.rest.getGuildTemplate(templateCode))); }, getGuildTemplates: async (guildId) => { - return (await bot.rest.getGuildTemplates(guildId)).map((res) => bot.transformers.template(bot, snakelize(res))) + return (await bot.rest.getGuildTemplates(guildId)).map((res) => bot.transformers.template(bot, snakelize(res))); }, getGuildWebhooks: async (guildId) => { - return (await bot.rest.getGuildWebhooks(guildId)).map((res) => bot.transformers.webhook(bot, snakelize(res))) + return (await bot.rest.getGuildWebhooks(guildId)).map((res) => bot.transformers.webhook(bot, snakelize(res))); }, getIntegrations: async (guildId) => { return (await bot.rest.getIntegrations(guildId)).map((res) => bot.transformers.integration(bot, snakelize({ ...res, guildId: guildId.toString() })), - ) + ); }, getInvite: async (inviteCode, options) => { - return bot.transformers.invite(bot, snakelize(await bot.rest.getInvite(inviteCode, options))) + return bot.transformers.invite(bot, snakelize(await bot.rest.getInvite(inviteCode, options))); }, getInvites: async (guildId) => { - return (await bot.rest.getInvites(guildId)).map((res) => bot.transformers.invite(bot, snakelize(res))) + return (await bot.rest.getInvites(guildId)).map((res) => bot.transformers.invite(bot, snakelize(res))); }, getMessage: async (channelId, messageId) => { - return bot.transformers.message(bot, snakelize(await bot.rest.getMessage(channelId, messageId))) + return bot.transformers.message(bot, snakelize(await bot.rest.getMessage(channelId, messageId))); }, getMessages: async (channelId, options) => { - return (await bot.rest.getMessages(channelId, options)).map((res) => bot.transformers.message(bot, snakelize(res))) + return (await bot.rest.getMessages(channelId, options)).map((res) => bot.transformers.message(bot, snakelize(res))); }, getStickerPack: async (stickerPackId) => { - return bot.transformers.stickerPack(bot, snakelize(await bot.rest.getStickerPack(stickerPackId))) + return bot.transformers.stickerPack(bot, snakelize(await bot.rest.getStickerPack(stickerPackId))); }, getStickerPacks: async () => { - return (await bot.rest.getStickerPacks()).map((res) => bot.transformers.stickerPack(bot, snakelize(res))) + return (await bot.rest.getStickerPacks()).map((res) => bot.transformers.stickerPack(bot, snakelize(res))); }, getOriginalInteractionResponse: async (token) => { - return bot.transformers.message(bot, snakelize(await bot.rest.getOriginalInteractionResponse(token))) + return bot.transformers.message(bot, snakelize(await bot.rest.getOriginalInteractionResponse(token))); }, getChannelPins: async (channelId, options) => { - const res = snakelize(await bot.rest.getChannelPins(channelId, options)) + const res = snakelize(await bot.rest.getChannelPins(channelId, options)); return { hasMore: res.has_more, items: res.items.map((item) => bot.transformers.messagePin(bot, item)), - } + }; }, getPinnedMessages: async (channelId) => { - return (await bot.rest.getPinnedMessages(channelId)).map((res) => bot.transformers.message(bot, snakelize(res))) + return (await bot.rest.getPinnedMessages(channelId)).map((res) => bot.transformers.message(bot, snakelize(res))); }, getPrivateArchivedThreads: async (channelId, options) => { - return await bot.rest.getPrivateArchivedThreads(channelId, options) + return await bot.rest.getPrivateArchivedThreads(channelId, options); }, getPrivateJoinedArchivedThreads: async (channelId, options) => { - return await bot.rest.getPrivateJoinedArchivedThreads(channelId, options) + return await bot.rest.getPrivateJoinedArchivedThreads(channelId, options); }, getPruneCount: async (guildId, options) => { - return await bot.rest.getPruneCount(guildId, options) + return await bot.rest.getPruneCount(guildId, options); }, getPublicArchivedThreads: async (channelId, options) => { - return await bot.rest.getPublicArchivedThreads(channelId, options) + return await bot.rest.getPublicArchivedThreads(channelId, options); }, getRoles: async (guildId) => { - return snakelize(await bot.rest.getRoles(guildId)).map((role) => bot.transformers.role(bot, role, { guildId })) + return snakelize(await bot.rest.getRoles(guildId)).map((role) => bot.transformers.role(bot, role, { guildId })); }, getRole: async (guildId, roleId) => { - return bot.transformers.role(bot, snakelize(await bot.rest.getRole(guildId, roleId)), { guildId }) + return bot.transformers.role(bot, snakelize(await bot.rest.getRole(guildId, roleId)), { guildId }); }, getScheduledEvent: async (guildId, eventId, options) => { - return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.getScheduledEvent(guildId, eventId, options))) + return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.getScheduledEvent(guildId, eventId, options))); }, getScheduledEvents: async (guildId, options) => { - return (await bot.rest.getScheduledEvents(guildId, options)).map((res) => bot.transformers.scheduledEvent(bot, snakelize(res))) + return (await bot.rest.getScheduledEvents(guildId, options)).map((res) => bot.transformers.scheduledEvent(bot, snakelize(res))); }, getScheduledEventUsers: async (guildId, eventId, options) => { return (await bot.rest.getScheduledEventUsers(guildId, eventId, options)).map((u) => { return { user: bot.transformers.user(bot, snakelize(u.user)), member: u.member && bot.transformers.member(bot, snakelize(u.member), { guildId, userId: bot.transformers.snowflake(u.user.id) }), - } - }) + }; + }); }, getSessionInfo: async () => { - return bot.transformers.gatewayBot(bot, snakelize(await bot.rest.getSessionInfo())) + return bot.transformers.gatewayBot(bot, snakelize(await bot.rest.getSessionInfo())); }, getStageInstance: async (channelId) => { - return bot.transformers.stageInstance(bot, snakelize(await bot.rest.getStageInstance(channelId))) + return bot.transformers.stageInstance(bot, snakelize(await bot.rest.getStageInstance(channelId))); }, getOwnVoiceState: async (guildId) => { - return bot.transformers.voiceState(bot, snakelize(await bot.rest.getOwnVoiceState(guildId)), { guildId }) + return bot.transformers.voiceState(bot, snakelize(await bot.rest.getOwnVoiceState(guildId)), { guildId }); }, getUserVoiceState: async (guildId, userId) => { - return bot.transformers.voiceState(bot, snakelize(await bot.rest.getUserVoiceState(guildId, userId)), { guildId }) + return bot.transformers.voiceState(bot, snakelize(await bot.rest.getUserVoiceState(guildId, userId)), { guildId }); }, getSticker: async (stickerId) => { - return bot.transformers.sticker(bot, snakelize(await bot.rest.getSticker(stickerId))) + return bot.transformers.sticker(bot, snakelize(await bot.rest.getSticker(stickerId))); }, getThreadMember: async (channelId, userId, options, extra) => { - return bot.transformers.threadMember(bot, snakelize(await bot.rest.getThreadMember(channelId, userId, options)), extra) + return bot.transformers.threadMember(bot, snakelize(await bot.rest.getThreadMember(channelId, userId, options)), extra); }, getThreadMembers: async (channelId, options, extra) => { - return (await bot.rest.getThreadMembers(channelId, options)).map((res) => bot.transformers.threadMember(bot, snakelize(res), extra)) + return (await bot.rest.getThreadMembers(channelId, options)).map((res) => bot.transformers.threadMember(bot, snakelize(res), extra)); }, getReactions: async (channelId, messageId, reaction, options) => { - return (await bot.rest.getReactions(channelId, messageId, reaction, options)).map((res) => bot.transformers.user(bot, snakelize(res))) + return (await bot.rest.getReactions(channelId, messageId, reaction, options)).map((res) => bot.transformers.user(bot, snakelize(res))); }, getUser: async (id) => { - return bot.transformers.user(bot, snakelize(await bot.rest.getUser(id))) + return bot.transformers.user(bot, snakelize(await bot.rest.getUser(id))); }, getCurrentUser: async (bearerToken) => { - return bot.transformers.user(bot, snakelize(await bot.rest.getCurrentUser(bearerToken))) + return bot.transformers.user(bot, snakelize(await bot.rest.getCurrentUser(bearerToken))); }, getUserConnections: async (bearerToken) => { - return await bot.rest.getUserConnections(bearerToken) + return await bot.rest.getUserConnections(bearerToken); }, getUserApplicationRoleConnection: async (bearerToken, applicationId) => { - return await bot.rest.getUserApplicationRoleConnection(bearerToken, applicationId) + return await bot.rest.getUserApplicationRoleConnection(bearerToken, applicationId); }, getVanityUrl: async (guildId) => { - return await bot.rest.getVanityUrl(guildId) + return await bot.rest.getVanityUrl(guildId); }, getVoiceRegions: async (guildId) => { - return (await bot.rest.getVoiceRegions(guildId)).map((res) => bot.transformers.voiceRegion(bot, snakelize(res))) + return (await bot.rest.getVoiceRegions(guildId)).map((res) => bot.transformers.voiceRegion(bot, snakelize(res))); }, getWebhook: async (webhookId) => { - return bot.transformers.webhook(bot, snakelize(await bot.rest.getWebhook(webhookId))) + return bot.transformers.webhook(bot, snakelize(await bot.rest.getWebhook(webhookId))); }, getWebhookMessage: async (webhookId, token, messageId, options) => { - return bot.transformers.message(bot, snakelize(await bot.rest.getWebhookMessage(webhookId, token, messageId, options))) + return bot.transformers.message(bot, snakelize(await bot.rest.getWebhookMessage(webhookId, token, messageId, options))); }, getWebhookWithToken: async (webhookId, token) => { - return bot.transformers.webhook(bot, snakelize(await bot.rest.getWebhookWithToken(webhookId, token))) + return bot.transformers.webhook(bot, snakelize(await bot.rest.getWebhookWithToken(webhookId, token))); }, getWelcomeScreen: async (guildId) => { - return bot.transformers.welcomeScreen(bot, snakelize(await bot.rest.getWelcomeScreen(guildId))) + return bot.transformers.welcomeScreen(bot, snakelize(await bot.rest.getWelcomeScreen(guildId))); }, getWidget: async (guildId) => { - return bot.transformers.widget(bot, snakelize(await bot.rest.getWidget(guildId))) + return bot.transformers.widget(bot, snakelize(await bot.rest.getWidget(guildId))); }, getWidgetSettings: async (guildId) => { - return bot.transformers.widgetSettings(bot, snakelize(await bot.rest.getWidgetSettings(guildId))) + return bot.transformers.widgetSettings(bot, snakelize(await bot.rest.getWidgetSettings(guildId))); }, publishMessage: async (channelId, messageId) => { - return bot.transformers.message(bot, snakelize(await bot.rest.publishMessage(channelId, messageId))) + return bot.transformers.message(bot, snakelize(await bot.rest.publishMessage(channelId, messageId))); }, sendMessage: async (channelId, options) => { - return bot.transformers.message(bot, snakelize(await bot.rest.sendMessage(channelId, options))) + return bot.transformers.message(bot, snakelize(await bot.rest.sendMessage(channelId, options))); }, sendFollowupMessage: async (token, options) => { - return bot.transformers.message(bot, snakelize(await bot.rest.sendFollowupMessage(token, options))) + return bot.transformers.message(bot, snakelize(await bot.rest.sendFollowupMessage(token, options))); }, startThreadWithMessage: async (channelId, messageId, options, reason) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.startThreadWithMessage(channelId, messageId, options, reason))) + return bot.transformers.channel(bot, snakelize(await bot.rest.startThreadWithMessage(channelId, messageId, options, reason))); }, startThreadWithoutMessage: async (channelId, options, reason) => { - return bot.transformers.channel(bot, snakelize(await bot.rest.startThreadWithoutMessage(channelId, options, reason))) + return bot.transformers.channel(bot, snakelize(await bot.rest.startThreadWithoutMessage(channelId, options, reason))); }, syncGuildTemplate: async (guildId) => { - return bot.transformers.template(bot, snakelize(await bot.rest.syncGuildTemplate(guildId))) + return bot.transformers.template(bot, snakelize(await bot.rest.syncGuildTemplate(guildId))); }, upsertGlobalApplicationCommands: async (commands, options) => { return (await bot.rest.upsertGlobalApplicationCommands(commands, options)).map((res) => bot.transformers.applicationCommand(bot, snakelize(res)), - ) + ); }, upsertGuildApplicationCommands: async (guildId, commands, options) => { return (await bot.rest.upsertGuildApplicationCommands(guildId, commands, options)).map((res) => bot.transformers.applicationCommand(bot, snakelize(res)), - ) + ); }, editBotMember: async (guildId, options, reason) => { - return bot.transformers.member(bot, snakelize(await bot.rest.editBotMember(guildId, options, reason)), { guildId, userId: bot.id }) + return bot.transformers.member(bot, snakelize(await bot.rest.editBotMember(guildId, options, reason)), { guildId, userId: bot.id }); }, editMember: async (guildId, userId, options, reason) => { - return bot.transformers.member(bot, snakelize(await bot.rest.editMember(guildId, userId, options, reason)), { guildId, userId }) + return bot.transformers.member(bot, snakelize(await bot.rest.editMember(guildId, userId, options, reason)), { guildId, userId }); }, getMember: async (guildId, userId) => { - return bot.transformers.member(bot, snakelize(await bot.rest.getMember(guildId, userId)), { guildId, userId }) + return bot.transformers.member(bot, snakelize(await bot.rest.getMember(guildId, userId)), { guildId, userId }); }, getCurrentMember: async (guildId, bearerToken) => { - const res = await bot.rest.getCurrentMember(guildId, bearerToken) - return bot.transformers.member(bot, snakelize(res), { guildId, userId: bot.transformers.snowflake(res.user.id) }) + const res = await bot.rest.getCurrentMember(guildId, bearerToken); + return bot.transformers.member(bot, snakelize(res), { guildId, userId: bot.transformers.snowflake(res.user.id) }); }, getMembers: async (guildId, options) => { return (await bot.rest.getMembers(guildId, options)).map((res) => bot.transformers.member(bot, snakelize(res), { guildId, userId: bot.transformers.snowflake(res.user.id) }), - ) + ); }, pruneMembers: async (guildId, options, reason) => { - return await bot.rest.pruneMembers(guildId, options, reason) + return await bot.rest.pruneMembers(guildId, options, reason); }, searchMembers: async (guildId, query, options) => { return (await bot.rest.searchMembers(guildId, query, options)).map((res) => bot.transformers.member(bot, snakelize(res), { guildId, userId: bot.transformers.snowflake(res.user.id) }), - ) + ); }, bulkBanMembers: async (guildId, options, reason) => { - const res = await bot.rest.bulkBanMembers(guildId, options, reason) + const res = await bot.rest.bulkBanMembers(guildId, options, reason); return { bannedUsers: res.bannedUsers.map((x) => bot.transformers.snowflake(x)), failedUsers: res.failedUsers.map((x) => bot.transformers.snowflake(x)), - } + }; }, getApplicationActivityInstance: async (applicationId, instanceId) => { - return await bot.rest.getApplicationActivityInstance(applicationId, instanceId) + return await bot.rest.getApplicationActivityInstance(applicationId, instanceId); }, listApplicationRoleConnectionsMetadataRecords: async (applicationId) => { - return await bot.rest.listApplicationRoleConnectionsMetadataRecords(applicationId) + return await bot.rest.listApplicationRoleConnectionsMetadataRecords(applicationId); }, updateApplicationRoleConnectionsMetadataRecords: async (applicationId, options) => { - return await bot.rest.updateApplicationRoleConnectionsMetadataRecords(applicationId, options) + return await bot.rest.updateApplicationRoleConnectionsMetadataRecords(applicationId, options); }, createLobby: async (options) => { - return bot.transformers.lobby(bot, snakelize(await bot.rest.createLobby(options))) + return bot.transformers.lobby(bot, snakelize(await bot.rest.createLobby(options))); }, getLobby: async (lobbyId) => { - return bot.transformers.lobby(bot, snakelize(await bot.rest.getLobby(lobbyId))) + return bot.transformers.lobby(bot, snakelize(await bot.rest.getLobby(lobbyId))); }, modifyLobby: async (lobbyId, options) => { - return bot.transformers.lobby(bot, snakelize(await bot.rest.modifyLobby(lobbyId, options))) + return bot.transformers.lobby(bot, snakelize(await bot.rest.modifyLobby(lobbyId, options))); }, addMemberToLobby: async (lobbyId, userId, options) => { - return bot.transformers.lobbyMember(bot, snakelize(await bot.rest.addMemberToLobby(lobbyId, userId, options))) + return bot.transformers.lobbyMember(bot, snakelize(await bot.rest.addMemberToLobby(lobbyId, userId, options))); }, linkChannelToLobby: async (lobbyId, bearerToken, options) => { - return bot.transformers.lobby(bot, snakelize(await bot.rest.linkChannelToLobby(lobbyId, bearerToken, options))) + return bot.transformers.lobby(bot, snakelize(await bot.rest.linkChannelToLobby(lobbyId, bearerToken, options))); }, unlinkChannelToLobby: async (lobbyId, bearerToken) => { - return bot.transformers.lobby(bot, snakelize(await bot.rest.unlinkChannelToLobby(lobbyId, bearerToken))) + return bot.transformers.lobby(bot, snakelize(await bot.rest.unlinkChannelToLobby(lobbyId, bearerToken))); }, // All useless void return functions here addReaction: async (channelId, messageId, reaction) => { - return await bot.rest.addReaction(channelId, messageId, reaction) + return await bot.rest.addReaction(channelId, messageId, reaction); }, addReactions: async (channelId, messageId, reactions, ordered) => { - return await bot.rest.addReactions(channelId, messageId, reactions, ordered) + return await bot.rest.addReactions(channelId, messageId, reactions, ordered); }, addRole: async (guildId, userId, roleId, reason) => { - return await bot.rest.addRole(guildId, userId, roleId, reason) + return await bot.rest.addRole(guildId, userId, roleId, reason); }, addThreadMember: async (channelId, userId) => { - return await bot.rest.addThreadMember(channelId, userId) + return await bot.rest.addThreadMember(channelId, userId); }, addDmRecipient: async (channelId, userId, options) => { - return await bot.rest.addDmRecipient(channelId, userId, options) + return await bot.rest.addDmRecipient(channelId, userId, options); }, addGuildMember: async (guildId, userId, options) => { - return await bot.rest.addGuildMember(guildId, userId, options) + return await bot.rest.addGuildMember(guildId, userId, options); }, deleteAutomodRule: async (guildId, ruleId, reason) => { - return await bot.rest.deleteAutomodRule(guildId, ruleId, reason) + return await bot.rest.deleteAutomodRule(guildId, ruleId, reason); }, deleteChannel: async (channelId, reason) => { - return await bot.rest.deleteChannel(channelId, reason) + return await bot.rest.deleteChannel(channelId, reason); }, deleteChannelPermissionOverride: async (channelId, overwriteId, reason) => { - return await bot.rest.deleteChannelPermissionOverride(channelId, overwriteId, reason) + return await bot.rest.deleteChannelPermissionOverride(channelId, overwriteId, reason); }, deleteEmoji: async (guildId, id, reason) => { - return await bot.rest.deleteEmoji(guildId, id, reason) + return await bot.rest.deleteEmoji(guildId, id, reason); }, deleteApplicationEmoji: async (id) => { - return await bot.rest.deleteApplicationEmoji(id) + return await bot.rest.deleteApplicationEmoji(id); }, deleteFollowupMessage: async (token, messageId) => { - return await bot.rest.deleteFollowupMessage(token, messageId) + return await bot.rest.deleteFollowupMessage(token, messageId); }, deleteGlobalApplicationCommand: async (commandId) => { - return await bot.rest.deleteGlobalApplicationCommand(commandId) + return await bot.rest.deleteGlobalApplicationCommand(commandId); }, deleteGuildApplicationCommand: async (commandId, guildId) => { - return await bot.rest.deleteGuildApplicationCommand(commandId, guildId) + return await bot.rest.deleteGuildApplicationCommand(commandId, guildId); }, deleteGuildSticker: async (guildId, stickerId, reason) => { - return await bot.rest.deleteGuildSticker(guildId, stickerId, reason) + return await bot.rest.deleteGuildSticker(guildId, stickerId, reason); }, deleteGuildTemplate: async (guildId, templateCode) => { - return await bot.rest.deleteGuildTemplate(guildId, templateCode) + return await bot.rest.deleteGuildTemplate(guildId, templateCode); }, deleteIntegration: async (guildId, integrationId, reason) => { - return await bot.rest.deleteIntegration(guildId, integrationId, reason) + return await bot.rest.deleteIntegration(guildId, integrationId, reason); }, deleteInvite: async (inviteCode, reason) => { - return await bot.rest.deleteInvite(inviteCode, reason) + return await bot.rest.deleteInvite(inviteCode, reason); }, deleteMessage: async (channelId, messageId, reason) => { - return await bot.rest.deleteMessage(channelId, messageId, reason) + return await bot.rest.deleteMessage(channelId, messageId, reason); }, deleteMessages: async (channelId, messageIds, reason) => { - return await bot.rest.deleteMessages(channelId, messageIds, reason) + return await bot.rest.deleteMessages(channelId, messageIds, reason); }, deleteOriginalInteractionResponse: async (token) => { - return await bot.rest.deleteOriginalInteractionResponse(token) + return await bot.rest.deleteOriginalInteractionResponse(token); }, deleteOwnReaction: async (channelId, messageId, reaction) => { - return await bot.rest.deleteOwnReaction(channelId, messageId, reaction) + return await bot.rest.deleteOwnReaction(channelId, messageId, reaction); }, deleteReactionsAll: async (channelId, messageId) => { - return await bot.rest.deleteReactionsAll(channelId, messageId) + return await bot.rest.deleteReactionsAll(channelId, messageId); }, deleteReactionsEmoji: async (channelId, messageId, reaction) => { - return await bot.rest.deleteReactionsEmoji(channelId, messageId, reaction) + return await bot.rest.deleteReactionsEmoji(channelId, messageId, reaction); }, deleteRole: async (guildId, roleId, reason) => { - return await bot.rest.deleteRole(guildId, roleId, reason) + return await bot.rest.deleteRole(guildId, roleId, reason); }, deleteScheduledEvent: async (guildId, eventId) => { - return await bot.rest.deleteScheduledEvent(guildId, eventId) + return await bot.rest.deleteScheduledEvent(guildId, eventId); }, deleteStageInstance: async (channelId, reason) => { - return await bot.rest.deleteStageInstance(channelId, reason) + return await bot.rest.deleteStageInstance(channelId, reason); }, deleteUserReaction: async (channelId, messageId, userId, reaction) => { - return await bot.rest.deleteUserReaction(channelId, messageId, userId, reaction) + return await bot.rest.deleteUserReaction(channelId, messageId, userId, reaction); }, deleteWebhook: async (webhookId, reason) => { - return await bot.rest.deleteWebhook(webhookId, reason) + return await bot.rest.deleteWebhook(webhookId, reason); }, deleteWebhookMessage: async (webhookId, token, messageId, options) => { - return await bot.rest.deleteWebhookMessage(webhookId, token, messageId, options) + return await bot.rest.deleteWebhookMessage(webhookId, token, messageId, options); }, deleteWebhookWithToken: async (webhookId, token) => { - return await bot.rest.deleteWebhookWithToken(webhookId, token) + return await bot.rest.deleteWebhookWithToken(webhookId, token); }, editChannelPermissionOverrides: async (channelId, options, reason) => { - return await bot.rest.editChannelPermissionOverrides(channelId, options, reason) + return await bot.rest.editChannelPermissionOverrides(channelId, options, reason); }, editChannelPositions: async (guildId, channelPositions) => { - return await bot.rest.editChannelPositions(guildId, channelPositions) + return await bot.rest.editChannelPositions(guildId, channelPositions); }, editOwnVoiceState: async (guildId, options) => { - return await bot.rest.editOwnVoiceState(guildId, options) + return await bot.rest.editOwnVoiceState(guildId, options); }, editUserVoiceState: async (guildId, options) => { - return await bot.rest.editUserVoiceState(guildId, options) + return await bot.rest.editUserVoiceState(guildId, options); }, editUserApplicationRoleConnection: async (bearerToken, applicationId, options) => { - return await bot.rest.editUserApplicationRoleConnection(bearerToken, applicationId, options) + return await bot.rest.editUserApplicationRoleConnection(bearerToken, applicationId, options); }, joinThread: async (channelId) => { - return await bot.rest.joinThread(channelId) + return await bot.rest.joinThread(channelId); }, leaveGuild: async (guildId) => { - return await bot.rest.leaveGuild(guildId) + return await bot.rest.leaveGuild(guildId); }, leaveThread: async (channelId) => { - return await bot.rest.leaveThread(channelId) + return await bot.rest.leaveThread(channelId); }, removeRole: async (guildId, userId, roleId, reason) => { - return await bot.rest.removeRole(guildId, userId, roleId, reason) + return await bot.rest.removeRole(guildId, userId, roleId, reason); }, removeThreadMember: async (channelId, userId) => { - return await bot.rest.removeThreadMember(channelId, userId) + return await bot.rest.removeThreadMember(channelId, userId); }, removeDmRecipient: async (channelId, userId) => { - return await bot.rest.removeDmRecipient(channelId, userId) + return await bot.rest.removeDmRecipient(channelId, userId); }, sendInteractionResponse: async (interactionId, token, options, params) => { - const response = await bot.rest.sendInteractionResponse(interactionId, token, options, params) + const response = await bot.rest.sendInteractionResponse(interactionId, token, options, params); - if (!response) return + if (!response) return; - return bot.transformers.interactionCallbackResponse(bot, snakelize(response)) + return bot.transformers.interactionCallbackResponse(bot, snakelize(response)); }, triggerTypingIndicator: async (channelId) => { - return await bot.rest.triggerTypingIndicator(channelId) + return await bot.rest.triggerTypingIndicator(channelId); }, banMember: async (guildId, userId, options, reason) => { - return await bot.rest.banMember(guildId, userId, options, reason) + return await bot.rest.banMember(guildId, userId, options, reason); }, kickMember: async (guildId, userId, reason) => { - return await bot.rest.kickMember(guildId, userId, reason) + return await bot.rest.kickMember(guildId, userId, reason); }, pinMessage: async (channelId, messageId, reason) => { - return await bot.rest.pinMessage(channelId, messageId, reason) + return await bot.rest.pinMessage(channelId, messageId, reason); }, unbanMember: async (guildId, userId, reason) => { - return await bot.rest.unbanMember(guildId, userId, reason) + return await bot.rest.unbanMember(guildId, userId, reason); }, unpinMessage: async (channelId, messageId, reason) => { - return await bot.rest.unpinMessage(channelId, messageId, reason) + return await bot.rest.unpinMessage(channelId, messageId, reason); }, getGuildOnboarding: async (guildId) => { - return bot.transformers.guildOnboarding(bot, snakelize(await bot.rest.getGuildOnboarding(guildId))) + return bot.transformers.guildOnboarding(bot, snakelize(await bot.rest.getGuildOnboarding(guildId))); }, editGuildOnboarding: async (guildId, options, reason) => { - return bot.transformers.guildOnboarding(bot, snakelize(await bot.rest.editGuildOnboarding(guildId, options, reason))) + return bot.transformers.guildOnboarding(bot, snakelize(await bot.rest.editGuildOnboarding(guildId, options, reason))); }, listEntitlements: async (applicationId, options) => { - return (await bot.rest.listEntitlements(applicationId, options)).map((entitlement) => bot.transformers.entitlement(bot, snakelize(entitlement))) + return (await bot.rest.listEntitlements(applicationId, options)).map((entitlement) => + bot.transformers.entitlement(bot, snakelize(entitlement)), + ); }, getEntitlement: async (applicationId, entitlementId) => { - return bot.transformers.entitlement(bot, snakelize(await bot.rest.getEntitlement(applicationId, entitlementId))) + return bot.transformers.entitlement(bot, snakelize(await bot.rest.getEntitlement(applicationId, entitlementId))); }, createTestEntitlement: async (applicationId, body) => { // @ts-expect-error createTestEntitlement gives a partial, and this method returns a partial return bot.transformers.entitlement(bot, snakelize(await bot.rest.createTestEntitlement(applicationId, body))) as Partial< typeof bot.transformers.$inferredTypes.entitlement - > + >; }, deleteTestEntitlement: async (applicationId, entitlementId) => { - await bot.rest.deleteTestEntitlement(applicationId, entitlementId) + await bot.rest.deleteTestEntitlement(applicationId, entitlementId); }, listSkus: async (applicationId) => { - return (await bot.rest.listSkus(applicationId)).map((sku) => bot.transformers.sku(bot, snakelize(sku))) + return (await bot.rest.listSkus(applicationId)).map((sku) => bot.transformers.sku(bot, snakelize(sku))); }, getSubscription: async (skuId, subscriptionId) => { - return bot.transformers.subscription(bot, snakelize(await bot.rest.getSubscription(skuId, subscriptionId))) + return bot.transformers.subscription(bot, snakelize(await bot.rest.getSubscription(skuId, subscriptionId))); }, listSubscriptions: async (skuId, options) => { - return (await bot.rest.listSubscriptions(skuId, options)).map((subscription) => bot.transformers.subscription(bot, snakelize(subscription))) + return (await bot.rest.listSubscriptions(skuId, options)).map((subscription) => bot.transformers.subscription(bot, snakelize(subscription))); }, sendSoundboardSound: async (channelId, options) => { - await bot.rest.sendSoundboardSound(channelId, options) + await bot.rest.sendSoundboardSound(channelId, options); }, listDefaultSoundboardSounds: async () => { - return (await bot.rest.listDefaultSoundboardSounds()).map((sound) => bot.transformers.soundboardSound(bot, snakelize(sound))) + return (await bot.rest.listDefaultSoundboardSounds()).map((sound) => bot.transformers.soundboardSound(bot, snakelize(sound))); }, listGuildSoundboardSounds: async (guildId) => { - const res = await bot.rest.listGuildSoundboardSounds(guildId) + const res = await bot.rest.listGuildSoundboardSounds(guildId); return { items: res.items.map((sound) => bot.transformers.soundboardSound(bot, snakelize(sound))), - } + }; }, getGuildSoundboardSound: async (guildId, soundId) => { - return bot.transformers.soundboardSound(bot, snakelize(await bot.rest.getGuildSoundboardSound(guildId, soundId))) + return bot.transformers.soundboardSound(bot, snakelize(await bot.rest.getGuildSoundboardSound(guildId, soundId))); }, createGuildSoundboardSound: async (guildId, options, reason) => { - return bot.transformers.soundboardSound(bot, snakelize(await bot.rest.createGuildSoundboardSound(guildId, options, reason))) + return bot.transformers.soundboardSound(bot, snakelize(await bot.rest.createGuildSoundboardSound(guildId, options, reason))); }, modifyGuildSoundboardSound: async (guildId, soundId, options, reason) => { - return bot.transformers.soundboardSound(bot, snakelize(await bot.rest.modifyGuildSoundboardSound(guildId, soundId, options, reason))) + return bot.transformers.soundboardSound(bot, snakelize(await bot.rest.modifyGuildSoundboardSound(guildId, soundId, options, reason))); }, deleteGuildSoundboardSound: async (guildId, soundId, reason) => { - await bot.rest.deleteGuildSoundboardSound(guildId, soundId, reason) + await bot.rest.deleteGuildSoundboardSound(guildId, soundId, reason); }, deleteLobby: async (lobbyId) => { - await bot.rest.deleteLobby(lobbyId) + await bot.rest.deleteLobby(lobbyId); }, removeMemberFromLobby: async (lobbyId, userId) => { - await bot.rest.removeMemberFromLobby(lobbyId, userId) + await bot.rest.removeMemberFromLobby(lobbyId, userId); }, leaveLobby: async (lobbyId, bearerToken) => { - await bot.rest.leaveLobby(lobbyId, bearerToken) + await bot.rest.leaveLobby(lobbyId, bearerToken); }, - } + }; } export type BotHelpers = { - createAutomodRule: (guildId: BigString, options: CreateAutoModerationRuleOptions, reason?: string) => Promise - createChannel: (guildId: BigString, options: CreateGuildChannel, reason?: string) => Promise> - createEmoji: (guildId: BigString, options: CreateGuildEmoji, reason?: string) => Promise> - createApplicationEmoji: (options: CreateApplicationEmoji) => Promise> + createAutomodRule: (guildId: BigString, options: CreateAutoModerationRuleOptions, reason?: string) => Promise; + createChannel: (guildId: BigString, options: CreateGuildChannel, reason?: string) => Promise>; + createEmoji: (guildId: BigString, options: CreateGuildEmoji, reason?: string) => Promise>; + createApplicationEmoji: (options: CreateApplicationEmoji) => Promise>; createForumThread: ( channelId: BigString, options: CreateForumPostWithMessage, reason?: string, - ) => Promise> - createGlobalApplicationCommand: (command: CreateApplicationCommand, options?: CreateGlobalApplicationCommandOptions) => Promise + ) => Promise>; + createGlobalApplicationCommand: (command: CreateApplicationCommand, options?: CreateGlobalApplicationCommandOptions) => Promise; createGuildApplicationCommand: ( command: CreateApplicationCommand, guildId: BigString, options?: CreateGuildApplicationCommandOptions, - ) => Promise + ) => Promise; createGuildSticker: ( guildId: BigString, options: CreateGuildStickerOptions, reason?: string, - ) => Promise> - createGuildTemplate: (guildId: BigString, options: CreateTemplate) => Promise