@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.
Files changed (389) hide show
  1. package/core/.changeset/README.md +8 -0
  2. package/core/.changeset/community-bootstrap-release.md +17 -0
  3. package/core/.changeset/config.json +11 -0
  4. package/core/.changeset/no-changelog.js +16 -0
  5. package/core/.changeset/pre.json +17 -0
  6. package/core/.editorconfig +13 -0
  7. package/core/.gitattributes +2 -0
  8. package/core/.github/CODE_OF_CONDUCT.md +23 -0
  9. package/core/.github/FUNDING.yml +7 -0
  10. package/core/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
  11. package/core/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  12. package/core/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  13. package/core/.github/dependabot.yml +16 -0
  14. package/core/.github/workflows/autoapp.yml +16 -0
  15. package/core/.github/workflows/ci.yml +187 -0
  16. package/core/.github/workflows/codeql.yml +30 -0
  17. package/core/.github/workflows/deploy-docs.yml +54 -0
  18. package/core/.github/workflows/publish.yml +43 -0
  19. package/core/.lintstagedrc.json +4 -0
  20. package/core/.nvmrc +1 -0
  21. package/core/.prettierignore +8 -0
  22. package/core/.prettierrc +11 -0
  23. package/core/CONTRIBUTING.md +70 -0
  24. package/core/LICENSE +203 -0
  25. package/core/README.md +61 -0
  26. package/core/SECURITY.md +21 -0
  27. package/core/apps/docs/index.html +28 -0
  28. package/core/apps/docs/middleware.ts +21 -0
  29. package/core/apps/docs/package.json +33 -0
  30. package/core/apps/docs/public/@flux.png +0 -0
  31. package/core/apps/docs/public/docs/latest/guides.json +1420 -0
  32. package/core/apps/docs/public/docs/latest/main.json +14981 -0
  33. package/core/apps/docs/public/docs/latest/rag-index.json +1 -0
  34. package/core/apps/docs/public/docs/v1.0.5/guides.json +226 -0
  35. package/core/apps/docs/public/docs/v1.0.5/main.json +7920 -0
  36. package/core/apps/docs/public/docs/v1.0.6/guides.json +226 -0
  37. package/core/apps/docs/public/docs/v1.0.6/main.json +7920 -0
  38. package/core/apps/docs/public/docs/v1.0.7/guides.json +259 -0
  39. package/core/apps/docs/public/docs/v1.0.7/main.json +8652 -0
  40. package/core/apps/docs/public/docs/v1.0.8/guides.json +313 -0
  41. package/core/apps/docs/public/docs/v1.0.8/main.json +9618 -0
  42. package/core/apps/docs/public/docs/v1.0.9/guides.json +319 -0
  43. package/core/apps/docs/public/docs/v1.0.9/main.json +10694 -0
  44. package/core/apps/docs/public/docs/v1.1.0/guides.json +589 -0
  45. package/core/apps/docs/public/docs/v1.1.0/main.json +12576 -0
  46. package/core/apps/docs/public/docs/v1.1.2/guides.json +650 -0
  47. package/core/apps/docs/public/docs/v1.1.2/main.json +13239 -0
  48. package/core/apps/docs/public/docs/v1.1.3/guides.json +650 -0
  49. package/core/apps/docs/public/docs/v1.1.3/main.json +13239 -0
  50. package/core/apps/docs/public/docs/v1.1.4/guides.json +708 -0
  51. package/core/apps/docs/public/docs/v1.1.4/main.json +13231 -0
  52. package/core/apps/docs/public/docs/v1.1.5/guides.json +1035 -0
  53. package/core/apps/docs/public/docs/v1.1.5/main.json +13838 -0
  54. package/core/apps/docs/public/docs/v1.1.6/guides.json +1041 -0
  55. package/core/apps/docs/public/docs/v1.1.6/main.json +14313 -0
  56. package/core/apps/docs/public/docs/v1.1.8/guides.json +1047 -0
  57. package/core/apps/docs/public/docs/v1.1.8/main.json +14421 -0
  58. package/core/apps/docs/public/docs/v1.1.9/guides.json +1047 -0
  59. package/core/apps/docs/public/docs/v1.1.9/main.json +14421 -0
  60. package/core/apps/docs/public/docs/v1.2.0/guides.json +1212 -0
  61. package/core/apps/docs/public/docs/v1.2.0/main.json +14663 -0
  62. package/core/apps/docs/public/docs/v1.2.1/guides.json +1293 -0
  63. package/core/apps/docs/public/docs/v1.2.1/main.json +14828 -0
  64. package/core/apps/docs/public/docs/v1.2.2/guides.json +1293 -0
  65. package/core/apps/docs/public/docs/v1.2.2/main.json +15025 -0
  66. package/core/apps/docs/public/docs/v1.2.3/guides.json +1420 -0
  67. package/core/apps/docs/public/docs/v1.2.3/main.json +14954 -0
  68. package/core/apps/docs/public/docs/v1.2.4/guides.json +1420 -0
  69. package/core/apps/docs/public/docs/v1.2.4/main.json +14981 -0
  70. package/core/apps/docs/public/docs/versions.json +24 -0
  71. package/core/apps/docs/public/flux.png +0 -0
  72. package/core/apps/docs/public/locales/en.json +50 -0
  73. package/core/apps/docs/public/locales/guides-en.json +512 -0
  74. package/core/apps/docs/public/robots.txt +4 -0
  75. package/core/apps/docs/public/sitemap.xml +33 -0
  76. package/core/apps/docs/src/App.vue +538 -0
  77. package/core/apps/docs/src/components/ApiCategorySection.vue +42 -0
  78. package/core/apps/docs/src/components/ApiDiscordCompat.vue +65 -0
  79. package/core/apps/docs/src/components/ApiEndpointCard.vue +313 -0
  80. package/core/apps/docs/src/components/ApiSchemaBlock.vue +131 -0
  81. package/core/apps/docs/src/components/CodeBlock.vue +177 -0
  82. package/core/apps/docs/src/components/CommunityCallout.vue +90 -0
  83. package/core/apps/docs/src/components/ConstructorSection.vue +82 -0
  84. package/core/apps/docs/src/components/DocDescription.vue +40 -0
  85. package/core/apps/docs/src/components/FluxerLogo.vue +3 -0
  86. package/core/apps/docs/src/components/Footer.vue +106 -0
  87. package/core/apps/docs/src/components/GuideCodeBlock.vue +102 -0
  88. package/core/apps/docs/src/components/GuideDiscordCompat.vue +77 -0
  89. package/core/apps/docs/src/components/GuideDiscordCompatCallout.vue +83 -0
  90. package/core/apps/docs/src/components/GuideTable.vue +77 -0
  91. package/core/apps/docs/src/components/GuideTip.vue +38 -0
  92. package/core/apps/docs/src/components/MethodsSection.vue +195 -0
  93. package/core/apps/docs/src/components/ParamsTable.vue +70 -0
  94. package/core/apps/docs/src/components/PropertiesSection.vue +143 -0
  95. package/core/apps/docs/src/components/SearchBar.vue +76 -0
  96. package/core/apps/docs/src/components/SearchModal.vue +361 -0
  97. package/core/apps/docs/src/components/SidebarNav.vue +225 -0
  98. package/core/apps/docs/src/components/SponsorBanner.vue +153 -0
  99. package/core/apps/docs/src/components/TypeSignature.vue +187 -0
  100. package/core/apps/docs/src/components/VersionPicker.vue +191 -0
  101. package/core/apps/docs/src/composables/useSearchIndex.ts +144 -0
  102. package/core/apps/docs/src/composables/useVersionedPath.ts +20 -0
  103. package/core/apps/docs/src/data/apiEndpoints.ts +1073 -0
  104. package/core/apps/docs/src/data/changelog.ts +717 -0
  105. package/core/apps/docs/src/data/guides.ts +2362 -0
  106. package/core/apps/docs/src/env.d.ts +7 -0
  107. package/core/apps/docs/src/locales/guides-en.json +512 -0
  108. package/core/apps/docs/src/main.ts +27 -0
  109. package/core/apps/docs/src/pages/ApiReferenceLayout.vue +175 -0
  110. package/core/apps/docs/src/pages/ApiReferencePage.vue +128 -0
  111. package/core/apps/docs/src/pages/Changelog.vue +288 -0
  112. package/core/apps/docs/src/pages/ClassPage.vue +319 -0
  113. package/core/apps/docs/src/pages/ClassesList.vue +100 -0
  114. package/core/apps/docs/src/pages/DocsLayout.vue +127 -0
  115. package/core/apps/docs/src/pages/GuidePage.vue +279 -0
  116. package/core/apps/docs/src/pages/GuidesIndex.vue +166 -0
  117. package/core/apps/docs/src/pages/GuidesLayout.vue +245 -0
  118. package/core/apps/docs/src/pages/Home.vue +125 -0
  119. package/core/apps/docs/src/pages/NotFound.vue +57 -0
  120. package/core/apps/docs/src/pages/TypedefPage.vue +230 -0
  121. package/core/apps/docs/src/pages/TypedefsList.vue +168 -0
  122. package/core/apps/docs/src/pages/VersionLayout.vue +15 -0
  123. package/core/apps/docs/src/router.ts +73 -0
  124. package/core/apps/docs/src/stores/docs.ts +54 -0
  125. package/core/apps/docs/src/stores/guides.ts +53 -0
  126. package/core/apps/docs/src/stores/version.ts +67 -0
  127. package/core/apps/docs/src/styles/main.css +278 -0
  128. package/core/apps/docs/src/styles/prism.css +95 -0
  129. package/core/apps/docs/src/types/doc-schema.ts +112 -0
  130. package/core/apps/docs/tsconfig.json +17 -0
  131. package/core/apps/docs/tsconfig.node.json +10 -0
  132. package/core/apps/docs/vite.config.d.ts +2 -0
  133. package/core/apps/docs/vite.config.js +26 -0
  134. package/core/apps/docs/vite.config.ts +28 -0
  135. package/core/apps/docs-vitepress/.vitepress/config.ts +141 -0
  136. package/core/apps/docs-vitepress/api-data/latest/main.json +15035 -0
  137. package/core/apps/docs-vitepress/api-data/v1.2.4/main.json +15035 -0
  138. package/core/apps/docs-vitepress/api-data/versions.json +6 -0
  139. package/core/apps/docs-vitepress/index.md +15 -0
  140. package/core/apps/docs-vitepress/package-lock.json +2924 -0
  141. package/core/apps/docs-vitepress/package.json +20 -0
  142. package/core/apps/docs-vitepress/public/CNAME +1 -0
  143. package/core/apps/docs-vitepress/scripts/generate-api.ts +243 -0
  144. package/core/apps/docs-vitepress/scripts/migrate-guides.ts +129 -0
  145. package/core/apps/docs-vitepress/tsconfig.json +11 -0
  146. package/core/apps/docs-vitepress/v/latest/guides/attachments-by-url.md +57 -0
  147. package/core/apps/docs-vitepress/v/latest/guides/attachments.md +62 -0
  148. package/core/apps/docs-vitepress/v/latest/guides/basic-bot.md +49 -0
  149. package/core/apps/docs-vitepress/v/latest/guides/channels.md +180 -0
  150. package/core/apps/docs-vitepress/v/latest/guides/deprecated-apis.md +58 -0
  151. package/core/apps/docs-vitepress/v/latest/guides/discord-js-compatibility.md +42 -0
  152. package/core/apps/docs-vitepress/v/latest/guides/editing-embeds.md +65 -0
  153. package/core/apps/docs-vitepress/v/latest/guides/embed-media.md +87 -0
  154. package/core/apps/docs-vitepress/v/latest/guides/embeds.md +166 -0
  155. package/core/apps/docs-vitepress/v/latest/guides/emojis.md +77 -0
  156. package/core/apps/docs-vitepress/v/latest/guides/events.md +202 -0
  157. package/core/apps/docs-vitepress/v/latest/guides/gifs.md +47 -0
  158. package/core/apps/docs-vitepress/v/latest/guides/installation.md +10 -0
  159. package/core/apps/docs-vitepress/v/latest/guides/moderation.md +89 -0
  160. package/core/apps/docs-vitepress/v/latest/guides/permissions.md +130 -0
  161. package/core/apps/docs-vitepress/v/latest/guides/prefix-commands.md +41 -0
  162. package/core/apps/docs-vitepress/v/latest/guides/profile-urls.md +58 -0
  163. package/core/apps/docs-vitepress/v/latest/guides/reactions.md +69 -0
  164. package/core/apps/docs-vitepress/v/latest/guides/roles.md +130 -0
  165. package/core/apps/docs-vitepress/v/latest/guides/sending-without-reply.md +172 -0
  166. package/core/apps/docs-vitepress/v/latest/guides/voice.md +109 -0
  167. package/core/apps/docs-vitepress/v/latest/guides/wait-for-guilds.md +37 -0
  168. package/core/apps/docs-vitepress/v/latest/guides/webhook-attachments-embeds.md +73 -0
  169. package/core/apps/docs-vitepress/v/latest/guides/webhooks.md +131 -0
  170. package/core/eslint.config.js +80 -0
  171. package/core/examples/.env.example +22 -0
  172. package/core/examples/README.md +68 -0
  173. package/core/examples/first-steps-bot.js +118 -0
  174. package/core/examples/minimal-bot.js +17 -0
  175. package/core/examples/moderation-bot.js +209 -0
  176. package/core/examples/package.json +14 -0
  177. package/core/examples/ping-bot.js +1146 -0
  178. package/core/examples/reaction-bot.js +70 -0
  179. package/core/examples/reaction-roles-bot.js +140 -0
  180. package/core/examples/webhook-bot.js +239 -0
  181. package/core/flux.png +0 -0
  182. package/core/package.json +78 -0
  183. package/core/packages/builders/package.json +51 -0
  184. package/core/packages/builders/src/index.ts +13 -0
  185. package/core/packages/builders/src/messages/AttachmentBuilder.test.ts +79 -0
  186. package/core/packages/builders/src/messages/AttachmentBuilder.ts +69 -0
  187. package/core/packages/builders/src/messages/EmbedBuilder.test.ts +266 -0
  188. package/core/packages/builders/src/messages/EmbedBuilder.ts +239 -0
  189. package/core/packages/builders/src/messages/MessagePayload.test.ts +118 -0
  190. package/core/packages/builders/src/messages/MessagePayload.ts +122 -0
  191. package/core/packages/builders/tsconfig.json +9 -0
  192. package/core/packages/builders/tsup.config.ts +9 -0
  193. package/core/packages/builders/vitest.config.ts +9 -0
  194. package/core/packages/collection/package.json +47 -0
  195. package/core/packages/collection/src/Collection.test.ts +232 -0
  196. package/core/packages/collection/src/Collection.ts +196 -0
  197. package/core/packages/collection/src/index.ts +1 -0
  198. package/core/packages/collection/tsconfig.json +9 -0
  199. package/core/packages/collection/tsup.config.ts +9 -0
  200. package/core/packages/collection/vitest.config.ts +9 -0
  201. package/core/packages/docgen/package.json +26 -0
  202. package/core/packages/docgen/src/extract.ts +262 -0
  203. package/core/packages/docgen/src/formatType.ts +24 -0
  204. package/core/packages/docgen/src/index.ts +103 -0
  205. package/core/packages/docgen/src/schema.ts +100 -0
  206. package/core/packages/docgen/src/visitor.ts +147 -0
  207. package/core/packages/docgen/tsconfig.json +9 -0
  208. package/core/packages/docgen/tsup.config.ts +9 -0
  209. package/core/packages/fluxer-core/README.md +26 -0
  210. package/core/packages/fluxer-core/package.json +60 -0
  211. package/core/packages/fluxer-core/src/client/ChannelManager.ts +143 -0
  212. package/core/packages/fluxer-core/src/client/Client.gateway.test.ts +84 -0
  213. package/core/packages/fluxer-core/src/client/Client.resolveEmoji.test.ts +45 -0
  214. package/core/packages/fluxer-core/src/client/Client.ts +558 -0
  215. package/core/packages/fluxer-core/src/client/ClientUser.ts +40 -0
  216. package/core/packages/fluxer-core/src/client/EventHandlerRegistry.ts +469 -0
  217. package/core/packages/fluxer-core/src/client/GuildManager.ts +79 -0
  218. package/core/packages/fluxer-core/src/client/GuildMemberManager.ts +91 -0
  219. package/core/packages/fluxer-core/src/client/MessageManager.ts +58 -0
  220. package/core/packages/fluxer-core/src/client/UsersManager.ts +122 -0
  221. package/core/packages/fluxer-core/src/errors/ErrorCodes.test.ts +19 -0
  222. package/core/packages/fluxer-core/src/errors/ErrorCodes.ts +12 -0
  223. package/core/packages/fluxer-core/src/errors/FluxerError.test.ts +32 -0
  224. package/core/packages/fluxer-core/src/errors/FluxerError.ts +15 -0
  225. package/core/packages/fluxer-core/src/index.ts +85 -0
  226. package/core/packages/fluxer-core/src/structures/Base.ts +7 -0
  227. package/core/packages/fluxer-core/src/structures/Channel.ts +508 -0
  228. package/core/packages/fluxer-core/src/structures/Guild.test.ts +189 -0
  229. package/core/packages/fluxer-core/src/structures/Guild.ts +734 -0
  230. package/core/packages/fluxer-core/src/structures/GuildBan.ts +35 -0
  231. package/core/packages/fluxer-core/src/structures/GuildEmoji.ts +57 -0
  232. package/core/packages/fluxer-core/src/structures/GuildMember.test.ts +203 -0
  233. package/core/packages/fluxer-core/src/structures/GuildMember.ts +213 -0
  234. package/core/packages/fluxer-core/src/structures/GuildMemberRoleManager.ts +121 -0
  235. package/core/packages/fluxer-core/src/structures/GuildSticker.ts +56 -0
  236. package/core/packages/fluxer-core/src/structures/Invite.test.ts +103 -0
  237. package/core/packages/fluxer-core/src/structures/Invite.ts +121 -0
  238. package/core/packages/fluxer-core/src/structures/Message.test.ts +109 -0
  239. package/core/packages/fluxer-core/src/structures/Message.ts +397 -0
  240. package/core/packages/fluxer-core/src/structures/MessageReaction.ts +72 -0
  241. package/core/packages/fluxer-core/src/structures/PartialMessage.ts +12 -0
  242. package/core/packages/fluxer-core/src/structures/Role.test.ts +77 -0
  243. package/core/packages/fluxer-core/src/structures/Role.ts +112 -0
  244. package/core/packages/fluxer-core/src/structures/User.test.ts +110 -0
  245. package/core/packages/fluxer-core/src/structures/User.ts +109 -0
  246. package/core/packages/fluxer-core/src/structures/Webhook.test.ts +109 -0
  247. package/core/packages/fluxer-core/src/structures/Webhook.ts +258 -0
  248. package/core/packages/fluxer-core/src/util/Constants.test.ts +16 -0
  249. package/core/packages/fluxer-core/src/util/Constants.ts +7 -0
  250. package/core/packages/fluxer-core/src/util/Events.ts +46 -0
  251. package/core/packages/fluxer-core/src/util/MessageCollector.ts +87 -0
  252. package/core/packages/fluxer-core/src/util/Options.ts +33 -0
  253. package/core/packages/fluxer-core/src/util/ReactionCollector.ts +116 -0
  254. package/core/packages/fluxer-core/src/util/cdn.test.ts +108 -0
  255. package/core/packages/fluxer-core/src/util/cdn.ts +130 -0
  256. package/core/packages/fluxer-core/src/util/guildUtils.ts +33 -0
  257. package/core/packages/fluxer-core/src/util/messageUtils.test.ts +74 -0
  258. package/core/packages/fluxer-core/src/util/messageUtils.ts +119 -0
  259. package/core/packages/fluxer-core/src/util/permissions.test.ts +95 -0
  260. package/core/packages/fluxer-core/src/util/permissions.ts +43 -0
  261. package/core/packages/fluxer-core/tsconfig.json +9 -0
  262. package/core/packages/fluxer-core/tsup.config.ts +9 -0
  263. package/core/packages/fluxer-core/vitest.config.ts +9 -0
  264. package/core/packages/rest/package.json +52 -0
  265. package/core/packages/rest/src/REST.test.ts +64 -0
  266. package/core/packages/rest/src/REST.ts +90 -0
  267. package/core/packages/rest/src/RateLimitManager.test.ts +71 -0
  268. package/core/packages/rest/src/RateLimitManager.ts +60 -0
  269. package/core/packages/rest/src/RequestManager.test.ts +87 -0
  270. package/core/packages/rest/src/RequestManager.ts +172 -0
  271. package/core/packages/rest/src/errors/FluxerAPIError.test.ts +57 -0
  272. package/core/packages/rest/src/errors/FluxerAPIError.ts +21 -0
  273. package/core/packages/rest/src/errors/HTTPError.test.ts +55 -0
  274. package/core/packages/rest/src/errors/HTTPError.ts +25 -0
  275. package/core/packages/rest/src/errors/RateLimitError.test.ts +41 -0
  276. package/core/packages/rest/src/errors/RateLimitError.ts +15 -0
  277. package/core/packages/rest/src/errors/index.ts +3 -0
  278. package/core/packages/rest/src/index.ts +6 -0
  279. package/core/packages/rest/src/utils/constants.test.ts +31 -0
  280. package/core/packages/rest/src/utils/constants.ts +5 -0
  281. package/core/packages/rest/src/utils/files.test.ts +37 -0
  282. package/core/packages/rest/src/utils/files.ts +75 -0
  283. package/core/packages/rest/tsconfig.json +9 -0
  284. package/core/packages/rest/tsup.config.ts +9 -0
  285. package/core/packages/rest/vitest.config.ts +9 -0
  286. package/core/packages/types/package.json +46 -0
  287. package/core/packages/types/src/api/ban.ts +8 -0
  288. package/core/packages/types/src/api/channel.ts +65 -0
  289. package/core/packages/types/src/api/embed.ts +82 -0
  290. package/core/packages/types/src/api/emoji.ts +12 -0
  291. package/core/packages/types/src/api/errors.ts +68 -0
  292. package/core/packages/types/src/api/gateway.ts +14 -0
  293. package/core/packages/types/src/api/guild.ts +123 -0
  294. package/core/packages/types/src/api/index.ts +15 -0
  295. package/core/packages/types/src/api/instance.ts +32 -0
  296. package/core/packages/types/src/api/interaction.ts +26 -0
  297. package/core/packages/types/src/api/invite.ts +28 -0
  298. package/core/packages/types/src/api/message.ts +140 -0
  299. package/core/packages/types/src/api/role.ts +41 -0
  300. package/core/packages/types/src/api/sticker.ts +14 -0
  301. package/core/packages/types/src/api/user.ts +79 -0
  302. package/core/packages/types/src/api/webhook.ts +41 -0
  303. package/core/packages/types/src/common/index.ts +1 -0
  304. package/core/packages/types/src/common/snowflake.test.ts +9 -0
  305. package/core/packages/types/src/common/snowflake.ts +8 -0
  306. package/core/packages/types/src/gateway/events.ts +189 -0
  307. package/core/packages/types/src/gateway/index.ts +3 -0
  308. package/core/packages/types/src/gateway/opcodes.ts +17 -0
  309. package/core/packages/types/src/gateway/payloads.ts +481 -0
  310. package/core/packages/types/src/index.ts +4 -0
  311. package/core/packages/types/src/rest/index.ts +1 -0
  312. package/core/packages/types/src/rest/routes.test.ts +169 -0
  313. package/core/packages/types/src/rest/routes.ts +109 -0
  314. package/core/packages/types/tsconfig.json +9 -0
  315. package/core/packages/types/tsup.config.ts +9 -0
  316. package/core/packages/types/vitest.config.ts +9 -0
  317. package/core/packages/util/package.json +51 -0
  318. package/core/packages/util/src/BitField.test.ts +96 -0
  319. package/core/packages/util/src/BitField.ts +105 -0
  320. package/core/packages/util/src/MessageFlagsBitField.test.ts +42 -0
  321. package/core/packages/util/src/MessageFlagsBitField.ts +20 -0
  322. package/core/packages/util/src/PermissionsBitField.test.ts +79 -0
  323. package/core/packages/util/src/PermissionsBitField.ts +97 -0
  324. package/core/packages/util/src/SnowflakeUtil.test.ts +69 -0
  325. package/core/packages/util/src/SnowflakeUtil.ts +65 -0
  326. package/core/packages/util/src/UserFlagsBitField.test.ts +39 -0
  327. package/core/packages/util/src/UserFlagsBitField.ts +48 -0
  328. package/core/packages/util/src/deprecation.test.ts +44 -0
  329. package/core/packages/util/src/deprecation.ts +28 -0
  330. package/core/packages/util/src/emojiShortcodes.generated.ts +5 -0
  331. package/core/packages/util/src/emojiShortcodes.test.ts +41 -0
  332. package/core/packages/util/src/emojiShortcodes.ts +22 -0
  333. package/core/packages/util/src/formatters.test.ts +65 -0
  334. package/core/packages/util/src/formatters.ts +35 -0
  335. package/core/packages/util/src/index.ts +34 -0
  336. package/core/packages/util/src/resolvers.test.ts +198 -0
  337. package/core/packages/util/src/resolvers.ts +127 -0
  338. package/core/packages/util/src/tenorUtils.test.ts +75 -0
  339. package/core/packages/util/src/tenorUtils.ts +86 -0
  340. package/core/packages/util/tsconfig.json +9 -0
  341. package/core/packages/util/tsup.config.ts +9 -0
  342. package/core/packages/util/vitest.config.ts +9 -0
  343. package/core/packages/voice/README.md +42 -0
  344. package/core/packages/voice/package.json +67 -0
  345. package/core/packages/voice/src/LiveKitRtcConnection.receive.test.ts +24 -0
  346. package/core/packages/voice/src/LiveKitRtcConnection.ts +1767 -0
  347. package/core/packages/voice/src/VoiceConnection.ts +413 -0
  348. package/core/packages/voice/src/VoiceManager.receive.test.ts +61 -0
  349. package/core/packages/voice/src/VoiceManager.test.ts +44 -0
  350. package/core/packages/voice/src/VoiceManager.ts +503 -0
  351. package/core/packages/voice/src/exports.test.ts +38 -0
  352. package/core/packages/voice/src/index.ts +51 -0
  353. package/core/packages/voice/src/livekit.test.ts +48 -0
  354. package/core/packages/voice/src/livekit.ts +33 -0
  355. package/core/packages/voice/src/mp4box.d.ts +32 -0
  356. package/core/packages/voice/src/opusUtils.test.ts +29 -0
  357. package/core/packages/voice/src/opusUtils.ts +86 -0
  358. package/core/packages/voice/src/streamPreviewPlaceholder.test.ts +16 -0
  359. package/core/packages/voice/src/streamPreviewPlaceholder.ts +8 -0
  360. package/core/packages/voice/src/ws.d.ts +1 -0
  361. package/core/packages/voice/tsconfig.json +5 -0
  362. package/core/packages/voice/tsup.config.ts +10 -0
  363. package/core/packages/voice/vitest.config.ts +9 -0
  364. package/core/packages/ws/package.json +52 -0
  365. package/core/packages/ws/src/WebSocketManager.ts +130 -0
  366. package/core/packages/ws/src/WebSocketShard.ts +296 -0
  367. package/core/packages/ws/src/index.ts +12 -0
  368. package/core/packages/ws/src/utils/constants.test.ts +46 -0
  369. package/core/packages/ws/src/utils/constants.ts +22 -0
  370. package/core/packages/ws/src/utils/getWebSocket.ts +55 -0
  371. package/core/packages/ws/src/ws.d.ts +10 -0
  372. package/core/packages/ws/tsconfig.json +9 -0
  373. package/core/packages/ws/tsup.config.ts +9 -0
  374. package/core/pnpm-lock.yaml +7033 -0
  375. package/core/pnpm-workspace.yaml +4 -0
  376. package/core/scripts/generate-ai-rag.ts +240 -0
  377. package/core/scripts/generate-docs.ts +143 -0
  378. package/core/scripts/generate-emoji-shortcodes.ts +58 -0
  379. package/core/scripts/generate-types.ts +6 -0
  380. package/core/scripts/publish-ordered.js +63 -0
  381. package/core/scripts/test-cjs-require.mjs +43 -0
  382. package/core/scripts/test-esm-imports.mjs +42 -0
  383. package/core/scripts/test-package-exports.mjs +98 -0
  384. package/core/scripts/test-smoke.mjs +103 -0
  385. package/core/tsconfig.json +18 -0
  386. package/core/turbo.json +30 -0
  387. package/core/vitest.config.ts +17 -0
  388. package/core/wrangler.jsonc +9 -0
  389. package/package.json +26 -0
