From d0915ba882f0cbb6f338f703ba585c5e9d871646 Mon Sep 17 00:00:00 2001 From: MARCROCK22 <57925328+MARCROCK22@users.noreply.github.com> Date: Sat, 9 Mar 2024 15:49:41 -0400 Subject: [PATCH] the ultimate framework --- .editorconfig | 6 +- .gitignore | 62 +- .husky/pre-commit | 4 + .swcrc | 30 + .vscode/extensions.json | 8 + .vscode/settings.json | 3 + README.md | 99 +- assets/icon.png | Bin 39216 -> 307775 bytes assets/icon.svg | 418 ++- biome.json | 70 +- bun.lockb | Bin 152560 -> 0 bytes package-lock.json | 2688 +++++++++++++++++ package.json | 142 +- packages/common/CHANGELOG.md | 31 - packages/common/README.md | 20 - packages/common/package.json | 75 - packages/common/src/Collection.ts | 165 - packages/common/src/Constants.ts | 20 - packages/common/src/Logger.ts | 128 - packages/common/src/Types.ts | 46 - packages/common/src/index.ts | 6 - packages/common/tsconfig.json | 7 - packages/common/tsup.config.ts | 12 - packages/core/CHANGELOG.md | 171 -- packages/core/README.md | 46 - packages/core/package.json | 78 - packages/core/src/events/handler.ts | 17 - packages/core/src/index.ts | 6 - .../core/src/managers/ApplicationManager.ts | 121 - packages/core/src/managers/ChannelManager.ts | 214 -- packages/core/src/managers/GuildManager.ts | 348 --- .../core/src/managers/InteractionManager.ts | 57 - packages/core/src/managers/MainManager.ts | 28 - packages/core/src/managers/MemberManager.ts | 19 - packages/core/src/managers/UserManager.ts | 64 - packages/core/src/managers/WebhookManager.ts | 124 - packages/core/src/session.ts | 121 - packages/core/src/utils/types.ts | 18 - packages/core/src/utils/utils.ts | 60 - packages/core/tsconfig.json | 7 - packages/core/tsup.config.ts | 12 - packages/helpers/CHANGELOG.md | 52 - packages/helpers/README.md | 21 - packages/helpers/package.json | 76 - packages/helpers/src/Collector.ts | 79 - packages/helpers/src/MessageEmbed.ts | 62 - packages/helpers/src/Permissions.ts | 132 - packages/helpers/src/Utils.ts | 42 - .../commands/contextMenu/ContextCommand.ts | 43 - packages/helpers/src/commands/index.ts | 3 - .../src/commands/slash/SlashCommand.ts | 53 - .../src/commands/slash/SlashCommandOption.ts | 340 --- packages/helpers/src/components/ActionRow.ts | 28 - .../helpers/src/components/BaseComponent.ts | 9 - .../helpers/src/components/MessageButton.ts | 49 - packages/helpers/src/components/SelectMenu.ts | 118 - packages/helpers/src/components/TextInput.ts | 45 - packages/helpers/src/components/index.ts | 5 - packages/helpers/src/index.ts | 5 - packages/helpers/tsconfig.json | 7 - packages/helpers/tsup.config.ts | 12 - packages/rest/CHANGELOG.md | 113 - packages/rest/README.md | 65 - packages/rest/package.json | 74 - packages/rest/src/CDN.ts | 68 - packages/rest/src/REST.ts | 83 - packages/rest/src/Router.ts | 64 - packages/rest/src/Routes/applications.ts | 89 - packages/rest/src/Routes/channels.ts | 218 -- packages/rest/src/Routes/gateway.ts | 12 - packages/rest/src/Routes/guilds.ts | 381 --- packages/rest/src/Routes/index.ts | 23 - packages/rest/src/Routes/interactions.ts | 15 - packages/rest/src/Routes/invites.ts | 10 - packages/rest/src/Routes/stage-instances.ts | 21 - packages/rest/src/Routes/stickers.ts | 12 - packages/rest/src/Routes/users.ts | 53 - packages/rest/src/Routes/voice.ts | 11 - packages/rest/src/Routes/webhooks.ts | 61 - packages/rest/src/index.ts | 5 - packages/rest/tsconfig.json | 7 - packages/rest/tsup.config.ts | 12 - packages/ws/CHANGELOG.md | 149 - packages/ws/README.md | 56 - packages/ws/package.json | 82 - packages/ws/src/SharedTypes.ts | 204 -- packages/ws/src/constants/index.ts | 40 - packages/ws/src/discord/shard.ts | 302 -- packages/ws/src/discord/sharder.ts | 161 - packages/ws/src/discord/shared.ts | 83 - packages/ws/src/structures/index.ts | 343 --- packages/ws/src/structures/timeout.ts | 28 - packages/ws/tsconfig.json | 9 - packages/ws/tsup.config.ts | 12 - renovate.json | 6 - src/api/CDN.ts | 328 ++ src/api/README.md | 13 + src/api/Router.ts | 64 + src/api/Routes/applications.ts | 105 + src/api/Routes/cdn.ts | 68 + src/api/Routes/channels.ts | 269 ++ src/api/Routes/gateway.ts | 12 + src/api/Routes/guilds.ts | 454 +++ src/api/Routes/index.ts | 25 + src/api/Routes/interactions.ts | 19 + src/api/Routes/invites.ts | 10 + src/api/Routes/stage-instances.ts | 27 + src/api/Routes/stickers.ts | 12 + src/api/Routes/users.ts | 67 + src/api/Routes/voice.ts | 11 + src/api/Routes/webhooks.ts | 81 + src/api/api.ts | 405 +++ src/api/bucket.ts | 78 + src/api/index.ts | 5 + src/api/shared.ts | 37 + src/api/utils/constants.ts | 13 + src/api/utils/types.ts | 17 + src/api/utils/utils.ts | 19 + src/builders/ActionRow.ts | 68 + src/builders/Attachment.ts | 254 ++ src/builders/Base.ts | 13 + src/builders/Button.ts | 110 + src/builders/Embed.ts | 175 ++ src/builders/Modal.ts | 179 ++ src/builders/SelectMenu.ts | 368 +++ src/builders/index.ts | 52 + src/builders/types.ts | 27 + src/cache/adapters/default.ts | 150 + src/cache/adapters/index.ts | 4 + src/cache/adapters/redis.ts | 245 ++ src/cache/adapters/types.ts | 39 + src/cache/adapters/workeradapter.ts | 97 + src/cache/index.ts | 554 ++++ src/cache/resources/channels.ts | 32 + src/cache/resources/default/base.ts | 95 + src/cache/resources/default/guild-based.ts | 140 + src/cache/resources/default/guild-related.ts | 154 + src/cache/resources/emojis.ts | 26 + src/cache/resources/guilds.ts | 191 ++ src/cache/resources/members.ts | 64 + src/cache/resources/overwrites.ts | 58 + src/cache/resources/presence.ts | 15 + src/cache/resources/roles.ts | 26 + src/cache/resources/stage-instances.ts | 6 + src/cache/resources/stickers.ts | 26 + src/cache/resources/threads.ts | 26 + src/cache/resources/users.ts | 22 + src/cache/resources/voice-states.ts | 13 + src/client/base.ts | 299 ++ src/client/client.ts | 196 ++ src/client/httpclient.ts | 177 ++ src/client/index.ts | 4 + src/client/oninteractioncreate.ts | 220 ++ src/client/onmessagecreate.ts | 379 +++ src/client/workerclient.ts | 272 ++ src/collection.ts | 411 +++ src/commands/applications/chat.ts | 345 +++ src/commands/applications/chatcontext.ts | 188 ++ src/commands/applications/menu.ts | 116 + src/commands/applications/menucontext.ts | 159 + src/commands/applications/options.ts | 99 + src/commands/applications/shared.ts | 46 + src/commands/decorators.ts | 154 + src/commands/handler.ts | 190 ++ src/commands/index.ts | 9 + src/commands/optionresolver.ts | 209 ++ src/common/bot/watcher.ts | 137 + src/common/index.ts | 15 + .../src/Util.ts => src/common/it/colors.ts | 259 +- src/common/it/constants.ts | 38 + src/common/it/logger.ts | 269 ++ src/common/it/utils.ts | 268 ++ src/common/shorters/base.ts | 5 + src/common/shorters/channels.ts | 185 ++ src/common/shorters/guilds.ts | 425 +++ src/common/shorters/members.ts | 200 ++ src/common/shorters/messages.ts | 136 + src/common/shorters/roles.ts | 61 + src/common/shorters/templates.ts | 27 + src/common/shorters/users.ts | 39 + src/common/shorters/webhook.ts | 87 + src/common/types/options.ts | 9 + src/common/types/resolvables.ts | 8 + src/common/types/util.ts | 184 ++ src/common/types/write.ts | 71 + src/components/ActionRow.ts | 18 + src/components/ButtonComponent.ts | 41 + src/components/ChannelSelectMenuComponent.ts | 12 + .../MentionableSelectMenuComponent.ts | 4 + src/components/RoleSelectMenuComponent.ts | 4 + src/components/StringSelectMenuComponent.ts | 12 + src/components/TextInputComponent.ts | 14 + src/components/UserSelectMenuComponent.ts | 4 + src/components/command.ts | 28 + src/components/handler.ts | 283 ++ src/components/index.ts | 55 + src/components/listener.ts | 15 + src/events/event.ts | 26 + src/events/handler.ts | 121 + src/events/hooks/application_command.ts | 10 + src/events/hooks/auto_moderation.ts | 28 + src/events/hooks/channel.ts | 30 + src/events/hooks/custom.ts | 10 + src/events/hooks/dispatch.ts | 15 + src/events/hooks/entitlement.ts | 14 + src/events/hooks/guild.ts | 138 + src/events/hooks/index.ts | 25 + src/events/hooks/integration.ts | 34 + src/events/hooks/interactions.ts | 7 + src/events/hooks/invite.ts | 12 + src/events/hooks/message.ts | 57 + src/events/hooks/presence.ts | 8 + src/events/hooks/stage.ts | 16 + src/events/hooks/thread.ts | 35 + src/events/hooks/typing.ts | 14 + src/events/hooks/user.ts | 7 + src/events/hooks/voice.ts | 17 + src/events/hooks/webhook.ts | 7 + src/events/index.ts | 2 + src/index.ts | 101 + src/langs/handler.ts | 41 + src/langs/index.ts | 2 + src/langs/router.ts | 54 + src/structures/AnonymousGuild.ts | 7 + src/structures/AutoModerationRule.ts | 48 + src/structures/ClientUser.ts | 24 + src/structures/Guild.ts | 84 + src/structures/GuildEmoji.ts | 66 + src/structures/GuildMember.ts | 224 ++ src/structures/GuildPreview.ts | 13 + src/structures/GuildRole.ts | 50 + src/structures/GuildTemplate.ts | 50 + src/structures/Interaction.ts | 662 ++++ src/structures/Message.ts | 178 ++ src/structures/Sticker.ts | 59 + src/structures/User.ts | 48 + src/structures/Webhook.ts | 99 + src/structures/channels.ts | 552 ++++ src/structures/extra/Base.ts | 43 + src/structures/extra/BaseComponent.ts | 13 + src/structures/extra/BaseGuild.ts | 77 + .../extra/BaseSelectMenuComponent.ts | 23 + src/structures/extra/BitField.ts | 94 + src/structures/extra/DiscordBase.ts | 30 + src/structures/extra/Permissions.ts | 18 + src/structures/extra/functions.ts | 68 + src/structures/index.ts | 15 + src/websocket/SharedTypes.ts | 219 ++ src/websocket/constants/index.ts | 48 + src/websocket/discord/basesocket.ts | 38 + src/websocket/discord/events/memberUpdate.ts | 58 + .../discord/events/presenceUpdate.ts | 69 + .../ws/src => src/websocket}/discord/index.ts | 1 + src/websocket/discord/shard.ts | 341 +++ src/websocket/discord/sharder.ts | 196 ++ src/websocket/discord/shared.ts | 118 + src/websocket/discord/worker.ts | 59 + src/websocket/discord/workermanager.ts | 364 +++ {packages/ws/src => src/websocket}/index.ts | 0 src/websocket/structures/index.ts | 343 +++ src/websocket/structures/timeout.ts | 70 + tsconfig.build.json | 28 - tsconfig.json | 42 +- turbo.json | 35 - 264 files changed, 20156 insertions(+), 6607 deletions(-) create mode 100644 .husky/pre-commit create mode 100644 .swcrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json delete mode 100755 bun.lockb create mode 100644 package-lock.json delete mode 100644 packages/common/CHANGELOG.md delete mode 100644 packages/common/README.md delete mode 100644 packages/common/package.json delete mode 100644 packages/common/src/Collection.ts delete mode 100644 packages/common/src/Constants.ts delete mode 100644 packages/common/src/Logger.ts delete mode 100644 packages/common/src/Types.ts delete mode 100644 packages/common/src/index.ts delete mode 100644 packages/common/tsconfig.json delete mode 100644 packages/common/tsup.config.ts delete mode 100644 packages/core/CHANGELOG.md delete mode 100644 packages/core/README.md delete mode 100644 packages/core/package.json delete mode 100644 packages/core/src/events/handler.ts delete mode 100644 packages/core/src/index.ts delete mode 100644 packages/core/src/managers/ApplicationManager.ts delete mode 100644 packages/core/src/managers/ChannelManager.ts delete mode 100644 packages/core/src/managers/GuildManager.ts delete mode 100644 packages/core/src/managers/InteractionManager.ts delete mode 100644 packages/core/src/managers/MainManager.ts delete mode 100644 packages/core/src/managers/MemberManager.ts delete mode 100644 packages/core/src/managers/UserManager.ts delete mode 100644 packages/core/src/managers/WebhookManager.ts delete mode 100644 packages/core/src/session.ts delete mode 100644 packages/core/src/utils/types.ts delete mode 100644 packages/core/src/utils/utils.ts delete mode 100644 packages/core/tsconfig.json delete mode 100644 packages/core/tsup.config.ts delete mode 100644 packages/helpers/CHANGELOG.md delete mode 100644 packages/helpers/README.md delete mode 100644 packages/helpers/package.json delete mode 100644 packages/helpers/src/Collector.ts delete mode 100644 packages/helpers/src/MessageEmbed.ts delete mode 100644 packages/helpers/src/Permissions.ts delete mode 100644 packages/helpers/src/Utils.ts delete mode 100644 packages/helpers/src/commands/contextMenu/ContextCommand.ts delete mode 100644 packages/helpers/src/commands/index.ts delete mode 100644 packages/helpers/src/commands/slash/SlashCommand.ts delete mode 100644 packages/helpers/src/commands/slash/SlashCommandOption.ts delete mode 100644 packages/helpers/src/components/ActionRow.ts delete mode 100644 packages/helpers/src/components/BaseComponent.ts delete mode 100644 packages/helpers/src/components/MessageButton.ts delete mode 100644 packages/helpers/src/components/SelectMenu.ts delete mode 100644 packages/helpers/src/components/TextInput.ts delete mode 100644 packages/helpers/src/components/index.ts delete mode 100644 packages/helpers/src/index.ts delete mode 100644 packages/helpers/tsconfig.json delete mode 100644 packages/helpers/tsup.config.ts delete mode 100644 packages/rest/CHANGELOG.md delete mode 100644 packages/rest/README.md delete mode 100644 packages/rest/package.json delete mode 100644 packages/rest/src/CDN.ts delete mode 100644 packages/rest/src/REST.ts delete mode 100644 packages/rest/src/Router.ts delete mode 100644 packages/rest/src/Routes/applications.ts delete mode 100644 packages/rest/src/Routes/channels.ts delete mode 100644 packages/rest/src/Routes/gateway.ts delete mode 100644 packages/rest/src/Routes/guilds.ts delete mode 100644 packages/rest/src/Routes/index.ts delete mode 100644 packages/rest/src/Routes/interactions.ts delete mode 100644 packages/rest/src/Routes/invites.ts delete mode 100644 packages/rest/src/Routes/stage-instances.ts delete mode 100644 packages/rest/src/Routes/stickers.ts delete mode 100644 packages/rest/src/Routes/users.ts delete mode 100644 packages/rest/src/Routes/voice.ts delete mode 100644 packages/rest/src/Routes/webhooks.ts delete mode 100644 packages/rest/src/index.ts delete mode 100644 packages/rest/tsconfig.json delete mode 100644 packages/rest/tsup.config.ts delete mode 100644 packages/ws/CHANGELOG.md delete mode 100644 packages/ws/README.md delete mode 100644 packages/ws/package.json delete mode 100644 packages/ws/src/SharedTypes.ts delete mode 100644 packages/ws/src/constants/index.ts delete mode 100644 packages/ws/src/discord/shard.ts delete mode 100644 packages/ws/src/discord/sharder.ts delete mode 100644 packages/ws/src/discord/shared.ts delete mode 100644 packages/ws/src/structures/index.ts delete mode 100644 packages/ws/src/structures/timeout.ts delete mode 100644 packages/ws/tsconfig.json delete mode 100644 packages/ws/tsup.config.ts delete mode 100644 renovate.json create mode 100644 src/api/CDN.ts create mode 100644 src/api/README.md create mode 100644 src/api/Router.ts create mode 100644 src/api/Routes/applications.ts create mode 100644 src/api/Routes/cdn.ts create mode 100644 src/api/Routes/channels.ts create mode 100644 src/api/Routes/gateway.ts create mode 100644 src/api/Routes/guilds.ts create mode 100644 src/api/Routes/index.ts create mode 100644 src/api/Routes/interactions.ts create mode 100644 src/api/Routes/invites.ts create mode 100644 src/api/Routes/stage-instances.ts create mode 100644 src/api/Routes/stickers.ts create mode 100644 src/api/Routes/users.ts create mode 100644 src/api/Routes/voice.ts create mode 100644 src/api/Routes/webhooks.ts create mode 100644 src/api/api.ts create mode 100644 src/api/bucket.ts create mode 100644 src/api/index.ts create mode 100644 src/api/shared.ts create mode 100644 src/api/utils/constants.ts create mode 100644 src/api/utils/types.ts create mode 100644 src/api/utils/utils.ts create mode 100644 src/builders/ActionRow.ts create mode 100644 src/builders/Attachment.ts create mode 100644 src/builders/Base.ts create mode 100644 src/builders/Button.ts create mode 100644 src/builders/Embed.ts create mode 100644 src/builders/Modal.ts create mode 100644 src/builders/SelectMenu.ts create mode 100644 src/builders/index.ts create mode 100644 src/builders/types.ts create mode 100644 src/cache/adapters/default.ts create mode 100644 src/cache/adapters/index.ts create mode 100644 src/cache/adapters/redis.ts create mode 100644 src/cache/adapters/types.ts create mode 100644 src/cache/adapters/workeradapter.ts create mode 100644 src/cache/index.ts create mode 100644 src/cache/resources/channels.ts create mode 100644 src/cache/resources/default/base.ts create mode 100644 src/cache/resources/default/guild-based.ts create mode 100644 src/cache/resources/default/guild-related.ts create mode 100644 src/cache/resources/emojis.ts create mode 100644 src/cache/resources/guilds.ts create mode 100644 src/cache/resources/members.ts create mode 100644 src/cache/resources/overwrites.ts create mode 100644 src/cache/resources/presence.ts create mode 100644 src/cache/resources/roles.ts create mode 100644 src/cache/resources/stage-instances.ts create mode 100644 src/cache/resources/stickers.ts create mode 100644 src/cache/resources/threads.ts create mode 100644 src/cache/resources/users.ts create mode 100644 src/cache/resources/voice-states.ts create mode 100644 src/client/base.ts create mode 100644 src/client/client.ts create mode 100644 src/client/httpclient.ts create mode 100644 src/client/index.ts create mode 100644 src/client/oninteractioncreate.ts create mode 100644 src/client/onmessagecreate.ts create mode 100644 src/client/workerclient.ts create mode 100644 src/collection.ts create mode 100644 src/commands/applications/chat.ts create mode 100644 src/commands/applications/chatcontext.ts create mode 100644 src/commands/applications/menu.ts create mode 100644 src/commands/applications/menucontext.ts create mode 100644 src/commands/applications/options.ts create mode 100644 src/commands/applications/shared.ts create mode 100644 src/commands/decorators.ts create mode 100644 src/commands/handler.ts create mode 100644 src/commands/index.ts create mode 100644 src/commands/optionresolver.ts create mode 100644 src/common/bot/watcher.ts create mode 100644 src/common/index.ts rename packages/common/src/Util.ts => src/common/it/colors.ts (58%) create mode 100644 src/common/it/constants.ts create mode 100644 src/common/it/logger.ts create mode 100644 src/common/it/utils.ts create mode 100644 src/common/shorters/base.ts create mode 100644 src/common/shorters/channels.ts create mode 100644 src/common/shorters/guilds.ts create mode 100644 src/common/shorters/members.ts create mode 100644 src/common/shorters/messages.ts create mode 100644 src/common/shorters/roles.ts create mode 100644 src/common/shorters/templates.ts create mode 100644 src/common/shorters/users.ts create mode 100644 src/common/shorters/webhook.ts create mode 100644 src/common/types/options.ts create mode 100644 src/common/types/resolvables.ts create mode 100644 src/common/types/util.ts create mode 100644 src/common/types/write.ts create mode 100644 src/components/ActionRow.ts create mode 100644 src/components/ButtonComponent.ts create mode 100644 src/components/ChannelSelectMenuComponent.ts create mode 100644 src/components/MentionableSelectMenuComponent.ts create mode 100644 src/components/RoleSelectMenuComponent.ts create mode 100644 src/components/StringSelectMenuComponent.ts create mode 100644 src/components/TextInputComponent.ts create mode 100644 src/components/UserSelectMenuComponent.ts create mode 100644 src/components/command.ts create mode 100644 src/components/handler.ts create mode 100644 src/components/index.ts create mode 100644 src/components/listener.ts create mode 100644 src/events/event.ts create mode 100644 src/events/handler.ts create mode 100644 src/events/hooks/application_command.ts create mode 100644 src/events/hooks/auto_moderation.ts create mode 100644 src/events/hooks/channel.ts create mode 100644 src/events/hooks/custom.ts create mode 100644 src/events/hooks/dispatch.ts create mode 100644 src/events/hooks/entitlement.ts create mode 100644 src/events/hooks/guild.ts create mode 100644 src/events/hooks/index.ts create mode 100644 src/events/hooks/integration.ts create mode 100644 src/events/hooks/interactions.ts create mode 100644 src/events/hooks/invite.ts create mode 100644 src/events/hooks/message.ts create mode 100644 src/events/hooks/presence.ts create mode 100644 src/events/hooks/stage.ts create mode 100644 src/events/hooks/thread.ts create mode 100644 src/events/hooks/typing.ts create mode 100644 src/events/hooks/user.ts create mode 100644 src/events/hooks/voice.ts create mode 100644 src/events/hooks/webhook.ts create mode 100644 src/events/index.ts create mode 100644 src/index.ts create mode 100644 src/langs/handler.ts create mode 100644 src/langs/index.ts create mode 100644 src/langs/router.ts create mode 100644 src/structures/AnonymousGuild.ts create mode 100644 src/structures/AutoModerationRule.ts create mode 100644 src/structures/ClientUser.ts create mode 100644 src/structures/Guild.ts create mode 100644 src/structures/GuildEmoji.ts create mode 100644 src/structures/GuildMember.ts create mode 100644 src/structures/GuildPreview.ts create mode 100644 src/structures/GuildRole.ts create mode 100644 src/structures/GuildTemplate.ts create mode 100644 src/structures/Interaction.ts create mode 100644 src/structures/Message.ts create mode 100644 src/structures/Sticker.ts create mode 100644 src/structures/User.ts create mode 100644 src/structures/Webhook.ts create mode 100644 src/structures/channels.ts create mode 100644 src/structures/extra/Base.ts create mode 100644 src/structures/extra/BaseComponent.ts create mode 100644 src/structures/extra/BaseGuild.ts create mode 100644 src/structures/extra/BaseSelectMenuComponent.ts create mode 100644 src/structures/extra/BitField.ts create mode 100644 src/structures/extra/DiscordBase.ts create mode 100644 src/structures/extra/Permissions.ts create mode 100644 src/structures/extra/functions.ts create mode 100644 src/structures/index.ts create mode 100644 src/websocket/SharedTypes.ts create mode 100644 src/websocket/constants/index.ts create mode 100644 src/websocket/discord/basesocket.ts create mode 100644 src/websocket/discord/events/memberUpdate.ts create mode 100644 src/websocket/discord/events/presenceUpdate.ts rename {packages/ws/src => src/websocket}/discord/index.ts (70%) create mode 100644 src/websocket/discord/shard.ts create mode 100644 src/websocket/discord/sharder.ts create mode 100644 src/websocket/discord/shared.ts create mode 100644 src/websocket/discord/worker.ts create mode 100644 src/websocket/discord/workermanager.ts rename {packages/ws/src => src/websocket}/index.ts (100%) create mode 100644 src/websocket/structures/index.ts create mode 100644 src/websocket/structures/timeout.ts delete mode 100644 tsconfig.build.json delete mode 100644 turbo.json diff --git a/.editorconfig b/.editorconfig index 916e2e5..64f36f6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,9 +5,9 @@ charset = utf-8 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true -indent_style = space -indent_size = 2 +indent_style = tab +indent_size = 4 quote_type = single [Makefile] -indent_style = space +indent_style = tab diff --git a/.gitignore b/.gitignore index ece695a..656d096 100644 --- a/.gitignore +++ b/.gitignore @@ -1,63 +1,5 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -package-lock.json - -# Eater asked for this dunno why -bot/ -apps/ - -# Enviorment -.env - -# bun -bun-test.js - -# NPM -npm/ - -# DOCS -docs.json -packages/core/docs.json - -# dependencies +pnpm-lock.yaml node_modules -.pnp -.pnp.js -.vscode - -# testing -coverage - -# node -out/ +lib/ dist/ -build -package-lock.json - -# misc -.DS_Store -*.pem -*.vs - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local -.env - -# turbo -.turbo - -# tests -__tests__ __test__ - -# changeset -.changeset diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..0312b76 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged \ No newline at end of file diff --git a/.swcrc b/.swcrc new file mode 100644 index 0000000..c656cc0 --- /dev/null +++ b/.swcrc @@ -0,0 +1,30 @@ +{ + "sourceMaps": false, + "module": { + "type": "commonjs", + "strictMode": true, + "noInterop": false + }, + "jsc": { + "externalHelpers": false, + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "decorators": true, + "dynamicImport": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true, + "react": { + "throwIfNamespace": false, + "useBuiltins": false, + "pragma": "React.createElement", + "pragmaFrag": "React.Fragment", + "importSource": "react" + } + }, + "keepClassNames": true + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..70edba8 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "biomejs.biome", + "orta.vscode-twoslash-queries", + "eamodio.gitlens", + "yoavbls.pretty-ts-errors" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..00ad71f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules\\typescript\\lib" +} \ No newline at end of file diff --git a/README.md b/README.md index a4cee95..ef3b7d6 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,57 @@ -# biscuit +
-## A brand new bleeding edge non bloated Discord library + # **Seyfert** -biscuit + seyfert -## Install (for [node18](https://nodejs.org/en/download/)) + **A brand new bleeding edge non bloated Discord framework** -```sh-session -npm install @biscuitland/core -yarn add @biscuitland/core + [![License](https://img.shields.io/npm/l/seyfert?style=flat-square&logo=apache&color=white)](https://github.com/tiramisulabs/biscuit/blob/main/LICENSE) + [![Version](https://img.shields.io/npm/v/seyfert?color=%23ff0000&logo=npm&style=flat-square)](https://www.npmjs.com/package/seyfert) + [![Discord](https://img.shields.io/discord/1003825077969764412?color=%23406da2&label=support&logo=discord&style=flat-square)](https://discord.com/invite/XNw2RZFzaP) + +
+ +> [!WARNING] +> This readme is work in progress! + +# FAQ +## So, what is `seyfert`? +Seyfert is the ultimate Discord framework! With its highly efficient interaction with the Discord API, you can achieve anything you set your mind to. + +## Why I should use it? +Seyfert has a good scalability, strict types, smooth developing experience... + +> more questions soon... + +# User guide +## Installation +> [!NOTE] +> You **NEED** Node.js 18>= for this to work, also we recomended Node.js 20 LTS and Bun latest +```sh +pnpm add seyfert ``` -for further reading join our [Discord](https://discord.com/invite/XNw2RZFzaP) +> You may use your preferred package manager, for this example I am using PNPM since is more efficient. -## Most importantly, biscuit: -Stands apart from other libraries like Discord.js or Eris as it takes a conscious and dedicated approach, adhering strictly to [simplicity](https://en.wikipedia.org/wiki/Unix_philosophy). We have examined the features and functionalities that contribute to [bloat](https://en.wikipedia.org/wiki/Code_bloat) in libraries, intentionally removing unnecessary complexities we deliver a [minimalistic](https://en.wikipedia.org/wiki/Minimalism_(computing)) and efficient solution that includes only essential components for Discord API interaction, reducing the library's footprint and enabling scalability. - -High RAM usage in other libraries often arises due to unnecessary features and functionalities and suboptimal caching mechanisms tied to the core library. - -### Leveraging the power of meta programming -The Proxy object enables dynamic, flexible and efficient calls to the API, it is typesafe due to TypeScript wizardry, meta programming is not for the weak minded. - -## Why biscuit?: -- Remarkably minimal memory footprint -- Scalable -- Non feature-rich! - -## Example bot (TS/JS) +## Basic bot example ```ts -import { Session } from '@biscuitland/core'; -import { GatewayIntentBits, InteractionType, InteractionResponseType } from '@biscuitland/common'; +import { Client } from 'seyfert'; -const session = new Session({ - intents: GatewayIntentBits.Guilds, - token: 'your token goes here' -}); +const client = new Client(); -const commands = [ - { - name: 'ping', - description: 'Replies with pong!' - } -]; - -session.once('READY', (payload) => { - const username = payload.user.username; - console.log('Logged in as: %s', username); - session.managers.applications.bulkCommands(session.applicationId, commands); -}); - -session.on('INTERACTION_CREATE', (interaction) => { - if (interaction.type !== InteractionType.ApplicationCommand) return; - session.managers.interactions.reply(interaction.id, interaction.token, { - type: InteractionResponseType.ChannelMessageWithSource, - data: { content: 'pong!' } - }); -}); - -session.start(); +(async () => { + await client.start(); + await client.uploadCommands().catch(e => { + console.error(JSON.stringify(e, null, 2)) + process.exit(1) + }) +})(); ``` -## Links -* [Website](https://biscuitjs.com/) -* [Documentation](https://docs.biscuitjs.com/) -* [Discord](https://discord.gg/XNw2RZFzaP) -* [core](https://www.npmjs.com/package/@biscuitland/core) | [rest](https://www.npmjs.com/package/@biscuitland/rest) | [ws](https://www.npmjs.com/package/@biscuitland/ws) | [helpers](https://www.npmjs.com/package/@biscuitland/helpers) +# Useful links + +- [GitHub Repository](https://github.com/tiramisulabs/biscuit) +- [Discord server](https://discord.com/invite/XNw2RZFzaP) +- [npm - core](https://www.npmjs.com/package/seyfert) diff --git a/assets/icon.png b/assets/icon.png index f122d29aee59edfb1bc8709143c11f1188cf71c6..9eb27eadc64b98bb11efd2a0b8ce017d11170685 100644 GIT binary patch literal 307775 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