@erinjs/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/.changeset/README.md +8 -0
- package/core/.changeset/community-bootstrap-release.md +17 -0
- package/core/.changeset/config.json +11 -0
- package/core/.changeset/no-changelog.js +16 -0
- package/core/.changeset/pre.json +17 -0
- package/core/.editorconfig +13 -0
- package/core/.gitattributes +2 -0
- package/core/.github/CODE_OF_CONDUCT.md +23 -0
- package/core/.github/FUNDING.yml +7 -0
- package/core/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
- package/core/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- package/core/.github/PULL_REQUEST_TEMPLATE.md +16 -0
- package/core/.github/dependabot.yml +16 -0
- package/core/.github/workflows/autoapp.yml +16 -0
- package/core/.github/workflows/ci.yml +187 -0
- package/core/.github/workflows/codeql.yml +30 -0
- package/core/.github/workflows/deploy-docs.yml +54 -0
- package/core/.github/workflows/publish.yml +43 -0
- package/core/.lintstagedrc.json +4 -0
- package/core/.nvmrc +1 -0
- package/core/.prettierignore +8 -0
- package/core/.prettierrc +11 -0
- package/core/CONTRIBUTING.md +70 -0
- package/core/LICENSE +203 -0
- package/core/README.md +61 -0
- package/core/SECURITY.md +21 -0
- package/core/apps/docs/index.html +28 -0
- package/core/apps/docs/middleware.ts +21 -0
- package/core/apps/docs/package.json +33 -0
- package/core/apps/docs/public/@flux.png +0 -0
- package/core/apps/docs/public/docs/latest/guides.json +1420 -0
- package/core/apps/docs/public/docs/latest/main.json +14981 -0
- package/core/apps/docs/public/docs/latest/rag-index.json +1 -0
- package/core/apps/docs/public/docs/v1.0.5/guides.json +226 -0
- package/core/apps/docs/public/docs/v1.0.5/main.json +7920 -0
- package/core/apps/docs/public/docs/v1.0.6/guides.json +226 -0
- package/core/apps/docs/public/docs/v1.0.6/main.json +7920 -0
- package/core/apps/docs/public/docs/v1.0.7/guides.json +259 -0
- package/core/apps/docs/public/docs/v1.0.7/main.json +8652 -0
- package/core/apps/docs/public/docs/v1.0.8/guides.json +313 -0
- package/core/apps/docs/public/docs/v1.0.8/main.json +9618 -0
- package/core/apps/docs/public/docs/v1.0.9/guides.json +319 -0
- package/core/apps/docs/public/docs/v1.0.9/main.json +10694 -0
- package/core/apps/docs/public/docs/v1.1.0/guides.json +589 -0
- package/core/apps/docs/public/docs/v1.1.0/main.json +12576 -0
- package/core/apps/docs/public/docs/v1.1.2/guides.json +650 -0
- package/core/apps/docs/public/docs/v1.1.2/main.json +13239 -0
- package/core/apps/docs/public/docs/v1.1.3/guides.json +650 -0
- package/core/apps/docs/public/docs/v1.1.3/main.json +13239 -0
- package/core/apps/docs/public/docs/v1.1.4/guides.json +708 -0
- package/core/apps/docs/public/docs/v1.1.4/main.json +13231 -0
- package/core/apps/docs/public/docs/v1.1.5/guides.json +1035 -0
- package/core/apps/docs/public/docs/v1.1.5/main.json +13838 -0
- package/core/apps/docs/public/docs/v1.1.6/guides.json +1041 -0
- package/core/apps/docs/public/docs/v1.1.6/main.json +14313 -0
- package/core/apps/docs/public/docs/v1.1.8/guides.json +1047 -0
- package/core/apps/docs/public/docs/v1.1.8/main.json +14421 -0
- package/core/apps/docs/public/docs/v1.1.9/guides.json +1047 -0
- package/core/apps/docs/public/docs/v1.1.9/main.json +14421 -0
- package/core/apps/docs/public/docs/v1.2.0/guides.json +1212 -0
- package/core/apps/docs/public/docs/v1.2.0/main.json +14663 -0
- package/core/apps/docs/public/docs/v1.2.1/guides.json +1293 -0
- package/core/apps/docs/public/docs/v1.2.1/main.json +14828 -0
- package/core/apps/docs/public/docs/v1.2.2/guides.json +1293 -0
- package/core/apps/docs/public/docs/v1.2.2/main.json +15025 -0
- package/core/apps/docs/public/docs/v1.2.3/guides.json +1420 -0
- package/core/apps/docs/public/docs/v1.2.3/main.json +14954 -0
- package/core/apps/docs/public/docs/v1.2.4/guides.json +1420 -0
- package/core/apps/docs/public/docs/v1.2.4/main.json +14981 -0
- package/core/apps/docs/public/docs/versions.json +24 -0
- package/core/apps/docs/public/flux.png +0 -0
- package/core/apps/docs/public/locales/en.json +50 -0
- package/core/apps/docs/public/locales/guides-en.json +512 -0
- package/core/apps/docs/public/robots.txt +4 -0
- package/core/apps/docs/public/sitemap.xml +33 -0
- package/core/apps/docs/src/App.vue +538 -0
- package/core/apps/docs/src/components/ApiCategorySection.vue +42 -0
- package/core/apps/docs/src/components/ApiDiscordCompat.vue +65 -0
- package/core/apps/docs/src/components/ApiEndpointCard.vue +313 -0
- package/core/apps/docs/src/components/ApiSchemaBlock.vue +131 -0
- package/core/apps/docs/src/components/CodeBlock.vue +177 -0
- package/core/apps/docs/src/components/CommunityCallout.vue +90 -0
- package/core/apps/docs/src/components/ConstructorSection.vue +82 -0
- package/core/apps/docs/src/components/DocDescription.vue +40 -0
- package/core/apps/docs/src/components/FluxerLogo.vue +3 -0
- package/core/apps/docs/src/components/Footer.vue +106 -0
- package/core/apps/docs/src/components/GuideCodeBlock.vue +102 -0
- package/core/apps/docs/src/components/GuideDiscordCompat.vue +77 -0
- package/core/apps/docs/src/components/GuideDiscordCompatCallout.vue +83 -0
- package/core/apps/docs/src/components/GuideTable.vue +77 -0
- package/core/apps/docs/src/components/GuideTip.vue +38 -0
- package/core/apps/docs/src/components/MethodsSection.vue +195 -0
- package/core/apps/docs/src/components/ParamsTable.vue +70 -0
- package/core/apps/docs/src/components/PropertiesSection.vue +143 -0
- package/core/apps/docs/src/components/SearchBar.vue +76 -0
- package/core/apps/docs/src/components/SearchModal.vue +361 -0
- package/core/apps/docs/src/components/SidebarNav.vue +225 -0
- package/core/apps/docs/src/components/SponsorBanner.vue +153 -0
- package/core/apps/docs/src/components/TypeSignature.vue +187 -0
- package/core/apps/docs/src/components/VersionPicker.vue +191 -0
- package/core/apps/docs/src/composables/useSearchIndex.ts +144 -0
- package/core/apps/docs/src/composables/useVersionedPath.ts +20 -0
- package/core/apps/docs/src/data/apiEndpoints.ts +1073 -0
- package/core/apps/docs/src/data/changelog.ts +717 -0
- package/core/apps/docs/src/data/guides.ts +2362 -0
- package/core/apps/docs/src/env.d.ts +7 -0
- package/core/apps/docs/src/locales/guides-en.json +512 -0
- package/core/apps/docs/src/main.ts +27 -0
- package/core/apps/docs/src/pages/ApiReferenceLayout.vue +175 -0
- package/core/apps/docs/src/pages/ApiReferencePage.vue +128 -0
- package/core/apps/docs/src/pages/Changelog.vue +288 -0
- package/core/apps/docs/src/pages/ClassPage.vue +319 -0
- package/core/apps/docs/src/pages/ClassesList.vue +100 -0
- package/core/apps/docs/src/pages/DocsLayout.vue +127 -0
- package/core/apps/docs/src/pages/GuidePage.vue +279 -0
- package/core/apps/docs/src/pages/GuidesIndex.vue +166 -0
- package/core/apps/docs/src/pages/GuidesLayout.vue +245 -0
- package/core/apps/docs/src/pages/Home.vue +125 -0
- package/core/apps/docs/src/pages/NotFound.vue +57 -0
- package/core/apps/docs/src/pages/TypedefPage.vue +230 -0
- package/core/apps/docs/src/pages/TypedefsList.vue +168 -0
- package/core/apps/docs/src/pages/VersionLayout.vue +15 -0
- package/core/apps/docs/src/router.ts +73 -0
- package/core/apps/docs/src/stores/docs.ts +54 -0
- package/core/apps/docs/src/stores/guides.ts +53 -0
- package/core/apps/docs/src/stores/version.ts +67 -0
- package/core/apps/docs/src/styles/main.css +278 -0
- package/core/apps/docs/src/styles/prism.css +95 -0
- package/core/apps/docs/src/types/doc-schema.ts +112 -0
- package/core/apps/docs/tsconfig.json +17 -0
- package/core/apps/docs/tsconfig.node.json +10 -0
- package/core/apps/docs/vite.config.d.ts +2 -0
- package/core/apps/docs/vite.config.js +26 -0
- package/core/apps/docs/vite.config.ts +28 -0
- package/core/apps/docs-vitepress/.vitepress/config.ts +141 -0
- package/core/apps/docs-vitepress/api-data/latest/main.json +15035 -0
- package/core/apps/docs-vitepress/api-data/v1.2.4/main.json +15035 -0
- package/core/apps/docs-vitepress/api-data/versions.json +6 -0
- package/core/apps/docs-vitepress/index.md +15 -0
- package/core/apps/docs-vitepress/package-lock.json +2924 -0
- package/core/apps/docs-vitepress/package.json +20 -0
- package/core/apps/docs-vitepress/public/CNAME +1 -0
- package/core/apps/docs-vitepress/scripts/generate-api.ts +243 -0
- package/core/apps/docs-vitepress/scripts/migrate-guides.ts +129 -0
- package/core/apps/docs-vitepress/tsconfig.json +11 -0
- package/core/apps/docs-vitepress/v/latest/guides/attachments-by-url.md +57 -0
- package/core/apps/docs-vitepress/v/latest/guides/attachments.md +62 -0
- package/core/apps/docs-vitepress/v/latest/guides/basic-bot.md +49 -0
- package/core/apps/docs-vitepress/v/latest/guides/channels.md +180 -0
- package/core/apps/docs-vitepress/v/latest/guides/deprecated-apis.md +58 -0
- package/core/apps/docs-vitepress/v/latest/guides/discord-js-compatibility.md +42 -0
- package/core/apps/docs-vitepress/v/latest/guides/editing-embeds.md +65 -0
- package/core/apps/docs-vitepress/v/latest/guides/embed-media.md +87 -0
- package/core/apps/docs-vitepress/v/latest/guides/embeds.md +166 -0
- package/core/apps/docs-vitepress/v/latest/guides/emojis.md +77 -0
- package/core/apps/docs-vitepress/v/latest/guides/events.md +202 -0
- package/core/apps/docs-vitepress/v/latest/guides/gifs.md +47 -0
- package/core/apps/docs-vitepress/v/latest/guides/installation.md +10 -0
- package/core/apps/docs-vitepress/v/latest/guides/moderation.md +89 -0
- package/core/apps/docs-vitepress/v/latest/guides/permissions.md +130 -0
- package/core/apps/docs-vitepress/v/latest/guides/prefix-commands.md +41 -0
- package/core/apps/docs-vitepress/v/latest/guides/profile-urls.md +58 -0
- package/core/apps/docs-vitepress/v/latest/guides/reactions.md +69 -0
- package/core/apps/docs-vitepress/v/latest/guides/roles.md +130 -0
- package/core/apps/docs-vitepress/v/latest/guides/sending-without-reply.md +172 -0
- package/core/apps/docs-vitepress/v/latest/guides/voice.md +109 -0
- package/core/apps/docs-vitepress/v/latest/guides/wait-for-guilds.md +37 -0
- package/core/apps/docs-vitepress/v/latest/guides/webhook-attachments-embeds.md +73 -0
- package/core/apps/docs-vitepress/v/latest/guides/webhooks.md +131 -0
- package/core/eslint.config.js +80 -0
- package/core/examples/.env.example +22 -0
- package/core/examples/README.md +68 -0
- package/core/examples/first-steps-bot.js +118 -0
- package/core/examples/minimal-bot.js +17 -0
- package/core/examples/moderation-bot.js +209 -0
- package/core/examples/package.json +14 -0
- package/core/examples/ping-bot.js +1146 -0
- package/core/examples/reaction-bot.js +70 -0
- package/core/examples/reaction-roles-bot.js +140 -0
- package/core/examples/webhook-bot.js +239 -0
- package/core/flux.png +0 -0
- package/core/package.json +78 -0
- package/core/packages/builders/package.json +51 -0
- package/core/packages/builders/src/index.ts +13 -0
- package/core/packages/builders/src/messages/AttachmentBuilder.test.ts +79 -0
- package/core/packages/builders/src/messages/AttachmentBuilder.ts +69 -0
- package/core/packages/builders/src/messages/EmbedBuilder.test.ts +266 -0
- package/core/packages/builders/src/messages/EmbedBuilder.ts +239 -0
- package/core/packages/builders/src/messages/MessagePayload.test.ts +118 -0
- package/core/packages/builders/src/messages/MessagePayload.ts +122 -0
- package/core/packages/builders/tsconfig.json +9 -0
- package/core/packages/builders/tsup.config.ts +9 -0
- package/core/packages/builders/vitest.config.ts +9 -0
- package/core/packages/collection/package.json +47 -0
- package/core/packages/collection/src/Collection.test.ts +232 -0
- package/core/packages/collection/src/Collection.ts +196 -0
- package/core/packages/collection/src/index.ts +1 -0
- package/core/packages/collection/tsconfig.json +9 -0
- package/core/packages/collection/tsup.config.ts +9 -0
- package/core/packages/collection/vitest.config.ts +9 -0
- package/core/packages/docgen/package.json +26 -0
- package/core/packages/docgen/src/extract.ts +262 -0
- package/core/packages/docgen/src/formatType.ts +24 -0
- package/core/packages/docgen/src/index.ts +103 -0
- package/core/packages/docgen/src/schema.ts +100 -0
- package/core/packages/docgen/src/visitor.ts +147 -0
- package/core/packages/docgen/tsconfig.json +9 -0
- package/core/packages/docgen/tsup.config.ts +9 -0
- package/core/packages/fluxer-core/README.md +26 -0
- package/core/packages/fluxer-core/package.json +60 -0
- package/core/packages/fluxer-core/src/client/ChannelManager.ts +143 -0
- package/core/packages/fluxer-core/src/client/Client.gateway.test.ts +84 -0
- package/core/packages/fluxer-core/src/client/Client.resolveEmoji.test.ts +45 -0
- package/core/packages/fluxer-core/src/client/Client.ts +558 -0
- package/core/packages/fluxer-core/src/client/ClientUser.ts +40 -0
- package/core/packages/fluxer-core/src/client/EventHandlerRegistry.ts +469 -0
- package/core/packages/fluxer-core/src/client/GuildManager.ts +79 -0
- package/core/packages/fluxer-core/src/client/GuildMemberManager.ts +91 -0
- package/core/packages/fluxer-core/src/client/MessageManager.ts +58 -0
- package/core/packages/fluxer-core/src/client/UsersManager.ts +122 -0
- package/core/packages/fluxer-core/src/errors/ErrorCodes.test.ts +19 -0
- package/core/packages/fluxer-core/src/errors/ErrorCodes.ts +12 -0
- package/core/packages/fluxer-core/src/errors/FluxerError.test.ts +32 -0
- package/core/packages/fluxer-core/src/errors/FluxerError.ts +15 -0
- package/core/packages/fluxer-core/src/index.ts +85 -0
- package/core/packages/fluxer-core/src/structures/Base.ts +7 -0
- package/core/packages/fluxer-core/src/structures/Channel.ts +508 -0
- package/core/packages/fluxer-core/src/structures/Guild.test.ts +189 -0
- package/core/packages/fluxer-core/src/structures/Guild.ts +734 -0
- package/core/packages/fluxer-core/src/structures/GuildBan.ts +35 -0
- package/core/packages/fluxer-core/src/structures/GuildEmoji.ts +57 -0
- package/core/packages/fluxer-core/src/structures/GuildMember.test.ts +203 -0
- package/core/packages/fluxer-core/src/structures/GuildMember.ts +213 -0
- package/core/packages/fluxer-core/src/structures/GuildMemberRoleManager.ts +121 -0
- package/core/packages/fluxer-core/src/structures/GuildSticker.ts +56 -0
- package/core/packages/fluxer-core/src/structures/Invite.test.ts +103 -0
- package/core/packages/fluxer-core/src/structures/Invite.ts +121 -0
- package/core/packages/fluxer-core/src/structures/Message.test.ts +109 -0
- package/core/packages/fluxer-core/src/structures/Message.ts +397 -0
- package/core/packages/fluxer-core/src/structures/MessageReaction.ts +72 -0
- package/core/packages/fluxer-core/src/structures/PartialMessage.ts +12 -0
- package/core/packages/fluxer-core/src/structures/Role.test.ts +77 -0
- package/core/packages/fluxer-core/src/structures/Role.ts +112 -0
- package/core/packages/fluxer-core/src/structures/User.test.ts +110 -0
- package/core/packages/fluxer-core/src/structures/User.ts +109 -0
- package/core/packages/fluxer-core/src/structures/Webhook.test.ts +109 -0
- package/core/packages/fluxer-core/src/structures/Webhook.ts +258 -0
- package/core/packages/fluxer-core/src/util/Constants.test.ts +16 -0
- package/core/packages/fluxer-core/src/util/Constants.ts +7 -0
- package/core/packages/fluxer-core/src/util/Events.ts +46 -0
- package/core/packages/fluxer-core/src/util/MessageCollector.ts +87 -0
- package/core/packages/fluxer-core/src/util/Options.ts +33 -0
- package/core/packages/fluxer-core/src/util/ReactionCollector.ts +116 -0
- package/core/packages/fluxer-core/src/util/cdn.test.ts +108 -0
- package/core/packages/fluxer-core/src/util/cdn.ts +130 -0
- package/core/packages/fluxer-core/src/util/guildUtils.ts +33 -0
- package/core/packages/fluxer-core/src/util/messageUtils.test.ts +74 -0
- package/core/packages/fluxer-core/src/util/messageUtils.ts +119 -0
- package/core/packages/fluxer-core/src/util/permissions.test.ts +95 -0
- package/core/packages/fluxer-core/src/util/permissions.ts +43 -0
- package/core/packages/fluxer-core/tsconfig.json +9 -0
- package/core/packages/fluxer-core/tsup.config.ts +9 -0
- package/core/packages/fluxer-core/vitest.config.ts +9 -0
- package/core/packages/rest/package.json +52 -0
- package/core/packages/rest/src/REST.test.ts +64 -0
- package/core/packages/rest/src/REST.ts +90 -0
- package/core/packages/rest/src/RateLimitManager.test.ts +71 -0
- package/core/packages/rest/src/RateLimitManager.ts +60 -0
- package/core/packages/rest/src/RequestManager.test.ts +87 -0
- package/core/packages/rest/src/RequestManager.ts +172 -0
- package/core/packages/rest/src/errors/FluxerAPIError.test.ts +57 -0
- package/core/packages/rest/src/errors/FluxerAPIError.ts +21 -0
- package/core/packages/rest/src/errors/HTTPError.test.ts +55 -0
- package/core/packages/rest/src/errors/HTTPError.ts +25 -0
- package/core/packages/rest/src/errors/RateLimitError.test.ts +41 -0
- package/core/packages/rest/src/errors/RateLimitError.ts +15 -0
- package/core/packages/rest/src/errors/index.ts +3 -0
- package/core/packages/rest/src/index.ts +6 -0
- package/core/packages/rest/src/utils/constants.test.ts +31 -0
- package/core/packages/rest/src/utils/constants.ts +5 -0
- package/core/packages/rest/src/utils/files.test.ts +37 -0
- package/core/packages/rest/src/utils/files.ts +75 -0
- package/core/packages/rest/tsconfig.json +9 -0
- package/core/packages/rest/tsup.config.ts +9 -0
- package/core/packages/rest/vitest.config.ts +9 -0
- package/core/packages/types/package.json +46 -0
- package/core/packages/types/src/api/ban.ts +8 -0
- package/core/packages/types/src/api/channel.ts +65 -0
- package/core/packages/types/src/api/embed.ts +82 -0
- package/core/packages/types/src/api/emoji.ts +12 -0
- package/core/packages/types/src/api/errors.ts +68 -0
- package/core/packages/types/src/api/gateway.ts +14 -0
- package/core/packages/types/src/api/guild.ts +123 -0
- package/core/packages/types/src/api/index.ts +15 -0
- package/core/packages/types/src/api/instance.ts +32 -0
- package/core/packages/types/src/api/interaction.ts +26 -0
- package/core/packages/types/src/api/invite.ts +28 -0
- package/core/packages/types/src/api/message.ts +140 -0
- package/core/packages/types/src/api/role.ts +41 -0
- package/core/packages/types/src/api/sticker.ts +14 -0
- package/core/packages/types/src/api/user.ts +79 -0
- package/core/packages/types/src/api/webhook.ts +41 -0
- package/core/packages/types/src/common/index.ts +1 -0
- package/core/packages/types/src/common/snowflake.test.ts +9 -0
- package/core/packages/types/src/common/snowflake.ts +8 -0
- package/core/packages/types/src/gateway/events.ts +189 -0
- package/core/packages/types/src/gateway/index.ts +3 -0
- package/core/packages/types/src/gateway/opcodes.ts +17 -0
- package/core/packages/types/src/gateway/payloads.ts +481 -0
- package/core/packages/types/src/index.ts +4 -0
- package/core/packages/types/src/rest/index.ts +1 -0
- package/core/packages/types/src/rest/routes.test.ts +169 -0
- package/core/packages/types/src/rest/routes.ts +109 -0
- package/core/packages/types/tsconfig.json +9 -0
- package/core/packages/types/tsup.config.ts +9 -0
- package/core/packages/types/vitest.config.ts +9 -0
- package/core/packages/util/package.json +51 -0
- package/core/packages/util/src/BitField.test.ts +96 -0
- package/core/packages/util/src/BitField.ts +105 -0
- package/core/packages/util/src/MessageFlagsBitField.test.ts +42 -0
- package/core/packages/util/src/MessageFlagsBitField.ts +20 -0
- package/core/packages/util/src/PermissionsBitField.test.ts +79 -0
- package/core/packages/util/src/PermissionsBitField.ts +97 -0
- package/core/packages/util/src/SnowflakeUtil.test.ts +69 -0
- package/core/packages/util/src/SnowflakeUtil.ts +65 -0
- package/core/packages/util/src/UserFlagsBitField.test.ts +39 -0
- package/core/packages/util/src/UserFlagsBitField.ts +48 -0
- package/core/packages/util/src/deprecation.test.ts +44 -0
- package/core/packages/util/src/deprecation.ts +28 -0
- package/core/packages/util/src/emojiShortcodes.generated.ts +5 -0
- package/core/packages/util/src/emojiShortcodes.test.ts +41 -0
- package/core/packages/util/src/emojiShortcodes.ts +22 -0
- package/core/packages/util/src/formatters.test.ts +65 -0
- package/core/packages/util/src/formatters.ts +35 -0
- package/core/packages/util/src/index.ts +34 -0
- package/core/packages/util/src/resolvers.test.ts +198 -0
- package/core/packages/util/src/resolvers.ts +127 -0
- package/core/packages/util/src/tenorUtils.test.ts +75 -0
- package/core/packages/util/src/tenorUtils.ts +86 -0
- package/core/packages/util/tsconfig.json +9 -0
- package/core/packages/util/tsup.config.ts +9 -0
- package/core/packages/util/vitest.config.ts +9 -0
- package/core/packages/voice/README.md +42 -0
- package/core/packages/voice/package.json +67 -0
- package/core/packages/voice/src/LiveKitRtcConnection.receive.test.ts +24 -0
- package/core/packages/voice/src/LiveKitRtcConnection.ts +1767 -0
- package/core/packages/voice/src/VoiceConnection.ts +413 -0
- package/core/packages/voice/src/VoiceManager.receive.test.ts +61 -0
- package/core/packages/voice/src/VoiceManager.test.ts +44 -0
- package/core/packages/voice/src/VoiceManager.ts +503 -0
- package/core/packages/voice/src/exports.test.ts +38 -0
- package/core/packages/voice/src/index.ts +51 -0
- package/core/packages/voice/src/livekit.test.ts +48 -0
- package/core/packages/voice/src/livekit.ts +33 -0
- package/core/packages/voice/src/mp4box.d.ts +32 -0
- package/core/packages/voice/src/opusUtils.test.ts +29 -0
- package/core/packages/voice/src/opusUtils.ts +86 -0
- package/core/packages/voice/src/streamPreviewPlaceholder.test.ts +16 -0
- package/core/packages/voice/src/streamPreviewPlaceholder.ts +8 -0
- package/core/packages/voice/src/ws.d.ts +1 -0
- package/core/packages/voice/tsconfig.json +5 -0
- package/core/packages/voice/tsup.config.ts +10 -0
- package/core/packages/voice/vitest.config.ts +9 -0
- package/core/packages/ws/package.json +52 -0
- package/core/packages/ws/src/WebSocketManager.ts +130 -0
- package/core/packages/ws/src/WebSocketShard.ts +296 -0
- package/core/packages/ws/src/index.ts +12 -0
- package/core/packages/ws/src/utils/constants.test.ts +46 -0
- package/core/packages/ws/src/utils/constants.ts +22 -0
- package/core/packages/ws/src/utils/getWebSocket.ts +55 -0
- package/core/packages/ws/src/ws.d.ts +10 -0
- package/core/packages/ws/tsconfig.json +9 -0
- package/core/packages/ws/tsup.config.ts +9 -0
- package/core/pnpm-lock.yaml +7033 -0
- package/core/pnpm-workspace.yaml +4 -0
- package/core/scripts/generate-ai-rag.ts +240 -0
- package/core/scripts/generate-docs.ts +143 -0
- package/core/scripts/generate-emoji-shortcodes.ts +58 -0
- package/core/scripts/generate-types.ts +6 -0
- package/core/scripts/publish-ordered.js +63 -0
- package/core/scripts/test-cjs-require.mjs +43 -0
- package/core/scripts/test-esm-imports.mjs +42 -0
- package/core/scripts/test-package-exports.mjs +98 -0
- package/core/scripts/test-smoke.mjs +103 -0
- package/core/tsconfig.json +18 -0
- package/core/turbo.json +30 -0
- package/core/vitest.config.ts +17 -0
- package/core/wrangler.jsonc +9 -0
- package/package.json +26 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluxer Reaction Detection Example
|
|
3
|
+
*
|
|
4
|
+
* Listens for when users react to messages. Demonstrates MESSAGE_REACTION_ADD
|
|
5
|
+
* and related gateway events. See packages/types/src/gateway/events.ts for all
|
|
6
|
+
* gateway event names (e.g. MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE).
|
|
7
|
+
*
|
|
8
|
+
* Usage (from repo root after npm install && npm run build):
|
|
9
|
+
* FLUXER_BOT_TOKEN=your_token node examples/reaction-bot.js
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { Client, Events } from '@erinjs/core';
|
|
13
|
+
|
|
14
|
+
const client = new Client();
|
|
15
|
+
|
|
16
|
+
client.on(Events.Ready, () => {
|
|
17
|
+
console.log(`Logged in as ${client.user?.username}`);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// When someone adds a reaction to any message
|
|
21
|
+
// MessageReactionAdd / MessageReactionRemove emit (reaction, user, messageId, channelId, emoji, userId)
|
|
22
|
+
client.on(Events.MessageReactionAdd, (reaction, user, messageId, channelId, emoji, userId) => {
|
|
23
|
+
const emojiStr = emoji.id ? `<:${emoji.name}:${emoji.id}>` : emoji.name;
|
|
24
|
+
console.log(
|
|
25
|
+
`Reaction added: user ${userId} reacted with ${emojiStr} on message ${messageId} in channel ${channelId}`,
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Tip: filter by messageId or emoji for polls, confirmations, etc.:
|
|
30
|
+
// if (messageId !== myPollMessageId) return;
|
|
31
|
+
// if (emoji.name !== '👍') return;
|
|
32
|
+
|
|
33
|
+
// Alternatively: client.events.MessageReactionAdd((reaction, user, messageId, channelId, emoji, userId) => { ... })
|
|
34
|
+
|
|
35
|
+
// When someone removes their reaction
|
|
36
|
+
client.on(Events.MessageReactionRemove, (reaction, user, messageId, channelId, emoji, userId) => {
|
|
37
|
+
const emojiStr = emoji.id ? `<:${emoji.name}:${emoji.id}>` : emoji.name;
|
|
38
|
+
console.log(`Reaction removed: user ${userId} removed ${emojiStr} from message ${messageId}`);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// When all reactions are removed from a message (moderator action)
|
|
42
|
+
client.on(Events.MessageReactionRemoveAll, (data) => {
|
|
43
|
+
console.log(
|
|
44
|
+
`All reactions cleared from message ${data.message_id} in channel ${data.channel_id}`,
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// When all reactions of a specific emoji are removed
|
|
49
|
+
client.on(Events.MessageReactionRemoveEmoji, (data) => {
|
|
50
|
+
const emojiStr = data.emoji.id ? `<:${data.emoji.name}:${data.emoji.id}>` : data.emoji.name;
|
|
51
|
+
console.log(`All ${emojiStr} reactions removed from message ${data.message_id}`);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
client.on(Events.Error, (err) => console.error('Client error:', err));
|
|
55
|
+
|
|
56
|
+
const token = process.env.FLUXER_BOT_TOKEN;
|
|
57
|
+
if (!token) {
|
|
58
|
+
console.error('Error: Set FLUXER_BOT_TOKEN environment variable');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
client
|
|
63
|
+
.login(token)
|
|
64
|
+
.then(() => {
|
|
65
|
+
console.log('Listening for reactions...');
|
|
66
|
+
})
|
|
67
|
+
.catch((err) => {
|
|
68
|
+
console.error('Login failed:', err);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
});
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluxer Reaction Roles Example
|
|
3
|
+
*
|
|
4
|
+
* Users react to a message to get or remove roles. Run !roles to post the message
|
|
5
|
+
* (or set REACTION_ROLES_MESSAGE_ID and REACTION_ROLES_CHANNEL_ID to use an existing message).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* FLUXER_BOT_TOKEN=your_token node examples/reaction-roles-bot.js
|
|
9
|
+
*
|
|
10
|
+
* Configure ROLE_EMOJI_MAP with your guild's role IDs.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Client, Events, EmbedBuilder } from '@erinjs/core';
|
|
14
|
+
|
|
15
|
+
// Map emoji (unicode or "name:id") to role ID. Update these for your server.
|
|
16
|
+
const ROLE_EMOJI_MAP = {
|
|
17
|
+
'🎮': process.env.ROLE_GAMING ?? 'ROLE_ID_FOR_GAMING',
|
|
18
|
+
'🎵': process.env.ROLE_MUSIC ?? 'ROLE_ID_FOR_MUSIC',
|
|
19
|
+
'📢': process.env.ROLE_ANNOUNCEMENTS ?? 'ROLE_ID_FOR_ANNOUNCEMENTS',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const PREFIX = '!';
|
|
23
|
+
|
|
24
|
+
const client = new Client({ intents: 0 });
|
|
25
|
+
let rolesMessageId = process.env.REACTION_ROLES_MESSAGE_ID ?? null;
|
|
26
|
+
const _rolesChannelId = process.env.REACTION_ROLES_CHANNEL_ID ?? null;
|
|
27
|
+
|
|
28
|
+
function getRoleIdForEmoji(reaction) {
|
|
29
|
+
const key = reaction.emoji.id
|
|
30
|
+
? `${reaction.emoji.name}:${reaction.emoji.id}`
|
|
31
|
+
: reaction.emoji.name;
|
|
32
|
+
return ROLE_EMOJI_MAP[key] ?? ROLE_EMOJI_MAP[reaction.emoji.name];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function handleReactionAdd(reaction, user) {
|
|
36
|
+
if (!reaction.guildId || reaction.messageId !== rolesMessageId) return;
|
|
37
|
+
|
|
38
|
+
const roleId = getRoleIdForEmoji(reaction);
|
|
39
|
+
if (!roleId || roleId.startsWith('ROLE_ID_')) return;
|
|
40
|
+
|
|
41
|
+
const guild = client.guilds.get(reaction.guildId);
|
|
42
|
+
if (!guild) return;
|
|
43
|
+
let member;
|
|
44
|
+
try {
|
|
45
|
+
member = guild.members.get(user.id) ?? (await guild.fetchMember(user.id));
|
|
46
|
+
} catch {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!member) return;
|
|
50
|
+
|
|
51
|
+
if (member.roles.cache.has(roleId)) return;
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
await member.addRole(roleId);
|
|
55
|
+
console.log(`[reaction-roles] Added role ${roleId} to user ${user.id}`);
|
|
56
|
+
} catch (err) {
|
|
57
|
+
console.error('[reaction-roles] Failed to add role:', err.message);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function handleReactionRemove(reaction, user) {
|
|
62
|
+
if (!reaction.guildId || reaction.messageId !== rolesMessageId) return;
|
|
63
|
+
|
|
64
|
+
const roleId = getRoleIdForEmoji(reaction);
|
|
65
|
+
if (!roleId || roleId.startsWith('ROLE_ID_')) return;
|
|
66
|
+
|
|
67
|
+
const guild = client.guilds.get(reaction.guildId);
|
|
68
|
+
if (!guild) return;
|
|
69
|
+
let member;
|
|
70
|
+
try {
|
|
71
|
+
member = guild.members.get(user.id) ?? (await guild.fetchMember(user.id));
|
|
72
|
+
} catch {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!member) return;
|
|
76
|
+
|
|
77
|
+
if (!member.roles.cache.has(roleId)) return;
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
await member.removeRole(roleId);
|
|
81
|
+
console.log(`[reaction-roles] Removed role ${roleId} from user ${user.id}`);
|
|
82
|
+
} catch (err) {
|
|
83
|
+
console.error('[reaction-roles] Failed to remove role:', err.message);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
client.on(Events.Ready, () => {
|
|
88
|
+
console.log(`Logged in as ${client.user?.username}`);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
client.on(Events.MessageCreate, async (message) => {
|
|
92
|
+
if (message.author.bot || !message.content?.startsWith(PREFIX)) return;
|
|
93
|
+
const args = message.content.slice(PREFIX.length).trim().split(/\s+/);
|
|
94
|
+
const cmd = args[0]?.toLowerCase();
|
|
95
|
+
|
|
96
|
+
if (cmd === 'roles') {
|
|
97
|
+
if (!message.guildId) {
|
|
98
|
+
await message.reply('Use this in a server channel.');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const emojiList = Object.entries(ROLE_EMOJI_MAP)
|
|
102
|
+
.map(
|
|
103
|
+
([emoji, id]) =>
|
|
104
|
+
`${emoji} ${id.startsWith('ROLE_ID_') ? '(configure ROLE_EMOJI_MAP)' : ''}`,
|
|
105
|
+
)
|
|
106
|
+
.join('\n');
|
|
107
|
+
const embed = new EmbedBuilder()
|
|
108
|
+
.setTitle('Reaction Roles')
|
|
109
|
+
.setDescription(
|
|
110
|
+
'React to get a role. Remove your reaction to remove the role.\n\n' + emojiList,
|
|
111
|
+
)
|
|
112
|
+
.setColor(0x5865f2)
|
|
113
|
+
.setTimestamp();
|
|
114
|
+
const reply = await message.reply({ embeds: [embed.toJSON()] });
|
|
115
|
+
for (const emoji of Object.keys(ROLE_EMOJI_MAP)) {
|
|
116
|
+
await reply
|
|
117
|
+
.react(emoji)
|
|
118
|
+
.catch((e) => console.warn('Could not add reaction', emoji, e.message));
|
|
119
|
+
}
|
|
120
|
+
rolesMessageId = reply.id;
|
|
121
|
+
console.log(
|
|
122
|
+
`[reaction-roles] Set roles message to ${reply.id}. Set REACTION_ROLES_MESSAGE_ID=${reply.id} and REACTION_ROLES_CHANNEL_ID=${message.channelId} to reuse.`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
client.on(Events.MessageReactionAdd, handleReactionAdd);
|
|
128
|
+
client.on(Events.MessageReactionRemove, handleReactionRemove);
|
|
129
|
+
client.on(Events.Error, (err) => console.error('Client error:', err));
|
|
130
|
+
|
|
131
|
+
const token = process.env.FLUXER_BOT_TOKEN;
|
|
132
|
+
if (!token) {
|
|
133
|
+
console.error('Error: Set FLUXER_BOT_TOKEN');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
client.login(token).catch((err) => {
|
|
138
|
+
console.error('Login failed:', err);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
});
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluxer Webhook Example Bot
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates the Webhook handler:
|
|
5
|
+
* - Creating webhooks via channel.createWebhook()
|
|
6
|
+
* - Fetching webhooks via channel.fetchWebhooks() / guild.fetchWebhooks()
|
|
7
|
+
* - Sending via webhook.send() and deleting via webhook.delete()
|
|
8
|
+
*
|
|
9
|
+
* Usage (from repo root after npm install && npm run build):
|
|
10
|
+
* FLUXER_BOT_TOKEN=your_token node examples/webhook-bot.js
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Client, Events, EmbedBuilder, Webhook } from '@erinjs/core';
|
|
14
|
+
|
|
15
|
+
const PREFIX = '!';
|
|
16
|
+
const BRAND_COLOR = 0x4641d9;
|
|
17
|
+
|
|
18
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
19
|
+
// Webhook Commands
|
|
20
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
async function handleWebhookCreate(message, client, args) {
|
|
23
|
+
const name = args[0] ?? 'My Webhook';
|
|
24
|
+
|
|
25
|
+
if (!message.guildId) {
|
|
26
|
+
await message.reply('Use this command in a server.');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const channel = client.channels.get(message.channelId);
|
|
31
|
+
if (!channel?.createWebhook) {
|
|
32
|
+
await message.reply('This channel does not support webhooks.');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const webhook = await channel.createWebhook({ name });
|
|
38
|
+
|
|
39
|
+
const embed = new EmbedBuilder()
|
|
40
|
+
.setTitle('Webhook Created')
|
|
41
|
+
.setColor(BRAND_COLOR)
|
|
42
|
+
.addFields(
|
|
43
|
+
{ name: 'Name', value: webhook.name, inline: true },
|
|
44
|
+
{ name: 'ID', value: `\`${webhook.id}\``, inline: true },
|
|
45
|
+
{ name: 'Channel ID', value: `\`${webhook.channelId}\``, inline: true },
|
|
46
|
+
{
|
|
47
|
+
name: 'Send',
|
|
48
|
+
value:
|
|
49
|
+
"Use `!webhook send` with the ID and token to send a message. **Store the token** – it won't be returned when listing webhooks.",
|
|
50
|
+
},
|
|
51
|
+
)
|
|
52
|
+
.setFooter({ text: 'Use !webhook send <id> <token> [message]' })
|
|
53
|
+
.setTimestamp();
|
|
54
|
+
|
|
55
|
+
await message.reply({ embeds: [embed.toJSON()] });
|
|
56
|
+
} catch (err) {
|
|
57
|
+
console.error('Webhook create error:', err);
|
|
58
|
+
await message.reply(`Failed to create webhook: ${err.message ?? err}`).catch(() => {});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function handleWebhookList(message, client, args) {
|
|
63
|
+
const scope = args[0]?.toLowerCase(); // 'channel' or 'guild'
|
|
64
|
+
|
|
65
|
+
if (!message.guildId) {
|
|
66
|
+
await message.reply('Use this command in a server.');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const webhooks =
|
|
72
|
+
scope === 'guild'
|
|
73
|
+
? await client.guilds.get(message.guildId)?.fetchWebhooks()
|
|
74
|
+
: await client.channels.get(message.channelId)?.fetchWebhooks();
|
|
75
|
+
|
|
76
|
+
if (!webhooks?.length) {
|
|
77
|
+
await message.reply(
|
|
78
|
+
`No webhooks in this ${scope === 'guild' ? 'guild' : 'channel'}. Use \`!webhook create\` to create one.`,
|
|
79
|
+
);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const fields = webhooks.slice(0, 10).map((w) => ({
|
|
84
|
+
name: w.name ?? 'Unnamed',
|
|
85
|
+
value: `ID: \`${w.id}\`\nChannel: \`${w.channelId}\``,
|
|
86
|
+
inline: true,
|
|
87
|
+
}));
|
|
88
|
+
|
|
89
|
+
const embed = new EmbedBuilder()
|
|
90
|
+
.setTitle(`${scope === 'guild' ? 'Guild' : 'Channel'} Webhooks`)
|
|
91
|
+
.setColor(BRAND_COLOR)
|
|
92
|
+
.addFields(...fields)
|
|
93
|
+
.setFooter({
|
|
94
|
+
text: `Showing ${Math.min(webhooks.length, 10)} of ${webhooks.length} webhooks`,
|
|
95
|
+
})
|
|
96
|
+
.setTimestamp();
|
|
97
|
+
|
|
98
|
+
await message.reply({ embeds: [embed.toJSON()] });
|
|
99
|
+
} catch (err) {
|
|
100
|
+
console.error('Webhook list error:', err);
|
|
101
|
+
await message.reply(`Failed to fetch webhooks: ${err.message ?? err}`).catch(() => {});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function handleWebhookSend(message, client, args) {
|
|
106
|
+
const webhookId = args[0];
|
|
107
|
+
const webhookToken = args[1];
|
|
108
|
+
const content = args.slice(2).join(' ');
|
|
109
|
+
|
|
110
|
+
if (!webhookId || !webhookToken) {
|
|
111
|
+
await message.reply(
|
|
112
|
+
'Usage: `!webhook send <webhook_id> <webhook_token> [message]`\nYou get the token when creating a webhook; it is not returned when listing.',
|
|
113
|
+
);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
const webhook = Webhook.fromToken(client, webhookId, webhookToken);
|
|
119
|
+
await webhook.send(
|
|
120
|
+
content
|
|
121
|
+
? { content }
|
|
122
|
+
: {
|
|
123
|
+
content: 'Hello from the Fluxer webhook bot!',
|
|
124
|
+
embeds: [
|
|
125
|
+
new EmbedBuilder()
|
|
126
|
+
.setTitle('Webhook Message')
|
|
127
|
+
.setDescription('This was sent via webhook.send().')
|
|
128
|
+
.setColor(BRAND_COLOR)
|
|
129
|
+
.setTimestamp()
|
|
130
|
+
.toJSON(),
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
await message.reply('Message sent via webhook.');
|
|
136
|
+
} catch (err) {
|
|
137
|
+
console.error('Webhook send error:', err);
|
|
138
|
+
await message.reply(`Failed to send: ${err.message ?? err}`).catch(() => {});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function handleWebhookDelete(message, client, args) {
|
|
143
|
+
const webhookId = args[0];
|
|
144
|
+
|
|
145
|
+
if (!webhookId) {
|
|
146
|
+
await message.reply('Usage: `!webhook delete <webhook_id>`');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!message.guildId) {
|
|
151
|
+
await message.reply('Use this command in a server.');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
const webhook = await Webhook.fetch(client, webhookId);
|
|
157
|
+
await webhook.delete();
|
|
158
|
+
await message.reply('Webhook deleted.');
|
|
159
|
+
} catch (err) {
|
|
160
|
+
console.error('Webhook delete error:', err);
|
|
161
|
+
await message.reply(`Failed to delete: ${err.message ?? err}`).catch(() => {});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
166
|
+
// Client Setup
|
|
167
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
168
|
+
|
|
169
|
+
const token = process.env.FLUXER_BOT_TOKEN;
|
|
170
|
+
if (!token) {
|
|
171
|
+
console.error('Error: Set FLUXER_BOT_TOKEN environment variable');
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const client = new Client({
|
|
176
|
+
intents: 0,
|
|
177
|
+
presence: { status: 'online', custom_status: { text: 'Managing webhooks' } },
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
client.on(Events.Ready, () => {
|
|
181
|
+
console.log(`Logged in as ${client.user?.username}`);
|
|
182
|
+
console.log('Webhook commands: !webhook create | list | send | delete');
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
client.on(Events.MessageCreate, async (message) => {
|
|
186
|
+
if (message.author.bot || !message.content) return;
|
|
187
|
+
|
|
188
|
+
const content = message.content.trim();
|
|
189
|
+
if (!content.startsWith(PREFIX)) return;
|
|
190
|
+
|
|
191
|
+
const args = content.slice(PREFIX.length).split(/\s+/);
|
|
192
|
+
const cmd = args.shift()?.toLowerCase();
|
|
193
|
+
const subcmd = args.shift()?.toLowerCase();
|
|
194
|
+
|
|
195
|
+
if (cmd !== 'webhook') return;
|
|
196
|
+
|
|
197
|
+
try {
|
|
198
|
+
switch (subcmd) {
|
|
199
|
+
case 'create':
|
|
200
|
+
await handleWebhookCreate(message, client, args);
|
|
201
|
+
break;
|
|
202
|
+
case 'list':
|
|
203
|
+
await handleWebhookList(message, client, args);
|
|
204
|
+
break;
|
|
205
|
+
case 'send':
|
|
206
|
+
await handleWebhookSend(message, client, args);
|
|
207
|
+
break;
|
|
208
|
+
case 'delete':
|
|
209
|
+
await handleWebhookDelete(message, client, args);
|
|
210
|
+
break;
|
|
211
|
+
default:
|
|
212
|
+
await message.reply(
|
|
213
|
+
'**Webhook commands:**\n' +
|
|
214
|
+
'`!webhook create [channel_id] [name]` – Create a webhook\n' +
|
|
215
|
+
'`!webhook list [channel|guild] [id]` – List webhooks\n' +
|
|
216
|
+
'`!webhook send <id> <token> [message]` – Send via webhook\n' +
|
|
217
|
+
'`!webhook delete <id>` – Delete a webhook',
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
} catch (err) {
|
|
221
|
+
console.error('Command error:', err);
|
|
222
|
+
await message.reply('An error occurred.').catch(() => {});
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
client.on(Events.Error, (err) => console.error('Client error:', err));
|
|
227
|
+
|
|
228
|
+
process.on('unhandledRejection', (err) => {
|
|
229
|
+
console.error('Unhandled rejection:', err);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
try {
|
|
234
|
+
await client.login(token);
|
|
235
|
+
console.log('Gateway connected');
|
|
236
|
+
} catch (err) {
|
|
237
|
+
console.error('Login failed:', err);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
package/core/flux.png
ADDED
|
Binary file
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "erinjs-monorepo",
|
|
3
|
+
"version": "1.2.4",
|
|
4
|
+
"private": true,
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"description": "erin.js SDK monorepo",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "turbo run build",
|
|
9
|
+
"test": "turbo run test",
|
|
10
|
+
"test:esm": "node scripts/test-esm-imports.mjs",
|
|
11
|
+
"test:cjs": "node scripts/test-cjs-require.mjs",
|
|
12
|
+
"test:load": "pnpm run test:esm && pnpm run test:cjs && pnpm run test:exports",
|
|
13
|
+
"test:exports": "node scripts/test-package-exports.mjs",
|
|
14
|
+
"test:smoke": "node scripts/test-smoke.mjs",
|
|
15
|
+
"test:all": "pnpm run build && pnpm exec vitest run && pnpm run test:load && pnpm run test:smoke",
|
|
16
|
+
"test:report": "pnpm run build && pnpm exec vitest run --reporter json --outputFile.json=test-results/results.json",
|
|
17
|
+
"lint": "turbo run lint --filter=!@erinjs/docs",
|
|
18
|
+
"lint:fix": "turbo run lint:fix --filter=!@erinjs/docs",
|
|
19
|
+
"format": "prettier --write .",
|
|
20
|
+
"format:check": "prettier --check .",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"clean": "turbo run clean && rm -rf node_modules",
|
|
23
|
+
"generate:types": "pnpm exec tsx scripts/generate-types.ts",
|
|
24
|
+
"generate:emoji": "pnpm exec tsx scripts/generate-emoji-shortcodes.ts",
|
|
25
|
+
"generate:docs": "pnpm exec tsx scripts/generate-docs.ts",
|
|
26
|
+
"generate:rag": "pnpm run generate:docs && pnpm exec tsx scripts/generate-ai-rag.ts",
|
|
27
|
+
"docs:generate": "pnpm run build && pnpm run generate:docs",
|
|
28
|
+
"docs:dev": "pnpm --filter @erinjs/docs dev",
|
|
29
|
+
"docs:build": "pnpm run build && pnpm run generate:docs && pnpm --filter @erinjs/docs build",
|
|
30
|
+
"docs:preview": "pnpm --filter @erinjs/docs preview",
|
|
31
|
+
"docs:deploy": "pnpm run docs:build && wrangler deploy",
|
|
32
|
+
"publish:packages": "node scripts/publish-ordered.js",
|
|
33
|
+
"publish:packages:all": "pnpm run build && pnpm -r publish --no-git-checks --filter '!./examples'"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@erinjs/builders": "workspace:*",
|
|
37
|
+
"@erinjs/collection": "workspace:*",
|
|
38
|
+
"@erinjs/core": "workspace:*",
|
|
39
|
+
"@erinjs/rest": "workspace:*",
|
|
40
|
+
"@erinjs/types": "workspace:*",
|
|
41
|
+
"@erinjs/util": "workspace:*",
|
|
42
|
+
"@erinjs/voice": "workspace:*",
|
|
43
|
+
"@erinjs/ws": "workspace:*",
|
|
44
|
+
"@changesets/changelog-github": "^0.5.2",
|
|
45
|
+
"@changesets/cli": "^2.29.8",
|
|
46
|
+
"@eslint/js": "^10.0.1",
|
|
47
|
+
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
|
48
|
+
"@typescript-eslint/parser": "^8.55.0",
|
|
49
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
50
|
+
"dotenv": "^17.3.1",
|
|
51
|
+
"eslint": "^9.39.2",
|
|
52
|
+
"eslint-config-prettier": "^10.1.8",
|
|
53
|
+
"eslint-plugin-vue": "^10.8.0",
|
|
54
|
+
"globals": "^17.3.0",
|
|
55
|
+
"lint-staged": "^16.2.7",
|
|
56
|
+
"prettier": "^3.8.1",
|
|
57
|
+
"tsx": "^4.19.0",
|
|
58
|
+
"turbo": "^2.3.0",
|
|
59
|
+
"typescript": "^5.6.0",
|
|
60
|
+
"typescript-eslint": "^8.55.0",
|
|
61
|
+
"vitest": "^4.0.18",
|
|
62
|
+
"vue-eslint-parser": "^10.4.0",
|
|
63
|
+
"wrangler": "^4.0.0"
|
|
64
|
+
},
|
|
65
|
+
"packageManager": "pnpm@9.14.2",
|
|
66
|
+
"engines": {
|
|
67
|
+
"node": ">=18.0.0"
|
|
68
|
+
},
|
|
69
|
+
"pnpm": {
|
|
70
|
+
"overrides": {
|
|
71
|
+
"tar": ">=7.5.11",
|
|
72
|
+
"minimatch": ">=10.2.3",
|
|
73
|
+
"brace-expansion": ">=5.0.5",
|
|
74
|
+
"rollup": ">=4.59.0",
|
|
75
|
+
"esbuild": ">=0.25.0"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@erinjs/builders",
|
|
3
|
+
"publishConfig": {
|
|
4
|
+
"access": "public"
|
|
5
|
+
},
|
|
6
|
+
"version": "1.2.4",
|
|
7
|
+
"description": "Builders for Fluxer messages and embeds",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/blstmo-abandoned-us-for-the-milk/core.git",
|
|
11
|
+
"directory": "packages/builders"
|
|
12
|
+
},
|
|
13
|
+
"bugs": "https://github.com/blstmo-abandoned-us-for-the-milk/core/issues",
|
|
14
|
+
"homepage": "https://github.com/blstmo-abandoned-us-for-the-milk/core#readme",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"fluxer",
|
|
17
|
+
"embed",
|
|
18
|
+
"builder",
|
|
19
|
+
"sdk"
|
|
20
|
+
],
|
|
21
|
+
"license": "Apache-2.0",
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"module": "./dist/index.mjs",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.mjs",
|
|
29
|
+
"require": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"clean": "rm -rf dist",
|
|
38
|
+
"lint": "eslint src --max-warnings 0 --config ../../eslint.config.js",
|
|
39
|
+
"lint:fix": "eslint src --fix --config ../../eslint.config.js",
|
|
40
|
+
"test": "vitest run --passWithNoTests",
|
|
41
|
+
"test:coverage": "vitest run --coverage --passWithNoTests"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@erinjs/types": "workspace:*",
|
|
45
|
+
"@erinjs/util": "workspace:*"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"tsup": "^8.3.0",
|
|
49
|
+
"typescript": "^5.6.0"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export {
|
|
2
|
+
EmbedBuilder,
|
|
3
|
+
type EmbedAuthorOptions,
|
|
4
|
+
type EmbedFooterOptions,
|
|
5
|
+
type EmbedFieldData,
|
|
6
|
+
type EmbedMediaOptions,
|
|
7
|
+
} from './messages/EmbedBuilder.js';
|
|
8
|
+
export {
|
|
9
|
+
AttachmentBuilder,
|
|
10
|
+
type AttachmentPayloadOptions,
|
|
11
|
+
type APIAttachmentPayload,
|
|
12
|
+
} from './messages/AttachmentBuilder.js';
|
|
13
|
+
export { MessagePayload, type MessagePayloadData } from './messages/MessagePayload.js';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { AttachmentBuilder } from './AttachmentBuilder.js';
|
|
3
|
+
|
|
4
|
+
describe('AttachmentBuilder', () => {
|
|
5
|
+
it('creates with required id and filename', () => {
|
|
6
|
+
const att = new AttachmentBuilder(0, 'image.png');
|
|
7
|
+
expect(att.id).toBe(0);
|
|
8
|
+
expect(att.filename).toBe('image.png');
|
|
9
|
+
expect(att.spoiler).toBe(false);
|
|
10
|
+
expect(att.description).toBeUndefined();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('creates with description and spoiler options', () => {
|
|
14
|
+
const att = new AttachmentBuilder(1, 'photo.jpg', {
|
|
15
|
+
description: 'A nice photo',
|
|
16
|
+
spoiler: true,
|
|
17
|
+
});
|
|
18
|
+
expect(att.id).toBe(1);
|
|
19
|
+
expect(att.filename).toBe('SPOILER_photo.jpg');
|
|
20
|
+
expect(att.description).toBe('A nice photo');
|
|
21
|
+
expect(att.spoiler).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('throws for empty filename', () => {
|
|
25
|
+
expect(() => new AttachmentBuilder(0, '')).toThrow('Filename is required');
|
|
26
|
+
expect(() => new AttachmentBuilder(0, ' ')).toThrow('Filename is required');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('setName updates filename', () => {
|
|
30
|
+
const att = new AttachmentBuilder(0, 'file.png');
|
|
31
|
+
att.setName('renamed.png');
|
|
32
|
+
expect(att.filename).toBe('renamed.png');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('setName adds SPOILER_ prefix when spoiler is true', () => {
|
|
36
|
+
const att = new AttachmentBuilder(0, 'file.png', { spoiler: true });
|
|
37
|
+
att.setName('other.png');
|
|
38
|
+
expect(att.filename).toBe('SPOILER_other.png');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('setName throws for empty', () => {
|
|
42
|
+
const att = new AttachmentBuilder(0, 'file.png');
|
|
43
|
+
expect(() => att.setName('')).toThrow('Filename is required');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('setDescription updates description', () => {
|
|
47
|
+
const att = new AttachmentBuilder(0, 'file.png');
|
|
48
|
+
att.setDescription('Alt text');
|
|
49
|
+
expect(att.description).toBe('Alt text');
|
|
50
|
+
att.setDescription(null);
|
|
51
|
+
expect(att.description).toBeUndefined();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('setSpoiler adds SPOILER_ prefix', () => {
|
|
55
|
+
const att = new AttachmentBuilder(0, 'file.png');
|
|
56
|
+
att.setSpoiler(true);
|
|
57
|
+
expect(att.spoiler).toBe(true);
|
|
58
|
+
expect(att.filename).toBe('SPOILER_file.png');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('setSpoiler removes prefix when false', () => {
|
|
62
|
+
const att = new AttachmentBuilder(0, 'file.png', { spoiler: true });
|
|
63
|
+
att.setSpoiler(false);
|
|
64
|
+
expect(att.spoiler).toBe(false);
|
|
65
|
+
expect(att.filename).toBe('file.png');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('toJSON returns API format', () => {
|
|
69
|
+
const att = new AttachmentBuilder(2, 'doc.pdf', { description: 'PDF document' });
|
|
70
|
+
const json = att.toJSON();
|
|
71
|
+
expect(json).toEqual({ id: 2, filename: 'doc.pdf', description: 'PDF document' });
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('toJSON omits description when undefined', () => {
|
|
75
|
+
const att = new AttachmentBuilder(0, 'image.png');
|
|
76
|
+
const json = att.toJSON();
|
|
77
|
+
expect(json).toEqual({ id: 0, filename: 'image.png', description: undefined });
|
|
78
|
+
});
|
|
79
|
+
});
|