@erinjs/core 1.0.0 → 1.2.4
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/LICENSE → LICENSE} +203 -203
- package/README.md +46 -0
- package/dist/index.d.mts +2084 -0
- package/dist/index.d.ts +2084 -0
- package/dist/index.js +3867 -0
- package/dist/index.mjs +3809 -0
- package/package.json +50 -15
- package/core/.changeset/README.md +0 -8
- package/core/.changeset/community-bootstrap-release.md +0 -17
- package/core/.changeset/config.json +0 -11
- package/core/.changeset/no-changelog.js +0 -16
- package/core/.changeset/pre.json +0 -17
- package/core/.editorconfig +0 -13
- package/core/.gitattributes +0 -2
- package/core/.github/CODE_OF_CONDUCT.md +0 -23
- package/core/.github/FUNDING.yml +0 -7
- package/core/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
- package/core/.github/ISSUE_TEMPLATE/feature_request.md +0 -23
- package/core/.github/PULL_REQUEST_TEMPLATE.md +0 -16
- package/core/.github/dependabot.yml +0 -16
- package/core/.github/workflows/autoapp.yml +0 -16
- package/core/.github/workflows/ci.yml +0 -187
- package/core/.github/workflows/codeql.yml +0 -30
- package/core/.github/workflows/deploy-docs.yml +0 -54
- package/core/.github/workflows/publish.yml +0 -43
- package/core/.lintstagedrc.json +0 -4
- package/core/.nvmrc +0 -1
- package/core/.prettierignore +0 -8
- package/core/.prettierrc +0 -11
- package/core/CONTRIBUTING.md +0 -70
- package/core/README.md +0 -61
- package/core/SECURITY.md +0 -21
- package/core/apps/docs/index.html +0 -28
- package/core/apps/docs/middleware.ts +0 -21
- package/core/apps/docs/package.json +0 -33
- package/core/apps/docs/public/@flux.png +0 -0
- package/core/apps/docs/public/docs/latest/guides.json +0 -1420
- package/core/apps/docs/public/docs/latest/main.json +0 -14981
- package/core/apps/docs/public/docs/latest/rag-index.json +0 -1
- package/core/apps/docs/public/docs/v1.0.5/guides.json +0 -226
- package/core/apps/docs/public/docs/v1.0.5/main.json +0 -7920
- package/core/apps/docs/public/docs/v1.0.6/guides.json +0 -226
- package/core/apps/docs/public/docs/v1.0.6/main.json +0 -7920
- package/core/apps/docs/public/docs/v1.0.7/guides.json +0 -259
- package/core/apps/docs/public/docs/v1.0.7/main.json +0 -8652
- package/core/apps/docs/public/docs/v1.0.8/guides.json +0 -313
- package/core/apps/docs/public/docs/v1.0.8/main.json +0 -9618
- package/core/apps/docs/public/docs/v1.0.9/guides.json +0 -319
- package/core/apps/docs/public/docs/v1.0.9/main.json +0 -10694
- package/core/apps/docs/public/docs/v1.1.0/guides.json +0 -589
- package/core/apps/docs/public/docs/v1.1.0/main.json +0 -12576
- package/core/apps/docs/public/docs/v1.1.2/guides.json +0 -650
- package/core/apps/docs/public/docs/v1.1.2/main.json +0 -13239
- package/core/apps/docs/public/docs/v1.1.3/guides.json +0 -650
- package/core/apps/docs/public/docs/v1.1.3/main.json +0 -13239
- package/core/apps/docs/public/docs/v1.1.4/guides.json +0 -708
- package/core/apps/docs/public/docs/v1.1.4/main.json +0 -13231
- package/core/apps/docs/public/docs/v1.1.5/guides.json +0 -1035
- package/core/apps/docs/public/docs/v1.1.5/main.json +0 -13838
- package/core/apps/docs/public/docs/v1.1.6/guides.json +0 -1041
- package/core/apps/docs/public/docs/v1.1.6/main.json +0 -14313
- package/core/apps/docs/public/docs/v1.1.8/guides.json +0 -1047
- package/core/apps/docs/public/docs/v1.1.8/main.json +0 -14421
- package/core/apps/docs/public/docs/v1.1.9/guides.json +0 -1047
- package/core/apps/docs/public/docs/v1.1.9/main.json +0 -14421
- package/core/apps/docs/public/docs/v1.2.0/guides.json +0 -1212
- package/core/apps/docs/public/docs/v1.2.0/main.json +0 -14663
- package/core/apps/docs/public/docs/v1.2.1/guides.json +0 -1293
- package/core/apps/docs/public/docs/v1.2.1/main.json +0 -14828
- package/core/apps/docs/public/docs/v1.2.2/guides.json +0 -1293
- package/core/apps/docs/public/docs/v1.2.2/main.json +0 -15025
- package/core/apps/docs/public/docs/v1.2.3/guides.json +0 -1420
- package/core/apps/docs/public/docs/v1.2.3/main.json +0 -14954
- package/core/apps/docs/public/docs/v1.2.4/guides.json +0 -1420
- package/core/apps/docs/public/docs/v1.2.4/main.json +0 -14981
- package/core/apps/docs/public/docs/versions.json +0 -24
- package/core/apps/docs/public/flux.png +0 -0
- package/core/apps/docs/public/locales/en.json +0 -50
- package/core/apps/docs/public/locales/guides-en.json +0 -512
- package/core/apps/docs/public/robots.txt +0 -4
- package/core/apps/docs/public/sitemap.xml +0 -33
- package/core/apps/docs/src/App.vue +0 -538
- package/core/apps/docs/src/components/ApiCategorySection.vue +0 -42
- package/core/apps/docs/src/components/ApiDiscordCompat.vue +0 -65
- package/core/apps/docs/src/components/ApiEndpointCard.vue +0 -313
- package/core/apps/docs/src/components/ApiSchemaBlock.vue +0 -131
- package/core/apps/docs/src/components/CodeBlock.vue +0 -177
- package/core/apps/docs/src/components/CommunityCallout.vue +0 -90
- package/core/apps/docs/src/components/ConstructorSection.vue +0 -82
- package/core/apps/docs/src/components/DocDescription.vue +0 -40
- package/core/apps/docs/src/components/FluxerLogo.vue +0 -3
- package/core/apps/docs/src/components/Footer.vue +0 -106
- package/core/apps/docs/src/components/GuideCodeBlock.vue +0 -102
- package/core/apps/docs/src/components/GuideDiscordCompat.vue +0 -77
- package/core/apps/docs/src/components/GuideDiscordCompatCallout.vue +0 -83
- package/core/apps/docs/src/components/GuideTable.vue +0 -77
- package/core/apps/docs/src/components/GuideTip.vue +0 -38
- package/core/apps/docs/src/components/MethodsSection.vue +0 -195
- package/core/apps/docs/src/components/ParamsTable.vue +0 -70
- package/core/apps/docs/src/components/PropertiesSection.vue +0 -143
- package/core/apps/docs/src/components/SearchBar.vue +0 -76
- package/core/apps/docs/src/components/SearchModal.vue +0 -361
- package/core/apps/docs/src/components/SidebarNav.vue +0 -225
- package/core/apps/docs/src/components/SponsorBanner.vue +0 -153
- package/core/apps/docs/src/components/TypeSignature.vue +0 -187
- package/core/apps/docs/src/components/VersionPicker.vue +0 -191
- package/core/apps/docs/src/composables/useSearchIndex.ts +0 -144
- package/core/apps/docs/src/composables/useVersionedPath.ts +0 -20
- package/core/apps/docs/src/data/apiEndpoints.ts +0 -1073
- package/core/apps/docs/src/data/changelog.ts +0 -717
- package/core/apps/docs/src/data/guides.ts +0 -2362
- package/core/apps/docs/src/env.d.ts +0 -7
- package/core/apps/docs/src/locales/guides-en.json +0 -512
- package/core/apps/docs/src/main.ts +0 -27
- package/core/apps/docs/src/pages/ApiReferenceLayout.vue +0 -175
- package/core/apps/docs/src/pages/ApiReferencePage.vue +0 -128
- package/core/apps/docs/src/pages/Changelog.vue +0 -288
- package/core/apps/docs/src/pages/ClassPage.vue +0 -319
- package/core/apps/docs/src/pages/ClassesList.vue +0 -100
- package/core/apps/docs/src/pages/DocsLayout.vue +0 -127
- package/core/apps/docs/src/pages/GuidePage.vue +0 -279
- package/core/apps/docs/src/pages/GuidesIndex.vue +0 -166
- package/core/apps/docs/src/pages/GuidesLayout.vue +0 -245
- package/core/apps/docs/src/pages/Home.vue +0 -125
- package/core/apps/docs/src/pages/NotFound.vue +0 -57
- package/core/apps/docs/src/pages/TypedefPage.vue +0 -230
- package/core/apps/docs/src/pages/TypedefsList.vue +0 -168
- package/core/apps/docs/src/pages/VersionLayout.vue +0 -15
- package/core/apps/docs/src/router.ts +0 -73
- package/core/apps/docs/src/stores/docs.ts +0 -54
- package/core/apps/docs/src/stores/guides.ts +0 -53
- package/core/apps/docs/src/stores/version.ts +0 -67
- package/core/apps/docs/src/styles/main.css +0 -278
- package/core/apps/docs/src/styles/prism.css +0 -95
- package/core/apps/docs/src/types/doc-schema.ts +0 -112
- package/core/apps/docs/tsconfig.json +0 -17
- package/core/apps/docs/tsconfig.node.json +0 -10
- package/core/apps/docs/vite.config.d.ts +0 -2
- package/core/apps/docs/vite.config.js +0 -26
- package/core/apps/docs/vite.config.ts +0 -28
- package/core/apps/docs-vitepress/.vitepress/config.ts +0 -141
- package/core/apps/docs-vitepress/api-data/latest/main.json +0 -15035
- package/core/apps/docs-vitepress/api-data/v1.2.4/main.json +0 -15035
- package/core/apps/docs-vitepress/api-data/versions.json +0 -6
- package/core/apps/docs-vitepress/index.md +0 -15
- package/core/apps/docs-vitepress/package-lock.json +0 -2924
- package/core/apps/docs-vitepress/package.json +0 -20
- package/core/apps/docs-vitepress/public/CNAME +0 -1
- package/core/apps/docs-vitepress/scripts/generate-api.ts +0 -243
- package/core/apps/docs-vitepress/scripts/migrate-guides.ts +0 -129
- package/core/apps/docs-vitepress/tsconfig.json +0 -11
- package/core/apps/docs-vitepress/v/latest/guides/attachments-by-url.md +0 -57
- package/core/apps/docs-vitepress/v/latest/guides/attachments.md +0 -62
- package/core/apps/docs-vitepress/v/latest/guides/basic-bot.md +0 -49
- package/core/apps/docs-vitepress/v/latest/guides/channels.md +0 -180
- package/core/apps/docs-vitepress/v/latest/guides/deprecated-apis.md +0 -58
- package/core/apps/docs-vitepress/v/latest/guides/discord-js-compatibility.md +0 -42
- package/core/apps/docs-vitepress/v/latest/guides/editing-embeds.md +0 -65
- package/core/apps/docs-vitepress/v/latest/guides/embed-media.md +0 -87
- package/core/apps/docs-vitepress/v/latest/guides/embeds.md +0 -166
- package/core/apps/docs-vitepress/v/latest/guides/emojis.md +0 -77
- package/core/apps/docs-vitepress/v/latest/guides/events.md +0 -202
- package/core/apps/docs-vitepress/v/latest/guides/gifs.md +0 -47
- package/core/apps/docs-vitepress/v/latest/guides/installation.md +0 -10
- package/core/apps/docs-vitepress/v/latest/guides/moderation.md +0 -89
- package/core/apps/docs-vitepress/v/latest/guides/permissions.md +0 -130
- package/core/apps/docs-vitepress/v/latest/guides/prefix-commands.md +0 -41
- package/core/apps/docs-vitepress/v/latest/guides/profile-urls.md +0 -58
- package/core/apps/docs-vitepress/v/latest/guides/reactions.md +0 -69
- package/core/apps/docs-vitepress/v/latest/guides/roles.md +0 -130
- package/core/apps/docs-vitepress/v/latest/guides/sending-without-reply.md +0 -172
- package/core/apps/docs-vitepress/v/latest/guides/voice.md +0 -109
- package/core/apps/docs-vitepress/v/latest/guides/wait-for-guilds.md +0 -37
- package/core/apps/docs-vitepress/v/latest/guides/webhook-attachments-embeds.md +0 -73
- package/core/apps/docs-vitepress/v/latest/guides/webhooks.md +0 -131
- package/core/eslint.config.js +0 -80
- package/core/examples/.env.example +0 -22
- package/core/examples/README.md +0 -68
- package/core/examples/first-steps-bot.js +0 -118
- package/core/examples/minimal-bot.js +0 -17
- package/core/examples/moderation-bot.js +0 -209
- package/core/examples/package.json +0 -14
- package/core/examples/ping-bot.js +0 -1146
- package/core/examples/reaction-bot.js +0 -70
- package/core/examples/reaction-roles-bot.js +0 -140
- package/core/examples/webhook-bot.js +0 -239
- package/core/flux.png +0 -0
- package/core/package.json +0 -78
- package/core/packages/builders/package.json +0 -51
- package/core/packages/builders/src/index.ts +0 -13
- package/core/packages/builders/src/messages/AttachmentBuilder.test.ts +0 -79
- package/core/packages/builders/src/messages/AttachmentBuilder.ts +0 -69
- package/core/packages/builders/src/messages/EmbedBuilder.test.ts +0 -266
- package/core/packages/builders/src/messages/EmbedBuilder.ts +0 -239
- package/core/packages/builders/src/messages/MessagePayload.test.ts +0 -118
- package/core/packages/builders/src/messages/MessagePayload.ts +0 -122
- package/core/packages/builders/tsconfig.json +0 -9
- package/core/packages/builders/tsup.config.ts +0 -9
- package/core/packages/builders/vitest.config.ts +0 -9
- package/core/packages/collection/package.json +0 -47
- package/core/packages/collection/src/Collection.test.ts +0 -232
- package/core/packages/collection/src/Collection.ts +0 -196
- package/core/packages/collection/src/index.ts +0 -1
- package/core/packages/collection/tsconfig.json +0 -9
- package/core/packages/collection/tsup.config.ts +0 -9
- package/core/packages/collection/vitest.config.ts +0 -9
- package/core/packages/docgen/package.json +0 -26
- package/core/packages/docgen/src/extract.ts +0 -262
- package/core/packages/docgen/src/formatType.ts +0 -24
- package/core/packages/docgen/src/index.ts +0 -103
- package/core/packages/docgen/src/schema.ts +0 -100
- package/core/packages/docgen/src/visitor.ts +0 -147
- package/core/packages/docgen/tsconfig.json +0 -9
- package/core/packages/docgen/tsup.config.ts +0 -9
- package/core/packages/fluxer-core/README.md +0 -26
- package/core/packages/fluxer-core/package.json +0 -60
- package/core/packages/fluxer-core/src/client/ChannelManager.ts +0 -143
- package/core/packages/fluxer-core/src/client/Client.gateway.test.ts +0 -84
- package/core/packages/fluxer-core/src/client/Client.resolveEmoji.test.ts +0 -45
- package/core/packages/fluxer-core/src/client/Client.ts +0 -558
- package/core/packages/fluxer-core/src/client/ClientUser.ts +0 -40
- package/core/packages/fluxer-core/src/client/EventHandlerRegistry.ts +0 -469
- package/core/packages/fluxer-core/src/client/GuildManager.ts +0 -79
- package/core/packages/fluxer-core/src/client/GuildMemberManager.ts +0 -91
- package/core/packages/fluxer-core/src/client/MessageManager.ts +0 -58
- package/core/packages/fluxer-core/src/client/UsersManager.ts +0 -122
- package/core/packages/fluxer-core/src/errors/ErrorCodes.test.ts +0 -19
- package/core/packages/fluxer-core/src/errors/ErrorCodes.ts +0 -12
- package/core/packages/fluxer-core/src/errors/FluxerError.test.ts +0 -32
- package/core/packages/fluxer-core/src/errors/FluxerError.ts +0 -15
- package/core/packages/fluxer-core/src/index.ts +0 -85
- package/core/packages/fluxer-core/src/structures/Base.ts +0 -7
- package/core/packages/fluxer-core/src/structures/Channel.ts +0 -508
- package/core/packages/fluxer-core/src/structures/Guild.test.ts +0 -189
- package/core/packages/fluxer-core/src/structures/Guild.ts +0 -734
- package/core/packages/fluxer-core/src/structures/GuildBan.ts +0 -35
- package/core/packages/fluxer-core/src/structures/GuildEmoji.ts +0 -57
- package/core/packages/fluxer-core/src/structures/GuildMember.test.ts +0 -203
- package/core/packages/fluxer-core/src/structures/GuildMember.ts +0 -213
- package/core/packages/fluxer-core/src/structures/GuildMemberRoleManager.ts +0 -121
- package/core/packages/fluxer-core/src/structures/GuildSticker.ts +0 -56
- package/core/packages/fluxer-core/src/structures/Invite.test.ts +0 -103
- package/core/packages/fluxer-core/src/structures/Invite.ts +0 -121
- package/core/packages/fluxer-core/src/structures/Message.test.ts +0 -109
- package/core/packages/fluxer-core/src/structures/Message.ts +0 -397
- package/core/packages/fluxer-core/src/structures/MessageReaction.ts +0 -72
- package/core/packages/fluxer-core/src/structures/PartialMessage.ts +0 -12
- package/core/packages/fluxer-core/src/structures/Role.test.ts +0 -77
- package/core/packages/fluxer-core/src/structures/Role.ts +0 -112
- package/core/packages/fluxer-core/src/structures/User.test.ts +0 -110
- package/core/packages/fluxer-core/src/structures/User.ts +0 -109
- package/core/packages/fluxer-core/src/structures/Webhook.test.ts +0 -109
- package/core/packages/fluxer-core/src/structures/Webhook.ts +0 -258
- package/core/packages/fluxer-core/src/util/Constants.test.ts +0 -16
- package/core/packages/fluxer-core/src/util/Constants.ts +0 -7
- package/core/packages/fluxer-core/src/util/Events.ts +0 -46
- package/core/packages/fluxer-core/src/util/MessageCollector.ts +0 -87
- package/core/packages/fluxer-core/src/util/Options.ts +0 -33
- package/core/packages/fluxer-core/src/util/ReactionCollector.ts +0 -116
- package/core/packages/fluxer-core/src/util/cdn.test.ts +0 -108
- package/core/packages/fluxer-core/src/util/cdn.ts +0 -130
- package/core/packages/fluxer-core/src/util/guildUtils.ts +0 -33
- package/core/packages/fluxer-core/src/util/messageUtils.test.ts +0 -74
- package/core/packages/fluxer-core/src/util/messageUtils.ts +0 -119
- package/core/packages/fluxer-core/src/util/permissions.test.ts +0 -95
- package/core/packages/fluxer-core/src/util/permissions.ts +0 -43
- package/core/packages/fluxer-core/tsconfig.json +0 -9
- package/core/packages/fluxer-core/tsup.config.ts +0 -9
- package/core/packages/fluxer-core/vitest.config.ts +0 -9
- package/core/packages/rest/package.json +0 -52
- package/core/packages/rest/src/REST.test.ts +0 -64
- package/core/packages/rest/src/REST.ts +0 -90
- package/core/packages/rest/src/RateLimitManager.test.ts +0 -71
- package/core/packages/rest/src/RateLimitManager.ts +0 -60
- package/core/packages/rest/src/RequestManager.test.ts +0 -87
- package/core/packages/rest/src/RequestManager.ts +0 -172
- package/core/packages/rest/src/errors/FluxerAPIError.test.ts +0 -57
- package/core/packages/rest/src/errors/FluxerAPIError.ts +0 -21
- package/core/packages/rest/src/errors/HTTPError.test.ts +0 -55
- package/core/packages/rest/src/errors/HTTPError.ts +0 -25
- package/core/packages/rest/src/errors/RateLimitError.test.ts +0 -41
- package/core/packages/rest/src/errors/RateLimitError.ts +0 -15
- package/core/packages/rest/src/errors/index.ts +0 -3
- package/core/packages/rest/src/index.ts +0 -6
- package/core/packages/rest/src/utils/constants.test.ts +0 -31
- package/core/packages/rest/src/utils/constants.ts +0 -5
- package/core/packages/rest/src/utils/files.test.ts +0 -37
- package/core/packages/rest/src/utils/files.ts +0 -75
- package/core/packages/rest/tsconfig.json +0 -9
- package/core/packages/rest/tsup.config.ts +0 -9
- package/core/packages/rest/vitest.config.ts +0 -9
- package/core/packages/types/package.json +0 -46
- package/core/packages/types/src/api/ban.ts +0 -8
- package/core/packages/types/src/api/channel.ts +0 -65
- package/core/packages/types/src/api/embed.ts +0 -82
- package/core/packages/types/src/api/emoji.ts +0 -12
- package/core/packages/types/src/api/errors.ts +0 -68
- package/core/packages/types/src/api/gateway.ts +0 -14
- package/core/packages/types/src/api/guild.ts +0 -123
- package/core/packages/types/src/api/index.ts +0 -15
- package/core/packages/types/src/api/instance.ts +0 -32
- package/core/packages/types/src/api/interaction.ts +0 -26
- package/core/packages/types/src/api/invite.ts +0 -28
- package/core/packages/types/src/api/message.ts +0 -140
- package/core/packages/types/src/api/role.ts +0 -41
- package/core/packages/types/src/api/sticker.ts +0 -14
- package/core/packages/types/src/api/user.ts +0 -79
- package/core/packages/types/src/api/webhook.ts +0 -41
- package/core/packages/types/src/common/index.ts +0 -1
- package/core/packages/types/src/common/snowflake.test.ts +0 -9
- package/core/packages/types/src/common/snowflake.ts +0 -8
- package/core/packages/types/src/gateway/events.ts +0 -189
- package/core/packages/types/src/gateway/index.ts +0 -3
- package/core/packages/types/src/gateway/opcodes.ts +0 -17
- package/core/packages/types/src/gateway/payloads.ts +0 -481
- package/core/packages/types/src/index.ts +0 -4
- package/core/packages/types/src/rest/index.ts +0 -1
- package/core/packages/types/src/rest/routes.test.ts +0 -169
- package/core/packages/types/src/rest/routes.ts +0 -109
- package/core/packages/types/tsconfig.json +0 -9
- package/core/packages/types/tsup.config.ts +0 -9
- package/core/packages/types/vitest.config.ts +0 -9
- package/core/packages/util/package.json +0 -51
- package/core/packages/util/src/BitField.test.ts +0 -96
- package/core/packages/util/src/BitField.ts +0 -105
- package/core/packages/util/src/MessageFlagsBitField.test.ts +0 -42
- package/core/packages/util/src/MessageFlagsBitField.ts +0 -20
- package/core/packages/util/src/PermissionsBitField.test.ts +0 -79
- package/core/packages/util/src/PermissionsBitField.ts +0 -97
- package/core/packages/util/src/SnowflakeUtil.test.ts +0 -69
- package/core/packages/util/src/SnowflakeUtil.ts +0 -65
- package/core/packages/util/src/UserFlagsBitField.test.ts +0 -39
- package/core/packages/util/src/UserFlagsBitField.ts +0 -48
- package/core/packages/util/src/deprecation.test.ts +0 -44
- package/core/packages/util/src/deprecation.ts +0 -28
- package/core/packages/util/src/emojiShortcodes.generated.ts +0 -5
- package/core/packages/util/src/emojiShortcodes.test.ts +0 -41
- package/core/packages/util/src/emojiShortcodes.ts +0 -22
- package/core/packages/util/src/formatters.test.ts +0 -65
- package/core/packages/util/src/formatters.ts +0 -35
- package/core/packages/util/src/index.ts +0 -34
- package/core/packages/util/src/resolvers.test.ts +0 -198
- package/core/packages/util/src/resolvers.ts +0 -127
- package/core/packages/util/src/tenorUtils.test.ts +0 -75
- package/core/packages/util/src/tenorUtils.ts +0 -86
- package/core/packages/util/tsconfig.json +0 -9
- package/core/packages/util/tsup.config.ts +0 -9
- package/core/packages/util/vitest.config.ts +0 -9
- package/core/packages/voice/README.md +0 -42
- package/core/packages/voice/package.json +0 -67
- package/core/packages/voice/src/LiveKitRtcConnection.receive.test.ts +0 -24
- package/core/packages/voice/src/LiveKitRtcConnection.ts +0 -1767
- package/core/packages/voice/src/VoiceConnection.ts +0 -413
- package/core/packages/voice/src/VoiceManager.receive.test.ts +0 -61
- package/core/packages/voice/src/VoiceManager.test.ts +0 -44
- package/core/packages/voice/src/VoiceManager.ts +0 -503
- package/core/packages/voice/src/exports.test.ts +0 -38
- package/core/packages/voice/src/index.ts +0 -51
- package/core/packages/voice/src/livekit.test.ts +0 -48
- package/core/packages/voice/src/livekit.ts +0 -33
- package/core/packages/voice/src/mp4box.d.ts +0 -32
- package/core/packages/voice/src/opusUtils.test.ts +0 -29
- package/core/packages/voice/src/opusUtils.ts +0 -86
- package/core/packages/voice/src/streamPreviewPlaceholder.test.ts +0 -16
- package/core/packages/voice/src/streamPreviewPlaceholder.ts +0 -8
- package/core/packages/voice/src/ws.d.ts +0 -1
- package/core/packages/voice/tsconfig.json +0 -5
- package/core/packages/voice/tsup.config.ts +0 -10
- package/core/packages/voice/vitest.config.ts +0 -9
- package/core/packages/ws/package.json +0 -52
- package/core/packages/ws/src/WebSocketManager.ts +0 -130
- package/core/packages/ws/src/WebSocketShard.ts +0 -296
- package/core/packages/ws/src/index.ts +0 -12
- package/core/packages/ws/src/utils/constants.test.ts +0 -46
- package/core/packages/ws/src/utils/constants.ts +0 -22
- package/core/packages/ws/src/utils/getWebSocket.ts +0 -55
- package/core/packages/ws/src/ws.d.ts +0 -10
- package/core/packages/ws/tsconfig.json +0 -9
- package/core/packages/ws/tsup.config.ts +0 -9
- package/core/pnpm-lock.yaml +0 -7033
- package/core/pnpm-workspace.yaml +0 -4
- package/core/scripts/generate-ai-rag.ts +0 -240
- package/core/scripts/generate-docs.ts +0 -143
- package/core/scripts/generate-emoji-shortcodes.ts +0 -58
- package/core/scripts/generate-types.ts +0 -6
- package/core/scripts/publish-ordered.js +0 -63
- package/core/scripts/test-cjs-require.mjs +0 -43
- package/core/scripts/test-esm-imports.mjs +0 -42
- package/core/scripts/test-package-exports.mjs +0 -98
- package/core/scripts/test-smoke.mjs +0 -103
- package/core/tsconfig.json +0 -18
- package/core/turbo.json +0 -30
- package/core/vitest.config.ts +0 -17
- package/core/wrangler.jsonc +0 -9
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
|
-
import { Collection } from '@erinjs/collection';
|
|
3
|
-
import { Client } from '../client/Client.js';
|
|
4
|
-
import { Message } from '../structures/Message.js';
|
|
5
|
-
import { Events } from './Events.js';
|
|
6
|
-
|
|
7
|
-
export interface MessageCollectorOptions {
|
|
8
|
-
/** Filter function. Return true to collect the message. */
|
|
9
|
-
filter?: (message: Message) => boolean;
|
|
10
|
-
/** Max duration in ms. Collector stops when time expires. */
|
|
11
|
-
time?: number;
|
|
12
|
-
/** Max messages to collect. Collector stops when limit reached. */
|
|
13
|
-
max?: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type MessageCollectorEndReason = 'time' | 'limit' | 'user';
|
|
17
|
-
|
|
18
|
-
export interface MessageCollectorEvents {
|
|
19
|
-
collect: [message: Message];
|
|
20
|
-
end: [collected: Collection<string, Message>, reason: MessageCollectorEndReason];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Collects messages in a channel. Use channel.createMessageCollector().
|
|
25
|
-
* @example
|
|
26
|
-
* const collector = channel.createMessageCollector({ filter: m => m.author.id === userId, time: 10000 });
|
|
27
|
-
* collector.on('collect', m => console.log(m.content));
|
|
28
|
-
* collector.on('end', (collected, reason) => console.log(`Stopped: ${reason}`));
|
|
29
|
-
*/
|
|
30
|
-
export class MessageCollector extends EventEmitter {
|
|
31
|
-
readonly client: Client;
|
|
32
|
-
readonly channelId: string;
|
|
33
|
-
readonly options: Required<MessageCollectorOptions>;
|
|
34
|
-
readonly collected = new Collection<string, Message>();
|
|
35
|
-
private _timeout: ReturnType<typeof setTimeout> | null = null;
|
|
36
|
-
private _ended = false;
|
|
37
|
-
private _listener: (message: Message) => void;
|
|
38
|
-
|
|
39
|
-
constructor(client: Client, channelId: string, options: MessageCollectorOptions = {}) {
|
|
40
|
-
super();
|
|
41
|
-
this.client = client;
|
|
42
|
-
this.channelId = channelId;
|
|
43
|
-
this.options = {
|
|
44
|
-
filter: options.filter ?? (() => true),
|
|
45
|
-
time: options.time ?? 0,
|
|
46
|
-
max: options.max ?? 0,
|
|
47
|
-
};
|
|
48
|
-
this._listener = (message: Message) => {
|
|
49
|
-
if (this._ended || message.channelId !== this.channelId) return;
|
|
50
|
-
if (!this.options.filter(message)) return;
|
|
51
|
-
this.collected.set(message.id, message);
|
|
52
|
-
this.emit('collect', message);
|
|
53
|
-
if (this.options.max > 0 && this.collected.size >= this.options.max) {
|
|
54
|
-
this.stop('limit');
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
this.client.on(Events.MessageCreate, this._listener);
|
|
58
|
-
if (this.options.time > 0) {
|
|
59
|
-
this._timeout = setTimeout(() => this.stop('time'), this.options.time);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
stop(reason: MessageCollectorEndReason = 'user'): void {
|
|
64
|
-
if (this._ended) return;
|
|
65
|
-
this._ended = true;
|
|
66
|
-
this.client.off(Events.MessageCreate, this._listener);
|
|
67
|
-
if (this._timeout) {
|
|
68
|
-
clearTimeout(this._timeout);
|
|
69
|
-
this._timeout = null;
|
|
70
|
-
}
|
|
71
|
-
this.emit('end', this.collected, reason);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
override on<K extends keyof MessageCollectorEvents>(
|
|
75
|
-
event: K,
|
|
76
|
-
listener: (...args: MessageCollectorEvents[K]) => void,
|
|
77
|
-
): this {
|
|
78
|
-
return super.on(event, listener as (...args: unknown[]) => void) as this;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
override emit<K extends keyof MessageCollectorEvents>(
|
|
82
|
-
event: K,
|
|
83
|
-
...args: MessageCollectorEvents[K]
|
|
84
|
-
): boolean {
|
|
85
|
-
return super.emit(event, ...args);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { REST } from '@erinjs/rest';
|
|
2
|
-
import { GatewayPresenceUpdateData } from '@erinjs/types';
|
|
3
|
-
|
|
4
|
-
/** Optional cache size limits. When exceeded, oldest entries are evicted (FIFO). Omit or use 0 for unbounded. */
|
|
5
|
-
export interface CacheSizeLimits {
|
|
6
|
-
channels?: number;
|
|
7
|
-
guilds?: number;
|
|
8
|
-
users?: number;
|
|
9
|
-
/** Max messages per channel to cache. Enables channel.messages.get() and oldMessage in messageUpdate. 0 = disabled. */
|
|
10
|
-
messages?: number;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface ClientOptions {
|
|
14
|
-
rest?: Partial<ConstructorParameters<typeof REST>[0]>;
|
|
15
|
-
/** Gateway intents. Not yet supported by Fluxer—value is always sent as 0. Set suppressIntentWarning to silence the warning. */
|
|
16
|
-
intents?: number;
|
|
17
|
-
/** Suppress the warning when intents are set (Fluxer does not support intents yet). */
|
|
18
|
-
suppressIntentWarning?: boolean;
|
|
19
|
-
/** When true, delay the Ready event until all guilds from READY (including unavailable) have been received via GUILD_CREATE. Default: false. */
|
|
20
|
-
waitForGuilds?: boolean;
|
|
21
|
-
/** Cache size limits (channels, guilds, users). When exceeded, oldest entries are evicted. Omit or 0 = unbounded. */
|
|
22
|
-
cache?: CacheSizeLimits;
|
|
23
|
-
/** Initial presence (status, custom_status, etc.) sent on identify. Can also update via PresenceUpdate after connect. */
|
|
24
|
-
presence?: GatewayPresenceUpdateData;
|
|
25
|
-
/** Optional WebSocket constructor (e.g. `require('ws')` in Node for compatibility) */
|
|
26
|
-
WebSocket?: new (url: string) => {
|
|
27
|
-
send(data: string | ArrayBufferLike): void;
|
|
28
|
-
close(code?: number): void;
|
|
29
|
-
readyState: number;
|
|
30
|
-
addEventListener?(type: string, listener: (e: unknown) => void): void;
|
|
31
|
-
on?(event: string, cb: (data?: unknown) => void): void;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
|
-
import { Collection } from '@erinjs/collection';
|
|
3
|
-
import { Client } from '../client/Client.js';
|
|
4
|
-
import { MessageReaction } from '../structures/MessageReaction.js';
|
|
5
|
-
import { User } from '../structures/User.js';
|
|
6
|
-
import { GatewayReactionEmoji } from '@erinjs/types';
|
|
7
|
-
import { Events } from './Events.js';
|
|
8
|
-
|
|
9
|
-
export interface ReactionCollectorOptions {
|
|
10
|
-
/** Filter function. Return true to collect the reaction. */
|
|
11
|
-
filter?: (reaction: MessageReaction, user: User) => boolean;
|
|
12
|
-
/** Max duration in ms. Collector stops when time expires. */
|
|
13
|
-
time?: number;
|
|
14
|
-
/** Max reactions to collect. Collector stops when limit reached. */
|
|
15
|
-
max?: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type ReactionCollectorEndReason = 'time' | 'limit' | 'user';
|
|
19
|
-
|
|
20
|
-
export interface CollectedReaction {
|
|
21
|
-
reaction: MessageReaction;
|
|
22
|
-
user: User;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface ReactionCollectorEvents {
|
|
26
|
-
collect: [reaction: MessageReaction, user: User];
|
|
27
|
-
end: [collected: Collection<string, CollectedReaction>, reason: ReactionCollectorEndReason];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Collects reactions on a message. Use message.createReactionCollector().
|
|
32
|
-
* @example
|
|
33
|
-
* const collector = message.createReactionCollector({ filter: (r, u) => u.id === userId, time: 10000 });
|
|
34
|
-
* collector.on('collect', (reaction, user) => console.log(user.username, 'reacted', reaction.emoji.name));
|
|
35
|
-
* collector.on('end', (collected, reason) => console.log(`Stopped: ${reason}`));
|
|
36
|
-
*/
|
|
37
|
-
export class ReactionCollector extends EventEmitter {
|
|
38
|
-
readonly client: Client;
|
|
39
|
-
readonly messageId: string;
|
|
40
|
-
readonly channelId: string;
|
|
41
|
-
readonly options: Required<ReactionCollectorOptions>;
|
|
42
|
-
readonly collected = new Collection<string, CollectedReaction>();
|
|
43
|
-
private _timeout: ReturnType<typeof setTimeout> | null = null;
|
|
44
|
-
private _ended = false;
|
|
45
|
-
private _listener: (
|
|
46
|
-
reaction: MessageReaction,
|
|
47
|
-
user: User,
|
|
48
|
-
_msgId: string,
|
|
49
|
-
channelId: string,
|
|
50
|
-
_emoji: GatewayReactionEmoji,
|
|
51
|
-
userId: string,
|
|
52
|
-
) => void;
|
|
53
|
-
|
|
54
|
-
constructor(
|
|
55
|
-
client: Client,
|
|
56
|
-
messageId: string,
|
|
57
|
-
channelId: string,
|
|
58
|
-
options: ReactionCollectorOptions = {},
|
|
59
|
-
) {
|
|
60
|
-
super();
|
|
61
|
-
this.client = client;
|
|
62
|
-
this.messageId = messageId;
|
|
63
|
-
this.channelId = channelId;
|
|
64
|
-
this.options = {
|
|
65
|
-
filter: options.filter ?? (() => true),
|
|
66
|
-
time: options.time ?? 0,
|
|
67
|
-
max: options.max ?? 0,
|
|
68
|
-
};
|
|
69
|
-
this._listener = (
|
|
70
|
-
reaction: MessageReaction,
|
|
71
|
-
user: User,
|
|
72
|
-
_msgId: string,
|
|
73
|
-
chId: string,
|
|
74
|
-
_emoji: GatewayReactionEmoji,
|
|
75
|
-
userId: string,
|
|
76
|
-
) => {
|
|
77
|
-
if (this._ended || reaction.messageId !== this.messageId || chId !== this.channelId) return;
|
|
78
|
-
if (!this.options.filter(reaction, user)) return;
|
|
79
|
-
const key = `${userId}:${reaction.emoji.id ?? reaction.emoji.name}`;
|
|
80
|
-
this.collected.set(key, { reaction, user });
|
|
81
|
-
this.emit('collect', reaction, user);
|
|
82
|
-
if (this.options.max > 0 && this.collected.size >= this.options.max) {
|
|
83
|
-
this.stop('limit');
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
this.client.on(Events.MessageReactionAdd, this._listener);
|
|
87
|
-
if (this.options.time > 0) {
|
|
88
|
-
this._timeout = setTimeout(() => this.stop('time'), this.options.time);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
stop(reason: ReactionCollectorEndReason = 'user'): void {
|
|
93
|
-
if (this._ended) return;
|
|
94
|
-
this._ended = true;
|
|
95
|
-
this.client.off(Events.MessageReactionAdd, this._listener);
|
|
96
|
-
if (this._timeout) {
|
|
97
|
-
clearTimeout(this._timeout);
|
|
98
|
-
this._timeout = null;
|
|
99
|
-
}
|
|
100
|
-
this.emit('end', this.collected, reason);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
override on<K extends keyof ReactionCollectorEvents>(
|
|
104
|
-
event: K,
|
|
105
|
-
listener: (...args: ReactionCollectorEvents[K]) => void,
|
|
106
|
-
): this {
|
|
107
|
-
return super.on(event, listener as (...args: unknown[]) => void) as this;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
override emit<K extends keyof ReactionCollectorEvents>(
|
|
111
|
-
event: K,
|
|
112
|
-
...args: ReactionCollectorEvents[K]
|
|
113
|
-
): boolean {
|
|
114
|
-
return super.emit(event, ...args);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
cdnAvatarURL,
|
|
4
|
-
cdnDisplayAvatarURL,
|
|
5
|
-
cdnBannerURL,
|
|
6
|
-
cdnMemberAvatarURL,
|
|
7
|
-
cdnMemberBannerURL,
|
|
8
|
-
cdnDefaultAvatarURL,
|
|
9
|
-
} from './cdn.js';
|
|
10
|
-
|
|
11
|
-
describe('cdnAvatarURL', () => {
|
|
12
|
-
it('returns null for null hash', () => {
|
|
13
|
-
expect(cdnAvatarURL('123', null)).toBeNull();
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('builds avatar URL with default extension', () => {
|
|
17
|
-
const url = cdnAvatarURL('123456789012345678', 'abc123hash');
|
|
18
|
-
expect(url).toContain('fluxerusercontent.com/avatars/123456789012345678/abc123hash.png');
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('uses gif for a_ prefix (animated)', () => {
|
|
22
|
-
const url = cdnAvatarURL('123', 'a_animatedhash');
|
|
23
|
-
expect(url).toContain('.gif');
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('appends size when provided', () => {
|
|
27
|
-
const url = cdnAvatarURL('123', 'hash', { size: 256 });
|
|
28
|
-
expect(url).toContain('?size=256');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('uses custom extension', () => {
|
|
32
|
-
const url = cdnAvatarURL('123', 'hash', { extension: 'webp' });
|
|
33
|
-
expect(url).toContain('.webp');
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
describe('cdnDisplayAvatarURL', () => {
|
|
38
|
-
it('returns default avatar when hash is null', () => {
|
|
39
|
-
const url = cdnDisplayAvatarURL('123', null);
|
|
40
|
-
expect(url).toContain('fluxerstatic.com/avatars/');
|
|
41
|
-
expect(url).toContain('.png');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('returns custom avatar when hash present', () => {
|
|
45
|
-
const url = cdnDisplayAvatarURL('123', 'abc');
|
|
46
|
-
expect(url).toContain('fluxerusercontent.com/avatars/');
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
describe('cdnBannerURL', () => {
|
|
51
|
-
it('returns null for null hash', () => {
|
|
52
|
-
expect(cdnBannerURL('123', null)).toBeNull();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('builds banner URL', () => {
|
|
56
|
-
const url = cdnBannerURL('123456789012345678', 'bannerhash');
|
|
57
|
-
expect(url).toContain('fluxerusercontent.com/banners/123456789012345678/bannerhash.png');
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('uses gif for a_ prefix', () => {
|
|
61
|
-
const url = cdnBannerURL('123', 'a_banner');
|
|
62
|
-
expect(url).toContain('.gif');
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
describe('cdnMemberAvatarURL', () => {
|
|
67
|
-
it('returns null for null hash', () => {
|
|
68
|
-
expect(cdnMemberAvatarURL('g1', 'u1', null)).toBeNull();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('builds member avatar URL', () => {
|
|
72
|
-
const url = cdnMemberAvatarURL('guild123', 'user456', 'memberhash');
|
|
73
|
-
expect(url).toContain(
|
|
74
|
-
'fluxerusercontent.com/guilds/guild123/users/user456/avatars/memberhash.png',
|
|
75
|
-
);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe('cdnMemberBannerURL', () => {
|
|
80
|
-
it('returns null for null hash', () => {
|
|
81
|
-
expect(cdnMemberBannerURL('g1', 'u1', null)).toBeNull();
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('builds member banner URL', () => {
|
|
85
|
-
const url = cdnMemberBannerURL('guild123', 'user456', 'bannerhash');
|
|
86
|
-
expect(url).toContain(
|
|
87
|
-
'fluxerusercontent.com/guilds/guild123/users/user456/banners/bannerhash.png',
|
|
88
|
-
);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
describe('cdnDefaultAvatarURL', () => {
|
|
93
|
-
it('returns URL with index 0-5 from user ID', () => {
|
|
94
|
-
const url = cdnDefaultAvatarURL('0');
|
|
95
|
-
expect(url).toContain('fluxerstatic.com/avatars/');
|
|
96
|
-
expect(url).toContain('.png');
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('accepts numeric index', () => {
|
|
100
|
-
const url = cdnDefaultAvatarURL(3);
|
|
101
|
-
expect(url).toContain('/avatars/3.png');
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('handles negative index by taking abs and mod', () => {
|
|
105
|
-
const url = cdnDefaultAvatarURL(-1);
|
|
106
|
-
expect(url).toContain('/avatars/1.png');
|
|
107
|
-
});
|
|
108
|
-
});
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { CDN_URL, STATIC_CDN_URL } from './Constants.js';
|
|
2
|
-
|
|
3
|
-
export interface CdnUrlOptions {
|
|
4
|
-
size?: number;
|
|
5
|
-
extension?: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function getExtension(hash: string | null, options?: CdnUrlOptions): string {
|
|
9
|
-
const ext = options?.extension ?? 'png';
|
|
10
|
-
// Animated avatars/banners have hash starting with a_
|
|
11
|
-
if (hash?.startsWith('a_')) return 'gif';
|
|
12
|
-
return ext;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function appendSize(options?: CdnUrlOptions): string {
|
|
16
|
-
return options?.size ? `?size=${options.size}` : '';
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Build a user avatar URL from raw API data.
|
|
21
|
-
* @param userId - The user's snowflake ID
|
|
22
|
-
* @param avatarHash - The avatar hash from the API, or null if no custom avatar
|
|
23
|
-
* @param options - Optional size and extension (default: png; auto-detects gif for a_ hashes)
|
|
24
|
-
* @returns The avatar URL, or null if no avatar hash
|
|
25
|
-
* @example
|
|
26
|
-
* const url = cdnAvatarURL(userData.id, userData.avatar, { size: 256 });
|
|
27
|
-
*/
|
|
28
|
-
export function cdnAvatarURL(
|
|
29
|
-
userId: string,
|
|
30
|
-
avatarHash: string | null,
|
|
31
|
-
options?: CdnUrlOptions,
|
|
32
|
-
): string | null {
|
|
33
|
-
if (!avatarHash) return null;
|
|
34
|
-
const ext = getExtension(avatarHash, options);
|
|
35
|
-
const size = appendSize(options);
|
|
36
|
-
return `${CDN_URL}/avatars/${userId}/${avatarHash}.${ext}${size}`;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Build an avatar URL, or the default avatar when none set.
|
|
41
|
-
* @param userId - The user's snowflake ID
|
|
42
|
-
* @param avatarHash - The avatar hash from the API, or null
|
|
43
|
-
* @param options - Optional size and extension
|
|
44
|
-
* @returns The avatar URL (never null)
|
|
45
|
-
* @example
|
|
46
|
-
* const url = cdnDisplayAvatarURL(user.id, user.avatar, { size: 64 });
|
|
47
|
-
*/
|
|
48
|
-
export function cdnDisplayAvatarURL(
|
|
49
|
-
userId: string,
|
|
50
|
-
avatarHash: string | null,
|
|
51
|
-
options?: CdnUrlOptions,
|
|
52
|
-
): string {
|
|
53
|
-
return cdnAvatarURL(userId, avatarHash, options) ?? cdnDefaultAvatarURL(userId);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Build a user or guild banner URL from raw API data.
|
|
58
|
-
* @param resourceId - The user ID or guild ID
|
|
59
|
-
* @param bannerHash - The banner hash from the API, or null
|
|
60
|
-
* @param options - Optional size and extension (default: png; auto-detects gif for a_ hashes)
|
|
61
|
-
* @returns The banner URL, or null if no banner
|
|
62
|
-
* @example
|
|
63
|
-
* const url = cdnBannerURL(userData.id, profile.banner, { size: 512 });
|
|
64
|
-
*/
|
|
65
|
-
export function cdnBannerURL(
|
|
66
|
-
resourceId: string,
|
|
67
|
-
bannerHash: string | null,
|
|
68
|
-
options?: CdnUrlOptions,
|
|
69
|
-
): string | null {
|
|
70
|
-
if (!bannerHash) return null;
|
|
71
|
-
const ext = getExtension(bannerHash, options);
|
|
72
|
-
const size = appendSize(options);
|
|
73
|
-
return `${CDN_URL}/banners/${resourceId}/${bannerHash}.${ext}${size}`;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Build a guild member avatar URL (guild-specific avatar).
|
|
78
|
-
* @param guildId - The guild ID
|
|
79
|
-
* @param userId - The user ID
|
|
80
|
-
* @param avatarHash - The member avatar hash, or null
|
|
81
|
-
* @param options - Optional size and extension
|
|
82
|
-
* @returns The member avatar URL, or null if no guild avatar
|
|
83
|
-
* @example
|
|
84
|
-
* const url = cdnMemberAvatarURL(member.guild.id, member.id, member.avatar);
|
|
85
|
-
*/
|
|
86
|
-
export function cdnMemberAvatarURL(
|
|
87
|
-
guildId: string,
|
|
88
|
-
userId: string,
|
|
89
|
-
avatarHash: string | null,
|
|
90
|
-
options?: CdnUrlOptions,
|
|
91
|
-
): string | null {
|
|
92
|
-
if (!avatarHash) return null;
|
|
93
|
-
const ext = getExtension(avatarHash, options);
|
|
94
|
-
const size = appendSize(options);
|
|
95
|
-
return `${CDN_URL}/guilds/${guildId}/users/${userId}/avatars/${avatarHash}.${ext}${size}`;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Build a guild member banner URL (guild-specific banner).
|
|
100
|
-
* @param guildId - The guild ID
|
|
101
|
-
* @param userId - The user ID
|
|
102
|
-
* @param bannerHash - The member banner hash, or null
|
|
103
|
-
* @param options - Optional size and extension
|
|
104
|
-
* @returns The member banner URL, or null if no guild banner
|
|
105
|
-
*/
|
|
106
|
-
export function cdnMemberBannerURL(
|
|
107
|
-
guildId: string,
|
|
108
|
-
userId: string,
|
|
109
|
-
bannerHash: string | null,
|
|
110
|
-
options?: CdnUrlOptions,
|
|
111
|
-
): string | null {
|
|
112
|
-
if (!bannerHash) return null;
|
|
113
|
-
const ext = getExtension(bannerHash, options);
|
|
114
|
-
const size = appendSize(options);
|
|
115
|
-
return `${CDN_URL}/guilds/${guildId}/users/${userId}/banners/${bannerHash}.${ext}${size}`;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Get the default avatar URL (used when user has no custom avatar).
|
|
120
|
-
* Fluxer uses fluxerstatic.com with index = userId % 6 (six default avatar variants).
|
|
121
|
-
* @param userIdOrIndex - User ID (snowflake string) to derive index, or explicit index 0-5
|
|
122
|
-
* @returns The default avatar URL
|
|
123
|
-
*/
|
|
124
|
-
export function cdnDefaultAvatarURL(userIdOrIndex: string | number): string {
|
|
125
|
-
const index =
|
|
126
|
-
typeof userIdOrIndex === 'string'
|
|
127
|
-
? Number(BigInt(userIdOrIndex) % 6n)
|
|
128
|
-
: Math.abs(Math.floor(userIdOrIndex) % 6);
|
|
129
|
-
return `${STATIC_CDN_URL}/avatars/${index}.png`;
|
|
130
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { APIGuild, APIRole } from '@erinjs/types';
|
|
2
|
-
|
|
3
|
-
/** Guild payload shape from Fluxer gateway (GUILD_CREATE, GUILD_UPDATE, READY). */
|
|
4
|
-
type GatewayGuildPayload =
|
|
5
|
-
| APIGuild
|
|
6
|
-
| {
|
|
7
|
-
id: string;
|
|
8
|
-
properties?: Record<string, unknown>;
|
|
9
|
-
roles?: APIRole[] | unknown;
|
|
10
|
-
[key: string]: unknown;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Normalize gateway guild payload to APIGuild shape.
|
|
15
|
-
* Fluxer gateway may send { id, properties: { owner_id, ... }, roles } instead of flat APIGuild.
|
|
16
|
-
* @param raw - Raw guild data from gateway (accepts unknown for gateway payloads)
|
|
17
|
-
* @returns Normalized APIGuild with roles, or null if raw is null/undefined
|
|
18
|
-
*/
|
|
19
|
-
export function normalizeGuildPayload(
|
|
20
|
-
raw: GatewayGuildPayload | null | undefined | unknown,
|
|
21
|
-
): (APIGuild & { roles?: APIRole[] }) | null {
|
|
22
|
-
if (!raw || typeof raw !== 'object') {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
if ('properties' in raw && raw.properties != null && typeof raw.properties === 'object') {
|
|
26
|
-
const r = raw as { properties: Record<string, unknown>; roles?: APIRole[] | unknown };
|
|
27
|
-
return {
|
|
28
|
-
...r.properties,
|
|
29
|
-
roles: r.roles as APIRole[] | undefined,
|
|
30
|
-
} as APIGuild & { roles?: APIRole[] };
|
|
31
|
-
}
|
|
32
|
-
return raw as APIGuild & { roles?: APIRole[] };
|
|
33
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { Message } from '../';
|
|
3
|
-
import { EmbedBuilder } from '@erinjs/builders';
|
|
4
|
-
|
|
5
|
-
describe('Message._createMessageBody', () => {
|
|
6
|
-
it('converts string to content-only body', async () => {
|
|
7
|
-
const result = await Message._createMessageBody('Hello world');
|
|
8
|
-
expect(result.body).toEqual({ content: 'Hello world' });
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it('passes through content from options', async () => {
|
|
12
|
-
const result = await Message._createMessageBody({ content: 'Test' });
|
|
13
|
-
expect(result.body.content).toBe('Test');
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('serializes EmbedBuilder to APIEmbed', async () => {
|
|
17
|
-
const embed = new EmbedBuilder().setTitle('Test').setDescription('Desc');
|
|
18
|
-
const result = await Message._createMessageBody({ embeds: [embed] });
|
|
19
|
-
expect(result.body.embeds).toHaveLength(1);
|
|
20
|
-
expect(result.body.embeds![0]).toEqual(embed.toJSON());
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('passes through raw APIEmbed', async () => {
|
|
24
|
-
const raw = { title: 'Raw', type: 'rich' as const };
|
|
25
|
-
const result = await Message._createMessageBody({ embeds: [raw] });
|
|
26
|
-
expect(result.body.embeds).toHaveLength(1);
|
|
27
|
-
expect(result.body.embeds![0]).toBe(raw);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('builds attachments from files when no attachments metadata', async () => {
|
|
31
|
-
const result = await Message._createMessageBody({
|
|
32
|
-
files: [
|
|
33
|
-
{ name: 'a.txt', data: new Uint8Array() },
|
|
34
|
-
{ name: 'b.png', data: new Uint8Array(), filename: 'custom.png' },
|
|
35
|
-
],
|
|
36
|
-
});
|
|
37
|
-
expect(result.body.attachments).toEqual([
|
|
38
|
-
{ id: 0, filename: 'a.txt' },
|
|
39
|
-
{ id: 1, filename: 'custom.png' },
|
|
40
|
-
]);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('uses attachments metadata when provided with files', async () => {
|
|
44
|
-
const result = await Message._createMessageBody({
|
|
45
|
-
files: [{ name: 'a.txt', data: new Uint8Array() }],
|
|
46
|
-
attachments: [{ id: 0, filename: 'a.txt', title: 'My File', description: 'A file' }],
|
|
47
|
-
});
|
|
48
|
-
expect(result.body.attachments).toEqual([
|
|
49
|
-
{ id: 0, filename: 'a.txt', title: 'My File', description: 'A file' },
|
|
50
|
-
]);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('includes flags in attachment metadata', async () => {
|
|
54
|
-
const result = await Message._createMessageBody({
|
|
55
|
-
files: [{ name: 'a.txt', data: new Uint8Array() }],
|
|
56
|
-
attachments: [{ id: 0, filename: 'a.txt', flags: 8 }],
|
|
57
|
-
});
|
|
58
|
-
expect(result.body.attachments![0].flags).toBe(8);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('returns empty result when no content, embeds, or files', async () => {
|
|
62
|
-
const result = await Message._createMessageBody({});
|
|
63
|
-
expect(result.body).toEqual({});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('handles mixed EmbedBuilder and raw embed', async () => {
|
|
67
|
-
const raw = { title: 'Raw', type: 'rich' as const };
|
|
68
|
-
const built = new EmbedBuilder().setTitle('Built').setDescription('D');
|
|
69
|
-
const result = await Message._createMessageBody({ embeds: [raw, built] });
|
|
70
|
-
expect(result.body.embeds).toHaveLength(2);
|
|
71
|
-
expect(result.body.embeds![0]).toBe(raw);
|
|
72
|
-
expect(result.body.embeds![1]).toEqual(built.toJSON());
|
|
73
|
-
});
|
|
74
|
-
});
|