@@ -0,0 +1,1073 @@
1
+ /**
2
+ * Bot and Webhook API reference data.
3
+ * Source: fluxer_api (Hono routes under /v1).
4
+ */
5
+
6
+ export interface ApiQueryParam {
7
+ name: string;
8
+ type: string;
9
+ required?: boolean;
10
+ description?: string;
11
+ }
12
+
13
+ export interface ApiSchemaField {
14
+ name: string;
15
+ type: string;
16
+ required?: boolean;
17
+ description?: string;
18
+ items?: ApiSchemaField[];
19
+ nested?: ApiSchemaField[];
20
+ }
21
+
22
+ export interface ApiEndpoint {
23
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
24
+ path: string;
25
+ summary: string;
26
+ description?: string;
27
+ auth: 'bot' | 'webhook-token' | 'none';
28
+ category: string;
29
+ queryParams?: ApiQueryParam[];
30
+ requestBody?: ApiSchemaField[];
31
+ responseBody?: ApiSchemaField[];
32
+ responseCode?: number;
33
+ responseRef?: string;
34
+ }
35
+
36
+ /** Shared schema definitions referenced by multiple endpoints */
37
+ export const sharedSchemas = {
38
+ messageRequest: [
39
+ {
40
+ name: 'content',
41
+ type: 'string | null',
42
+ required: false,
43
+ description: 'Message text content',
44
+ },
45
+ { name: 'embeds', type: 'RichEmbed[]', required: false, description: 'Rich embeds (max 10)' },
46
+ {
47
+ name: 'attachments',
48
+ type: 'AttachmentRequest[]',
49
+ required: false,
50
+ description: 'Attachment refs (max 10)',
51
+ },
52
+ {
53
+ name: 'message_reference',
54
+ type: '{ message_id, channel_id?, guild_id?, type? }',
55
+ required: false,
56
+ },
57
+ {
58
+ name: 'allowed_mentions',
59
+ type: '{ parse?, users?, roles?, replied_user? }',
60
+ required: false,
61
+ },
62
+ { name: 'flags', type: 'number', required: false, description: 'Message flags (default 0)' },
63
+ { name: 'nonce', type: 'string', required: false, description: '1-32 chars, for idempotency' },
64
+ { name: 'favorite_meme_id', type: 'string (snowflake)', required: false },
65
+ { name: 'sticker_ids', type: 'string[]', required: false, description: 'Max 3 sticker IDs' },
66
+ { name: 'tts', type: 'boolean', required: false },
67
+ ] as ApiSchemaField[],
68
+ messageUpdate: [
69
+ { name: 'content', type: 'string | null', required: false },
70
+ { name: 'embeds', type: 'RichEmbed[]', required: false },
71
+ {
72
+ name: 'allowed_mentions',
73
+ type: '{ parse?, users?, roles?, replied_user? }',
74
+ required: false,
75
+ },
76
+ { name: 'flags', type: 'number', required: false },
77
+ { name: 'attachments', type: 'AttachmentReference[]', required: false },
78
+ ] as ApiSchemaField[],
79
+ richEmbed: [
80
+ { name: 'url', type: 'string', required: false },
81
+ { name: 'title', type: 'string', required: false },
82
+ { name: 'color', type: 'number', required: false },
83
+ { name: 'timestamp', type: 'ISO datetime', required: false },
84
+ { name: 'description', type: 'string (1-4096)', required: false },
85
+ { name: 'author', type: '{ name, url?, icon_url? }', required: false },
86
+ { name: 'image', type: '{ url, description? }', required: false },
87
+ { name: 'thumbnail', type: '{ url, description? }', required: false },
88
+ { name: 'footer', type: '{ text, icon_url? }', required: false },
89
+ { name: 'fields', type: '{ name, value, inline? }[]', required: false, description: 'Max 25' },
90
+ ] as ApiSchemaField[],
91
+ channelOverwrite: [
92
+ { name: 'id', type: 'string (snowflake)', required: true },
93
+ { name: 'type', type: '0 | 1', required: true, description: '0=role, 1=member' },
94
+ { name: 'allow', type: 'string (permission bitfield)', required: false },
95
+ { name: 'deny', type: 'string (permission bitfield)', required: false },
96
+ ] as ApiSchemaField[],
97
+ };
98
+
99
+ export const API_CATEGORIES = [
100
+ 'gateway',
101
+ 'instance',
102
+ 'channels',
103
+ 'messages',
104
+ 'pins-reactions',
105
+ 'guilds',
106
+ 'invites',
107
+ 'webhooks',
108
+ ] as const;
109
+
110
+ export const API_CATEGORY_LABELS: Record<(typeof API_CATEGORIES)[number], string> = {
111
+ gateway: 'Gateway',
112
+ instance: 'Instance',
113
+ channels: 'Channels',
114
+ messages: 'Messages',
115
+ 'pins-reactions': 'Pins & Reactions',
116
+ guilds: 'Guilds',
117
+ invites: 'Invites',
118
+ webhooks: 'Webhooks',
119
+ };
120
+
121
+ export const apiEndpoints: ApiEndpoint[] = [
122
+ // --- Gateway ---
123
+ {
124
+ method: 'GET',
125
+ path: '/gateway/bot',
126
+ summary: 'Get gateway connection URL for bot',
127
+ auth: 'bot',
128
+ category: 'gateway',
129
+ responseBody: [
130
+ { name: 'url', type: 'string', description: 'WebSocket URL' },
131
+ { name: 'shards', type: 'number', description: 'Recommended shard count (1)' },
132
+ {
133
+ name: 'session_start_limit',
134
+ type: 'object',
135
+ nested: [
136
+ { name: 'total', type: 'number' },
137
+ { name: 'remaining', type: 'number' },
138
+ { name: 'reset_after', type: 'number', description: 'ms' },
139
+ { name: 'max_concurrency', type: 'number' },
140
+ ],
141
+ },
142
+ ],
143
+ },
144
+
145
+ // --- Instance ---
146
+ {
147
+ method: 'GET',
148
+ path: '/instance',
149
+ summary: 'Get instance info and endpoints',
150
+ auth: 'none',
151
+ category: 'instance',
152
+ responseBody: [
153
+ { name: 'api_code_version', type: 'string' },
154
+ {
155
+ name: 'endpoints',
156
+ type: 'object',
157
+ nested: [
158
+ { name: 'api', type: 'string' },
159
+ { name: 'gateway', type: 'string' },
160
+ ],
161
+ },
162
+ { name: 'captcha', type: 'object' },
163
+ { name: 'features', type: 'object', nested: [{ name: 'voice_enabled', type: 'boolean' }] },
164
+ { name: 'push', type: 'object' },
165
+ ],
166
+ },
167
+
168
+ // --- Channels ---
169
+ {
170
+ method: 'GET',
171
+ path: '/channels/:channel_id',
172
+ summary: 'Get channel',
173
+ auth: 'bot',
174
+ category: 'channels',
175
+ responseRef: 'ChannelResponse',
176
+ },
177
+ {
178
+ method: 'PATCH',
179
+ path: '/channels/:channel_id',
180
+ summary: 'Update channel',
181
+ auth: 'bot',
182
+ category: 'channels',
183
+ requestBody: [
184
+ { name: 'type', type: 'number', required: true, description: 'Channel type (required)' },
185
+ { name: 'name', type: 'string', required: false },
186
+ { name: 'topic', type: 'string (1-1024)', required: false },
187
+ { name: 'url', type: 'string', required: false },
188
+ { name: 'parent_id', type: 'string (snowflake)', required: false },
189
+ { name: 'bitrate', type: 'number (8000-320000)', required: false },
190
+ { name: 'user_limit', type: 'number (0-99)', required: false },
191
+ { name: 'nsfw', type: 'boolean', required: false },
192
+ { name: 'rate_limit_per_user', type: 'number (0-21600)', required: false },
193
+ { name: 'icon', type: 'base64 string', required: false },
194
+ { name: 'owner_id', type: 'string (snowflake)', required: false },
195
+ { name: 'permission_overwrites', type: 'ChannelOverwrite[]', required: false },
196
+ { name: 'nicks', type: 'Record<string, string>', required: false },
197
+ { name: 'rtc_region', type: 'string (1-64)', required: false },
198
+ ],
199
+ responseRef: 'ChannelResponse',
200
+ },
201
+ {
202
+ method: 'DELETE',
203
+ path: '/channels/:channel_id',
204
+ summary: 'Delete channel',
205
+ auth: 'bot',
206
+ category: 'channels',
207
+ queryParams: [{ name: 'silent', type: 'boolean', required: false }],
208
+ responseCode: 204,
209
+ },
210
+ {
211
+ method: 'PUT',
212
+ path: '/channels/:channel_id/recipients/:user_id',
213
+ summary: 'Add recipient to group DM',
214
+ auth: 'bot',
215
+ category: 'channels',
216
+ responseCode: 204,
217
+ },
218
+ {
219
+ method: 'DELETE',
220
+ path: '/channels/:channel_id/recipients/:user_id',
221
+ summary: 'Remove recipient from group DM',
222
+ auth: 'bot',
223
+ category: 'channels',
224
+ queryParams: [{ name: 'silent', type: 'boolean', required: false }],
225
+ responseCode: 204,
226
+ },
227
+ {
228
+ method: 'PUT',
229
+ path: '/channels/:channel_id/permissions/:overwrite_id',
230
+ summary: 'Set permission overwrite',
231
+ auth: 'bot',
232
+ category: 'channels',
233
+ requestBody: [
234
+ { name: 'type', type: '0 | 1', required: true, description: '0=role, 1=member' },
235
+ { name: 'allow', type: 'string (snowflake)', required: false },
236
+ { name: 'deny', type: 'string (snowflake)', required: false },
237
+ ],
238
+ responseCode: 204,
239
+ },
240
+ {
241
+ method: 'DELETE',
242
+ path: '/channels/:channel_id/permissions/:overwrite_id',
243
+ summary: 'Delete permission overwrite',
244
+ auth: 'bot',
245
+ category: 'channels',
246
+ responseCode: 204,
247
+ },
248
+
249
+ // --- Messages ---
250
+ {
251
+ method: 'GET',
252
+ path: '/channels/:channel_id/messages',
253
+ summary: 'List channel messages',
254
+ auth: 'bot',
255
+ category: 'messages',
256
+ queryParams: [
257
+ { name: 'limit', type: 'number (1-100)', required: false, description: 'Default 50' },
258
+ { name: 'before', type: 'string (snowflake)', required: false },
259
+ { name: 'after', type: 'string (snowflake)', required: false },
260
+ { name: 'around', type: 'string (snowflake)', required: false },
261
+ ],
262
+ responseRef: 'MessageResponse[]',
263
+ },
264
+ {
265
+ method: 'GET',
266
+ path: '/channels/:channel_id/messages/:message_id',
267
+ summary: 'Get message',
268
+ auth: 'bot',
269
+ category: 'messages',
270
+ responseRef: 'MessageResponse',
271
+ },
272
+ {
273
+ method: 'POST',
274
+ path: '/channels/:channel_id/messages',
275
+ summary: 'Send message',
276
+ auth: 'bot',
277
+ category: 'messages',
278
+ description: 'Accepts JSON or multipart/form-data',
279
+ requestBody: sharedSchemas.messageRequest,
280
+ responseRef: 'MessageResponse',
281
+ },
282
+ {
283
+ method: 'PATCH',
284
+ path: '/channels/:channel_id/messages/:message_id',
285
+ summary: 'Edit message',
286
+ auth: 'bot',
287
+ category: 'messages',
288
+ requestBody: sharedSchemas.messageUpdate,
289
+ responseRef: 'MessageResponse',
290
+ },
291
+ {
292
+ method: 'DELETE',
293
+ path: '/channels/:channel_id/messages/:message_id',
294
+ summary: 'Delete message',
295
+ auth: 'bot',
296
+ category: 'messages',
297
+ responseCode: 204,
298
+ },
299
+ {
300
+ method: 'DELETE',
301
+ path: '/channels/:channel_id/messages/:message_id/attachments/:attachment_id',
302
+ summary: 'Delete message attachment',
303
+ auth: 'bot',
304
+ category: 'messages',
305
+ responseCode: 204,
306
+ },
307
+ {
308
+ method: 'POST',
309
+ path: '/channels/:channel_id/messages/bulk-delete',
310
+ summary: 'Bulk delete messages',
311
+ auth: 'bot',
312
+ category: 'messages',
313
+ requestBody: [{ name: 'message_ids', type: 'string[] (snowflakes)', required: true }],
314
+ responseCode: 204,
315
+ },
316
+ {
317
+ method: 'POST',
318
+ path: '/channels/:channel_id/typing',
319
+ summary: 'Trigger typing indicator',
320
+ auth: 'bot',
321
+ category: 'messages',
322
+ responseCode: 204,
323
+ },
324
+
325
+ // --- Pins & Reactions ---
326
+ {
327
+ method: 'GET',
328
+ path: '/channels/:channel_id/messages/pins',
329
+ summary: 'List pinned messages',
330
+ auth: 'bot',
331
+ category: 'pins-reactions',
332
+ queryParams: [
333
+ { name: 'limit', type: 'number (1-50)', required: false },
334
+ { name: 'before', type: 'ISO datetime', required: false },
335
+ ],
336
+ responseRef: 'ChannelPinResponse[]',
337
+ },
338
+ {
339
+ method: 'PUT',
340
+ path: '/channels/:channel_id/pins/:message_id',
341
+ summary: 'Pin message',
342
+ auth: 'bot',
343
+ category: 'pins-reactions',
344
+ responseCode: 204,
345
+ },
346
+ {
347
+ method: 'DELETE',
348
+ path: '/channels/:channel_id/pins/:message_id',
349
+ summary: 'Unpin message',
350
+ auth: 'bot',
351
+ category: 'pins-reactions',
352
+ responseCode: 204,
353
+ },
354
+ {
355
+ method: 'GET',
356
+ path: '/channels/:channel_id/messages/:message_id/reactions/:emoji',
357
+ summary: 'Get users who reacted',
358
+ auth: 'bot',
359
+ category: 'pins-reactions',
360
+ queryParams: [
361
+ { name: 'limit', type: 'number', required: false },
362
+ { name: 'after', type: 'string (snowflake)', required: false },
363
+ ],
364
+ responseRef: 'UserPartialResponse[]',
365
+ },
366
+ {
367
+ method: 'PUT',
368
+ path: '/channels/:channel_id/messages/:message_id/reactions/:emoji/@me',
369
+ summary: 'Add own reaction',
370
+ auth: 'bot',
371
+ category: 'pins-reactions',
372
+ responseCode: 204,
373
+ },
374
+ {
375
+ method: 'DELETE',
376
+ path: '/channels/:channel_id/messages/:message_id/reactions/:emoji/@me',
377
+ summary: 'Remove own reaction',
378
+ auth: 'bot',
379
+ category: 'pins-reactions',
380
+ responseCode: 204,
381
+ },
382
+ {
383
+ method: 'DELETE',
384
+ path: '/channels/:channel_id/messages/:message_id/reactions/:emoji/:target_id',
385
+ summary: 'Remove user reaction',
386
+ auth: 'bot',
387
+ category: 'pins-reactions',
388
+ responseCode: 204,
389
+ },
390
+ {
391
+ method: 'DELETE',
392
+ path: '/channels/:channel_id/messages/:message_id/reactions/:emoji',
393
+ summary: 'Remove all reactions for emoji',
394
+ auth: 'bot',
395
+ category: 'pins-reactions',
396
+ responseCode: 204,
397
+ },
398
+ {
399
+ method: 'DELETE',
400
+ path: '/channels/:channel_id/messages/:message_id/reactions',
401
+ summary: 'Remove all reactions',
402
+ auth: 'bot',
403
+ category: 'pins-reactions',
404
+ responseCode: 204,
405
+ },
406
+
407
+ // --- Guilds ---
408
+ {
409
+ method: 'POST',
410
+ path: '/guilds',
411
+ summary: 'Create guild',
412
+ auth: 'bot',
413
+ category: 'guilds',
414
+ requestBody: [
415
+ { name: 'name', type: 'string (1-100)', required: true },
416
+ { name: 'icon', type: 'base64 string', required: false },
417
+ { name: 'empty_features', type: 'boolean', required: false },
418
+ ],
419
+ responseRef: 'GuildResponse',
420
+ },
421
+ {
422
+ method: 'GET',
423
+ path: '/guilds/:guild_id',
424
+ summary: 'Get guild',
425
+ auth: 'bot',
426
+ category: 'guilds',
427
+ responseRef: 'GuildResponse',
428
+ },
429
+ {
430
+ method: 'PATCH',
431
+ path: '/guilds/:guild_id',
432
+ summary: 'Update guild',
433
+ auth: 'bot',
434
+ category: 'guilds',
435
+ requestBody: [
436
+ { name: 'name', type: 'string (1-100)', required: false },
437
+ { name: 'icon', type: 'base64', required: false },
438
+ { name: 'system_channel_id', type: 'string | null', required: false },
439
+ { name: 'system_channel_flags', type: 'number', required: false },
440
+ { name: 'afk_channel_id', type: 'string | null', required: false },
441
+ { name: 'afk_timeout', type: 'number (60-3600)', required: false },
442
+ { name: 'default_message_notifications', type: 'number (0-1)', required: false },
443
+ { name: 'verification_level', type: 'number', required: false },
444
+ { name: 'mfa_level', type: 'number', required: false },
445
+ { name: 'explicit_content_filter', type: 'number', required: false },
446
+ { name: 'banner', type: 'base64', required: false },
447
+ { name: 'splash', type: 'base64', required: false },
448
+ { name: 'embed_splash', type: 'base64', required: false },
449
+ { name: 'splash_card_alignment', type: 'string', required: false },
450
+ { name: 'features', type: 'string[]', required: false },
451
+ ],
452
+ responseRef: 'GuildResponse',
453
+ },
454
+ {
455
+ method: 'POST',
456
+ path: '/guilds/:guild_id/delete',
457
+ summary: 'Delete guild',
458
+ auth: 'bot',
459
+ category: 'guilds',
460
+ responseCode: 204,
461
+ },
462
+ {
463
+ method: 'GET',
464
+ path: '/guilds/:guild_id/vanity-url',
465
+ summary: 'Get vanity URL',
466
+ auth: 'bot',
467
+ category: 'guilds',
468
+ responseBody: [
469
+ { name: 'code', type: 'string | null' },
470
+ { name: 'uses', type: 'number' },
471
+ ],
472
+ },
473
+ {
474
+ method: 'PATCH',
475
+ path: '/guilds/:guild_id/text-channel-flexible-names',
476
+ summary: 'Update text channel flexible names',
477
+ auth: 'bot',
478
+ category: 'guilds',
479
+ requestBody: [{ name: 'enabled', type: 'boolean', required: true }],
480
+ responseRef: 'GuildResponse',
481
+ },
482
+ {
483
+ method: 'PATCH',
484
+ path: '/guilds/:guild_id/detached-banner',
485
+ summary: 'Update detached banner feature',
486
+ auth: 'bot',
487
+ category: 'guilds',
488
+ requestBody: [{ name: 'enabled', type: 'boolean', required: true }],
489
+ responseRef: 'GuildResponse',
490
+ },
491
+ {
492
+ method: 'PATCH',
493
+ path: '/guilds/:guild_id/disallow-unclaimed-accounts',
494
+ summary: 'Update disallow unclaimed accounts',
495
+ auth: 'bot',
496
+ category: 'guilds',
497
+ requestBody: [{ name: 'enabled', type: 'boolean', required: true }],
498
+ responseRef: 'GuildResponse',
499
+ },
500
+ {
501
+ method: 'GET',
502
+ path: '/guilds/:guild_id/channels',
503
+ summary: 'List guild channels',
504
+ auth: 'bot',
505
+ category: 'guilds',
506
+ responseRef: 'ChannelResponse[]',
507
+ },
508
+ {
509
+ method: 'POST',
510
+ path: '/guilds/:guild_id/channels',
511
+ summary: 'Create channel',
512
+ auth: 'bot',
513
+ category: 'guilds',
514
+ requestBody: [
515
+ {
516
+ name: 'type',
517
+ type: 'number',
518
+ required: true,
519
+ description: '0=text, 2=voice, 4=category, 5=link',
520
+ },
521
+ { name: 'name', type: 'string', required: true },
522
+ { name: 'topic', type: 'string (1-1024)', required: false },
523
+ { name: 'url', type: 'string', required: false },
524
+ { name: 'parent_id', type: 'string (snowflake)', required: false },
525
+ { name: 'bitrate', type: 'number (8000-320000)', required: false },
526
+ { name: 'user_limit', type: 'number (0-99)', required: false },
527
+ { name: 'nsfw', type: 'boolean', required: false },
528
+ { name: 'permission_overwrites', type: 'ChannelOverwrite[]', required: false },
529
+ ],
530
+ responseRef: 'ChannelResponse',
531
+ },
532
+ {
533
+ method: 'PATCH',
534
+ path: '/guilds/:guild_id/channels',
535
+ summary: 'Reorder channels',
536
+ auth: 'bot',
537
+ category: 'guilds',
538
+ description: 'Request body is array of channel update objects',
539
+ requestBody: [
540
+ { name: 'id', type: 'string (snowflake)', required: true, description: 'Per item in array' },
541
+ { name: 'position', type: 'number', required: false },
542
+ { name: 'parent_id', type: 'string | null', required: false },
543
+ { name: 'lock_permissions', type: 'boolean', required: false },
544
+ ],
545
+ responseCode: 204,
546
+ },
547
+ {
548
+ method: 'GET',
549
+ path: '/guilds/:guild_id/members',
550
+ summary: 'List guild members',
551
+ auth: 'bot',
552
+ category: 'guilds',
553
+ queryParams: [
554
+ { name: 'limit', type: 'number', required: false },
555
+ { name: 'after', type: 'string (snowflake)', required: false },
556
+ ],
557
+ responseRef: 'GuildMemberResponse[]',
558
+ },
559
+ {
560
+ method: 'GET',
561
+ path: '/guilds/:guild_id/members/@me',
562
+ summary: 'Get current member',
563
+ auth: 'bot',
564
+ category: 'guilds',
565
+ responseRef: 'GuildMemberResponse',
566
+ },
567
+ {
568
+ method: 'GET',
569
+ path: '/guilds/:guild_id/members/:user_id',
570
+ summary: 'Get guild member',
571
+ auth: 'bot',
572
+ category: 'guilds',
573
+ responseRef: 'GuildMemberResponse',
574
+ },
575
+ {
576
+ method: 'PATCH',
577
+ path: '/guilds/:guild_id/members/@me',
578
+ summary: 'Update current member',
579
+ auth: 'bot',
580
+ category: 'guilds',
581
+ requestBody: [
582
+ { name: 'nick', type: 'string (1-32)', required: false },
583
+ { name: 'avatar', type: 'base64', required: false },
584
+ { name: 'banner', type: 'base64', required: false },
585
+ { name: 'bio', type: 'string (1-320)', required: false },
586
+ { name: 'pronouns', type: 'string (1-40)', required: false },
587
+ { name: 'accent_color', type: 'number', required: false },
588
+ { name: 'profile_flags', type: 'number', required: false },
589
+ { name: 'mute', type: 'boolean', required: false },
590
+ { name: 'deaf', type: 'boolean', required: false },
591
+ { name: 'communication_disabled_until', type: 'ISO datetime', required: false },
592
+ { name: 'timeout_reason', type: 'string (1-512)', required: false },
593
+ { name: 'channel_id', type: 'string (snowflake)', required: false },
594
+ { name: 'connection_id', type: 'string (1-32)', required: false },
595
+ ],
596
+ responseRef: 'GuildMemberResponse',
597
+ },
598
+ {
599
+ method: 'PATCH',
600
+ path: '/guilds/:guild_id/members/:user_id',
601
+ summary: 'Update guild member',
602
+ auth: 'bot',
603
+ category: 'guilds',
604
+ requestBody: [
605
+ { name: 'nick', type: 'string (1-32)', required: false },
606
+ { name: 'roles', type: 'string[] (snowflakes, max 100)', required: false },
607
+ { name: 'avatar', type: 'base64', required: false },
608
+ { name: 'banner', type: 'base64', required: false },
609
+ { name: 'bio', type: 'string (1-320)', required: false },
610
+ { name: 'pronouns', type: 'string (1-40)', required: false },
611
+ { name: 'accent_color', type: 'number', required: false },
612
+ { name: 'profile_flags', type: 'number', required: false },
613
+ { name: 'mute', type: 'boolean', required: false },
614
+ { name: 'deaf', type: 'boolean', required: false },
615
+ { name: 'communication_disabled_until', type: 'ISO datetime', required: false },
616
+ { name: 'timeout_reason', type: 'string (1-512)', required: false },
617
+ { name: 'channel_id', type: 'string (snowflake)', required: false },
618
+ { name: 'connection_id', type: 'string (1-32)', required: false },
619
+ ],
620
+ responseRef: 'GuildMemberResponse',
621
+ },
622
+ {
623
+ method: 'DELETE',
624
+ path: '/guilds/:guild_id/members/:user_id',
625
+ summary: 'Remove guild member',
626
+ auth: 'bot',
627
+ category: 'guilds',
628
+ responseCode: 204,
629
+ },
630
+ {
631
+ method: 'POST',
632
+ path: '/guilds/:guild_id/transfer-ownership',
633
+ summary: 'Transfer guild ownership',
634
+ auth: 'bot',
635
+ category: 'guilds',
636
+ requestBody: [
637
+ { name: 'new_owner_id', type: 'string (snowflake)', required: true },
638
+ { name: 'password', type: 'string', required: false },
639
+ ],
640
+ responseRef: 'GuildResponse',
641
+ },
642
+ {
643
+ method: 'GET',
644
+ path: '/guilds/:guild_id/bans',
645
+ summary: 'List guild bans',
646
+ auth: 'bot',
647
+ category: 'guilds',
648
+ queryParams: [
649
+ { name: 'limit', type: 'number', required: false },
650
+ { name: 'after', type: 'string (snowflake)', required: false },
651
+ ],
652
+ responseRef: 'GuildBanResponse[]',
653
+ },
654
+ {
655
+ method: 'PUT',
656
+ path: '/guilds/:guild_id/bans/:user_id',
657
+ summary: 'Ban user',
658
+ auth: 'bot',
659
+ category: 'guilds',
660
+ requestBody: [
661
+ {
662
+ name: 'delete_message_days',
663
+ type: 'number (0-7)',
664
+ required: false,
665
+ description: 'Default 0',
666
+ },
667
+ { name: 'reason', type: 'string (0-512)', required: false },
668
+ {
669
+ name: 'ban_duration_seconds',
670
+ type: 'number',
671
+ required: false,
672
+ description: '0=permanent, or valid temp duration',
673
+ },
674
+ ],
675
+ responseRef: 'GuildBanResponse',
676
+ },
677
+ {
678
+ method: 'DELETE',
679
+ path: '/guilds/:guild_id/bans/:user_id',
680
+ summary: 'Unban user',
681
+ auth: 'bot',
682
+ category: 'guilds',
683
+ responseCode: 204,
684
+ },
685
+ {
686
+ method: 'PUT',
687
+ path: '/guilds/:guild_id/members/:user_id/roles/:role_id',
688
+ summary: 'Add role to member',
689
+ auth: 'bot',
690
+ category: 'guilds',
691
+ responseCode: 204,
692
+ },
693
+ {
694
+ method: 'DELETE',
695
+ path: '/guilds/:guild_id/members/:user_id/roles/:role_id',
696
+ summary: 'Remove role from member',
697
+ auth: 'bot',
698
+ category: 'guilds',
699
+ responseCode: 204,
700
+ },
701
+ {
702
+ method: 'GET',
703
+ path: '/guilds/:guild_id/roles',
704
+ summary: 'List guild roles',
705
+ auth: 'bot',
706
+ category: 'guilds',
707
+ responseRef: 'GuildRoleResponse[]',
708
+ },
709
+ {
710
+ method: 'POST',
711
+ path: '/guilds/:guild_id/roles',
712
+ summary: 'Create role',
713
+ auth: 'bot',
714
+ category: 'guilds',
715
+ requestBody: [
716
+ { name: 'name', type: 'string (1-100)', required: true },
717
+ { name: 'color', type: 'number', required: false, description: 'Default 0' },
718
+ { name: 'permissions', type: 'string (snowflake)', required: false },
719
+ ],
720
+ responseRef: 'GuildRoleResponse',
721
+ },
722
+ {
723
+ method: 'PATCH',
724
+ path: '/guilds/:guild_id/roles',
725
+ summary: 'Reorder roles',
726
+ auth: 'bot',
727
+ category: 'guilds',
728
+ requestBody: [
729
+ { name: 'id', type: 'string (snowflake)', required: true },
730
+ { name: 'position', type: 'number', required: false },
731
+ ],
732
+ responseRef: 'GuildRoleResponse[]',
733
+ },
734
+ {
735
+ method: 'PATCH',
736
+ path: '/guilds/:guild_id/roles/hoist-positions',
737
+ summary: 'Update role hoist positions',
738
+ auth: 'bot',
739
+ category: 'guilds',
740
+ requestBody: [
741
+ { name: 'id', type: 'string (snowflake)', required: true },
742
+ { name: 'hoist_position', type: 'number', required: false },
743
+ ],
744
+ responseRef: 'GuildRoleResponse[]',
745
+ },
746
+ {
747
+ method: 'DELETE',
748
+ path: '/guilds/:guild_id/roles/hoist-positions',
749
+ summary: 'Reset role hoist positions',
750
+ auth: 'bot',
751
+ category: 'guilds',
752
+ responseRef: 'GuildRoleResponse[]',
753
+ },
754
+ {
755
+ method: 'PATCH',
756
+ path: '/guilds/:guild_id/roles/:role_id',
757
+ summary: 'Update role',
758
+ auth: 'bot',
759
+ category: 'guilds',
760
+ requestBody: [
761
+ { name: 'name', type: 'string (1-100)', required: false },
762
+ { name: 'color', type: 'number', required: false },
763
+ { name: 'permissions', type: 'string (snowflake)', required: false },
764
+ { name: 'hoist', type: 'boolean', required: false },
765
+ { name: 'hoist_position', type: 'number', required: false },
766
+ { name: 'mentionable', type: 'boolean', required: false },
767
+ ],
768
+ responseRef: 'GuildRoleResponse',
769
+ },
770
+ {
771
+ method: 'DELETE',
772
+ path: '/guilds/:guild_id/roles/:role_id',
773
+ summary: 'Delete role',
774
+ auth: 'bot',
775
+ category: 'guilds',
776
+ responseCode: 204,
777
+ },
778
+ {
779
+ method: 'GET',
780
+ path: '/guilds/:guild_id/emojis',
781
+ summary: 'List guild emojis',
782
+ auth: 'bot',
783
+ category: 'guilds',
784
+ responseRef: 'GuildEmojiResponse[]',
785
+ },
786
+ {
787
+ method: 'POST',
788
+ path: '/guilds/:guild_id/emojis',
789
+ summary: 'Create emoji',
790
+ auth: 'bot',
791
+ category: 'guilds',
792
+ requestBody: [
793
+ { name: 'name', type: 'string (2-32, letters/numbers/underscore)', required: true },
794
+ { name: 'image', type: 'base64 string', required: true },
795
+ ],
796
+ responseRef: 'GuildEmojiWithUserResponse',
797
+ },
798
+ {
799
+ method: 'POST',
800
+ path: '/guilds/:guild_id/emojis/bulk',
801
+ summary: 'Bulk create emojis',
802
+ auth: 'bot',
803
+ category: 'guilds',
804
+ requestBody: [
805
+ {
806
+ name: 'emojis',
807
+ type: 'GuildEmojiCreateRequest[]',
808
+ required: true,
809
+ description: '1-50 emojis',
810
+ },
811
+ ],
812
+ responseRef: 'GuildEmojiWithUserResponse[]',
813
+ },
814
+ {
815
+ method: 'PATCH',
816
+ path: '/guilds/:guild_id/emojis/:emoji_id',
817
+ summary: 'Update emoji',
818
+ auth: 'bot',
819
+ category: 'guilds',
820
+ requestBody: [{ name: 'name', type: 'string (2-32)', required: true }],
821
+ responseRef: 'GuildEmojiWithUserResponse',
822
+ },
823
+ {
824
+ method: 'DELETE',
825
+ path: '/guilds/:guild_id/emojis/:emoji_id',
826
+ summary: 'Delete emoji',
827
+ auth: 'bot',
828
+ category: 'guilds',
829
+ responseCode: 204,
830
+ },
831
+ {
832
+ method: 'GET',
833
+ path: '/guilds/:guild_id/stickers',
834
+ summary: 'List guild stickers',
835
+ auth: 'bot',
836
+ category: 'guilds',
837
+ responseRef: 'GuildStickerResponse[]',
838
+ },
839
+ {
840
+ method: 'POST',
841
+ path: '/guilds/:guild_id/stickers',
842
+ summary: 'Create sticker',
843
+ auth: 'bot',
844
+ category: 'guilds',
845
+ requestBody: [
846
+ { name: 'name', type: 'string (2-30)', required: true },
847
+ { name: 'description', type: 'string (1-100)', required: false },
848
+ { name: 'tags', type: 'string[]', required: false, description: 'Max 10, each 1-30 chars' },
849
+ { name: 'image', type: 'base64 string', required: true },
850
+ ],
851
+ responseRef: 'GuildStickerWithUserResponse',
852
+ },
853
+ {
854
+ method: 'POST',
855
+ path: '/guilds/:guild_id/stickers/bulk',
856
+ summary: 'Bulk create stickers',
857
+ auth: 'bot',
858
+ category: 'guilds',
859
+ requestBody: [
860
+ {
861
+ name: 'stickers',
862
+ type: 'GuildStickerCreateRequest[]',
863
+ required: true,
864
+ description: '1-50 stickers',
865
+ },
866
+ ],
867
+ responseRef: 'GuildStickerWithUserResponse[]',
868
+ },
869
+ {
870
+ method: 'PATCH',
871
+ path: '/guilds/:guild_id/stickers/:sticker_id',
872
+ summary: 'Update sticker',
873
+ auth: 'bot',
874
+ category: 'guilds',
875
+ requestBody: [
876
+ { name: 'name', type: 'string (2-30)', required: false },
877
+ { name: 'description', type: 'string (1-100)', required: false },
878
+ { name: 'tags', type: 'string[]', required: false },
879
+ ],
880
+ responseRef: 'GuildStickerWithUserResponse',
881
+ },
882
+ {
883
+ method: 'DELETE',
884
+ path: '/guilds/:guild_id/stickers/:sticker_id',
885
+ summary: 'Delete sticker',
886
+ auth: 'bot',
887
+ category: 'guilds',
888
+ responseCode: 204,
889
+ },
890
+
891
+ // --- Invites ---
892
+ {
893
+ method: 'GET',
894
+ path: '/invites/:invite_code',
895
+ summary: 'Get invite',
896
+ auth: 'bot',
897
+ category: 'invites',
898
+ responseRef: 'GuildInviteResponse | GroupDmInviteResponse | PackInviteResponse',
899
+ },
900
+ {
901
+ method: 'DELETE',
902
+ path: '/invites/:invite_code',
903
+ summary: 'Delete invite',
904
+ auth: 'bot',
905
+ category: 'invites',
906
+ responseCode: 204,
907
+ },
908
+ {
909
+ method: 'POST',
910
+ path: '/channels/:channel_id/invites',
911
+ summary: 'Create channel invite',
912
+ auth: 'bot',
913
+ category: 'invites',
914
+ requestBody: [
915
+ { name: 'max_uses', type: 'number (0-100)', required: false, description: 'Default 0' },
916
+ {
917
+ name: 'max_age',
918
+ type: 'number (0-604800)',
919
+ required: false,
920
+ description: 'Seconds, default 0',
921
+ },
922
+ { name: 'unique', type: 'boolean', required: false, description: 'Default false' },
923
+ { name: 'temporary', type: 'boolean', required: false, description: 'Default false' },
924
+ ],
925
+ responseRef: 'GuildInviteMetadataResponse',
926
+ },
927
+ {
928
+ method: 'GET',
929
+ path: '/channels/:channel_id/invites',
930
+ summary: 'List channel invites',
931
+ auth: 'bot',
932
+ category: 'invites',
933
+ responseRef: 'InviteMetadata[]',
934
+ },
935
+ {
936
+ method: 'GET',
937
+ path: '/guilds/:guild_id/invites',
938
+ summary: 'List guild invites',
939
+ auth: 'bot',
940
+ category: 'invites',
941
+ responseRef: 'InviteMetadata[]',
942
+ },
943
+
944
+ // --- Webhooks ---
945
+ {
946
+ method: 'GET',
947
+ path: '/guilds/:guild_id/webhooks',
948
+ summary: 'List guild webhooks',
949
+ auth: 'bot',
950
+ category: 'webhooks',
951
+ responseRef: 'WebhookResponse[]',
952
+ },
953
+ {
954
+ method: 'GET',
955
+ path: '/channels/:channel_id/webhooks',
956
+ summary: 'List channel webhooks',
957
+ auth: 'bot',
958
+ category: 'webhooks',
959
+ responseRef: 'WebhookResponse[]',
960
+ },
961
+ {
962
+ method: 'POST',
963
+ path: '/channels/:channel_id/webhooks',
964
+ summary: 'Create webhook',
965
+ auth: 'bot',
966
+ category: 'webhooks',
967
+ requestBody: [
968
+ { name: 'name', type: 'string', required: true },
969
+ { name: 'avatar', type: 'base64 string', required: false },
970
+ ],
971
+ responseRef: 'WebhookResponse',
972
+ },
973
+ {
974
+ method: 'GET',
975
+ path: '/webhooks/:webhook_id',
976
+ summary: 'Get webhook (bot token)',
977
+ auth: 'bot',
978
+ category: 'webhooks',
979
+ responseRef: 'WebhookResponse',
980
+ },
981
+ {
982
+ method: 'GET',
983
+ path: '/webhooks/:webhook_id/:token',
984
+ summary: 'Get webhook (token auth)',
985
+ auth: 'webhook-token',
986
+ category: 'webhooks',
987
+ responseRef: 'WebhookResponse',
988
+ },
989
+ {
990
+ method: 'PATCH',
991
+ path: '/webhooks/:webhook_id',
992
+ summary: 'Update webhook (bot token)',
993
+ auth: 'bot',
994
+ category: 'webhooks',
995
+ requestBody: [
996
+ { name: 'name', type: 'string', required: false },
997
+ { name: 'avatar', type: 'base64', required: false },
998
+ { name: 'channel_id', type: 'string (snowflake)', required: false },
999
+ ],
1000
+ responseRef: 'WebhookResponse',
1001
+ },
1002
+ {
1003
+ method: 'PATCH',
1004
+ path: '/webhooks/:webhook_id/:token',
1005
+ summary: 'Update webhook (token auth)',
1006
+ auth: 'webhook-token',
1007
+ category: 'webhooks',
1008
+ requestBody: [
1009
+ { name: 'name', type: 'string', required: false },
1010
+ { name: 'avatar', type: 'base64', required: false },
1011
+ { name: 'channel_id', type: 'string (snowflake)', required: false },
1012
+ ],
1013
+ responseRef: 'WebhookResponse',
1014
+ },
1015
+ {
1016
+ method: 'DELETE',
1017
+ path: '/webhooks/:webhook_id',
1018
+ summary: 'Delete webhook (bot token)',
1019
+ auth: 'bot',
1020
+ category: 'webhooks',
1021
+ responseCode: 204,
1022
+ },
1023
+ {
1024
+ method: 'DELETE',
1025
+ path: '/webhooks/:webhook_id/:token',
1026
+ summary: 'Delete webhook (token auth)',
1027
+ auth: 'webhook-token',
1028
+ category: 'webhooks',
1029
+ responseCode: 204,
1030
+ },
1031
+ {
1032
+ method: 'POST',
1033
+ path: '/webhooks/:webhook_id/:token',
1034
+ summary: 'Execute webhook',
1035
+ auth: 'webhook-token',
1036
+ category: 'webhooks',
1037
+ description: 'Token in URL. Use ?wait=true to receive MessageResponse instead of 204.',
1038
+ queryParams: [
1039
+ { name: 'wait', type: 'boolean', required: false, description: 'Return message if true' },
1040
+ ],
1041
+ requestBody: [
1042
+ ...sharedSchemas.messageRequest,
1043
+ {
1044
+ name: 'username',
1045
+ type: 'string',
1046
+ required: false,
1047
+ description: 'Override webhook username',
1048
+ },
1049
+ {
1050
+ name: 'avatar_url',
1051
+ type: 'string (URL)',
1052
+ required: false,
1053
+ description: 'Override webhook avatar',
1054
+ },
1055
+ ],
1056
+ responseBody: [
1057
+ {
1058
+ name: '204 or MessageResponse',
1059
+ type: 'see MessageResponse',
1060
+ description: 'If wait=true returns message',
1061
+ },
1062
+ ],
1063
+ responseCode: 204,
1064
+ },
1065
+ ];
1066
+
1067
+ export function getEndpointsByCategory() {
1068
+ const byCategory: Record<string, ApiEndpoint[]> = {};
1069
+ for (const cat of API_CATEGORIES) {
1070
+ byCategory[cat] = apiEndpoints.filter((e) => e.category === cat);
1071
+ }
1072
+ return byCategory;
1073
+ }