@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,80 @@
1
+ const eslint = require('@eslint/js');
2
+ const tseslint = require('typescript-eslint');
3
+ const prettierConfig = require('eslint-config-prettier');
4
+ const vuePlugin = require('eslint-plugin-vue');
5
+ const vueParser = require('vue-eslint-parser');
6
+ const globals = require('globals');
7
+
8
+ module.exports = tseslint.config(
9
+ {
10
+ ignores: [
11
+ 'node_modules/**',
12
+ 'dist/**',
13
+ 'coverage/**',
14
+ '*.config.js',
15
+ '*.config.cjs',
16
+ '*.config.mjs',
17
+ 'scripts/**',
18
+ '.turbo/**',
19
+ ],
20
+ },
21
+ eslint.configs.recommended,
22
+ ...tseslint.configs.recommended,
23
+ {
24
+ files: ['**/*.ts', '**/*.tsx', '**/*.js'],
25
+ rules: {
26
+ '@typescript-eslint/no-unused-vars': [
27
+ 'error',
28
+ { argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
29
+ ],
30
+ '@typescript-eslint/explicit-function-return-type': 'off',
31
+ '@typescript-eslint/no-explicit-any': 'warn',
32
+ '@typescript-eslint/no-non-null-assertion': 'off',
33
+ '@typescript-eslint/no-require-imports': 'off',
34
+ },
35
+ },
36
+ ...(vuePlugin.configs['flat/recommended'] || []),
37
+ {
38
+ files: ['**/*.vue'],
39
+ languageOptions: {
40
+ parser: vueParser,
41
+ parserOptions: {
42
+ parser: tseslint.parser,
43
+ extraFileExtensions: ['.vue'],
44
+ sourceType: 'module',
45
+ ecmaVersion: 'latest',
46
+ },
47
+ },
48
+ },
49
+ {
50
+ files: ['apps/docs/**/*.{ts,tsx,vue}'],
51
+ languageOptions: {
52
+ globals: {
53
+ ...globals.browser,
54
+ },
55
+ },
56
+ rules: {
57
+ 'vue/multi-word-component-names': 'off',
58
+ },
59
+ },
60
+ {
61
+ files: ['**/*.js'],
62
+ languageOptions: {
63
+ globals: {
64
+ ...globals.node,
65
+ },
66
+ },
67
+ },
68
+ {
69
+ files: ['examples/**/*.js'],
70
+ languageOptions: {
71
+ globals: {
72
+ ...globals.node,
73
+ },
74
+ },
75
+ rules: {
76
+ '@typescript-eslint/no-unused-vars': 'off',
77
+ },
78
+ },
79
+ prettierConfig,
80
+ );
@@ -0,0 +1,22 @@
1
+ # Required: Bot token from the Fluxer developer portal
2
+ FLUXER_BOT_TOKEN=your_bot_token_here
3
+
4
+ # Optional: Custom API base URL (default: https://api.fluxer.app)
5
+ # FLUXER_API_URL=https://api.fluxer.app
6
+
7
+ # Optional: Enable voice connection debug logging
8
+ # VOICE_DEBUG=1
9
+
10
+ # Optional: Use FFmpeg for video decoding (recommended on macOS)
11
+ # FLUXER_VIDEO_FFMPEG=1
12
+
13
+ # Reaction roles example: Message ID and channel ID for the roles message
14
+ # REACTION_ROLES_MESSAGE_ID=
15
+ # REACTION_ROLES_CHANNEL_ID=
16
+
17
+ # Reaction roles: Role IDs for each emoji
18
+ # ROLE_GAMING=
19
+ # ROLE_MUSIC=
20
+ # ROLE_ANNOUNCEMENTS=
21
+
22
+ # Moderation example: No extra env vars needed (requires Ban Members / Kick Members)
@@ -0,0 +1,68 @@
1
+ # erin.js SDK Examples
2
+
3
+ Example bots demonstrating common use cases with the erin.js SDK.
4
+
5
+ ## Quickest start
6
+
7
+ From the repo root after `pnpm install && pnpm run build`:
8
+
9
+ ```bash
10
+ FLUXER_BOT_TOKEN=your_token node examples/minimal-bot.js
11
+ ```
12
+
13
+ That runs the [minimal bot](minimal-bot.js) — login + `!ping` → Pong. Guide route: `/v/latest/guides/basic-bot`.
14
+
15
+ Public guide: https://erin.js.org/v/latest/guides/basic-bot
16
+
17
+ To browse guides locally, run `pnpm run docs:dev` from the repo root and open `http://localhost:3333`.
18
+
19
+ ## Setup
20
+
21
+ 1. Install dependencies from the repository root:
22
+
23
+ ```bash
24
+ pnpm install
25
+ pnpm run build
26
+ ```
27
+
28
+ 2. Copy `.env.example` to `.env` and fill in your credentials:
29
+
30
+ ```bash
31
+ cp .env.example .env
32
+ ```
33
+
34
+ 3. Run any example:
35
+
36
+ ```bash
37
+ FLUXER_BOT_TOKEN=your_token node examples/minimal-bot.js
38
+ ```
39
+
40
+ ## Examples
41
+
42
+ | Example | Description | Guide |
43
+ | ---------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------- |
44
+ | [minimal-bot.js](minimal-bot.js) | Login + `!ping` → Pong | `/v/latest/guides/basic-bot` |
45
+ | [first-steps-bot.js](first-steps-bot.js) | !ping, !hello, !avatar, !embed, !perms | `/v/latest/guides/basic-bot`, `/v/latest/guides/profile-urls`, `/v/latest/guides/permissions` |
46
+ | [ping-bot.js](ping-bot.js) | Prefix commands, embeds, DMs, voice, audio/video | `/v/latest/guides/basic-bot`, `/v/latest/guides/voice` |
47
+ | [reaction-bot.js](reaction-bot.js) | Simple reaction handling | `/v/latest/guides/reactions` |
48
+ | [reaction-roles-bot.js](reaction-roles-bot.js) | Reaction-based role assignment | `/v/latest/guides/reactions` |
49
+ | [webhook-bot.js](webhook-bot.js) | Webhook-based bot (no gateway) | `/v/latest/guides/webhooks` |
50
+ | [webi-bot.js](webi-bot.js) | Full webhook demo: embeds, files, all options | `/v/latest/guides/webhook-attachments-embeds` |
51
+ | [moderation-bot.js](moderation-bot.js) | Ban, kick, unban, !perms (permissions) | `/v/latest/guides/permissions`, `/v/latest/guides/moderation` |
52
+
53
+ ## Environment Variables
54
+
55
+ | Variable | Required | Description |
56
+ | --------------------------------- | ---------------------- | -------------------------------------------- |
57
+ | `FLUXER_BOT_TOKEN` | Yes (for gateway bots) | Bot token from the Fluxer developer portal |
58
+ | `FLUXER_SUPPRESS_DEPRECATION` | No | Set to `1` to silence deprecation warnings |
59
+ | `FLUXER_API_URL` | No | Custom API base URL |
60
+ | `VOICE_DEBUG` | No | Set to `1` for voice connection logs |
61
+ | `FLUXER_VIDEO_FFMPEG` | No | Set to `1` for FFmpeg video decoding (macOS) |
62
+ | `REACTION_ROLES_MESSAGE_ID` | No | Message ID for reaction roles |
63
+ | `REACTION_ROLES_CHANNEL_ID` | No | Channel ID for reaction roles |
64
+ | `ROLE_GAMING`, `ROLE_MUSIC`, etc. | No | Role IDs for reaction roles emoji mapping |
65
+
66
+ ## Documentation
67
+
68
+ Full API reference: https://erin.js.org (or run `pnpm run docs:dev` and open `http://localhost:3333` for local docs).
@@ -0,0 +1,118 @@
1
+ /**
2
+ * First Steps Bot — five starter commands to learn the SDK.
3
+ *
4
+ * Commands: !ping, !hello [name], !avatar [@user], !embed, !perms
5
+ *
6
+ * Usage (from repo root after pnpm install && pnpm run build):
7
+ * FLUXER_BOT_TOKEN=your_token node examples/first-steps-bot.js
8
+ *
9
+ * Guide route (local docs): /v/latest/guides/basic-bot
10
+ */
11
+
12
+ import {
13
+ Client,
14
+ Events,
15
+ EmbedBuilder,
16
+ parsePrefixCommand,
17
+ parseUserMention,
18
+ PermissionFlags,
19
+ } from '@erinjs/core';
20
+
21
+ const PREFIX = '!';
22
+ const client = new Client({ intents: 0 });
23
+
24
+ client.on(Events.Ready, () => console.log('Ready!'));
25
+
26
+ client.on(Events.MessageCreate, async (message) => {
27
+ if (message.author.bot || !message.content) return;
28
+
29
+ const parsed = parsePrefixCommand(message.content, PREFIX);
30
+ if (!parsed) return;
31
+
32
+ const { command, args } = parsed;
33
+
34
+ try {
35
+ if (command === 'ping') {
36
+ await message.reply('Pong!');
37
+ return;
38
+ }
39
+
40
+ if (command === 'hello') {
41
+ const name = args[0] ?? message.author.username;
42
+ await message.reply(`Hello, ${name}!`);
43
+ return;
44
+ }
45
+
46
+ if (command === 'avatar') {
47
+ const target = args[0];
48
+ const userId = target ? parseUserMention(target) : message.author.id;
49
+ if (!userId) {
50
+ await message.reply('Mention a user or leave empty for yourself: `!avatar @user`');
51
+ return;
52
+ }
53
+ const user =
54
+ userId === message.author.id
55
+ ? message.author
56
+ : await client.users.fetch(userId).catch(() => null);
57
+ if (!user) {
58
+ await message.reply('Could not find that user.');
59
+ return;
60
+ }
61
+ const embed = new EmbedBuilder()
62
+ .setTitle(`${user.username}'s avatar`)
63
+ .setImage(user.displayAvatarURL({ size: 256 }))
64
+ .setColor(user.avatarColor ?? 0x5865f2)
65
+ .setTimestamp();
66
+ await message.reply({ embeds: [embed] });
67
+ return;
68
+ }
69
+
70
+ if (command === 'embed') {
71
+ const embed = new EmbedBuilder()
72
+ .setTitle('First embed')
73
+ .setDescription('You just sent an embed!')
74
+ .setColor(0x5865f2)
75
+ .addFields(
76
+ { name: 'Field 1', value: 'Value 1', inline: true },
77
+ { name: 'Field 2', value: 'Value 2', inline: true },
78
+ )
79
+ .setFooter({ text: 'erin.js' })
80
+ .setTimestamp();
81
+ await message.reply({ embeds: [embed] });
82
+ return;
83
+ }
84
+
85
+ if (command === 'perms') {
86
+ if (!message.guildId) {
87
+ await message.reply('Use this command in a server.');
88
+ return;
89
+ }
90
+ const guild = await client.guilds.resolve(message.guildId);
91
+ if (!guild) {
92
+ await message.reply('Could not find this server.');
93
+ return;
94
+ }
95
+ const member = await guild.members.resolve(message.author.id);
96
+ const has = (flag) => member.permissions.has(flag);
97
+ const permNames = [];
98
+ if (has(PermissionFlags.BanMembers)) permNames.push('BanMembers');
99
+ if (has(PermissionFlags.KickMembers)) permNames.push('KickMembers');
100
+ if (has(PermissionFlags.Administrator)) permNames.push('Administrator');
101
+ if (has(PermissionFlags.ManageRoles)) permNames.push('ManageRoles');
102
+ const embed = new EmbedBuilder()
103
+ .setTitle('Your permissions')
104
+ .setDescription(permNames.length ? permNames.join(', ') : '*(none of the common flags)*')
105
+ .setColor(0x57f287)
106
+ .setTimestamp();
107
+ await message.reply({ embeds: [embed] });
108
+ return;
109
+ }
110
+ } catch (err) {
111
+ console.error('Command error:', err);
112
+ await message.reply('Something went wrong.').catch(() => {});
113
+ }
114
+ });
115
+
116
+ client.on(Events.Error, (err) => console.error('Client error:', err));
117
+
118
+ await client.login(process.env.FLUXER_BOT_TOKEN);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Minimal erin.js bot — login + !ping → Pong.
3
+ * Usage: FLUXER_BOT_TOKEN=your_token node examples/minimal-bot.js
4
+ *
5
+ * Guide route (local docs): /v/latest/guides/basic-bot
6
+ */
7
+
8
+ import { Client, Events } from '@erinjs/core';
9
+
10
+ const client = new Client({ intents: 0 });
11
+
12
+ client.on(Events.Ready, () => console.log('Ready!'));
13
+ client.on(Events.MessageCreate, async (m) => {
14
+ if (m.content === '!ping') await m.reply('Pong');
15
+ });
16
+
17
+ await client.login(process.env.FLUXER_BOT_TOKEN);
@@ -0,0 +1,209 @@
1
+ /**
2
+ * erin.js Moderation Example
3
+ *
4
+ * Prefix commands for ban, kick, and unban. Requires Ban Members / Kick Members permissions.
5
+ * Server owner automatically has all permissions (no role needed).
6
+ *
7
+ * Commands:
8
+ * !ban @user [reason] - Ban a user (optional: delete messages from last 24h)
9
+ * !kick @user [reason] - Kick a user
10
+ * !unban @user - Remove a ban
11
+ * !perms - List your guild-level permissions (owner sees all)
12
+ *
13
+ * Usage:
14
+ * FLUXER_BOT_TOKEN=your_token node examples/moderation-bot.js
15
+ *
16
+ * @see /v/latest/guides/permissions (local docs)
17
+ * @see /v/latest/guides/moderation (local docs)
18
+ */
19
+
20
+ import {
21
+ Client,
22
+ Events,
23
+ EmbedBuilder,
24
+ FluxerError,
25
+ ErrorCodes,
26
+ PermissionFlags,
27
+ } from '@erinjs/core';
28
+
29
+ const PREFIX = '!';
30
+
31
+ /** Get the member who sent the message and their guild-level permissions. */
32
+ async function getModeratorPerms(message) {
33
+ let guild = message.guild;
34
+ if (!guild && message.guildId) {
35
+ guild = await message.client.guilds.fetch(message.guildId);
36
+ }
37
+ if (!guild) return null;
38
+ let member = guild.members.get(message.author.id);
39
+ if (!member) {
40
+ try {
41
+ member = await guild.fetchMember(message.author.id);
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ return member.permissions;
47
+ }
48
+
49
+ /** Extract user ID from mention (<@123> or <@!123>) or raw snowflake. */
50
+ function parseUserId(arg) {
51
+ if (!arg?.trim()) return null;
52
+ const mentionMatch = arg.trim().match(/^<@!?(\d{17,19})>$/);
53
+ if (mentionMatch) return mentionMatch[1];
54
+ if (/^\d{17,19}$/.test(arg.trim())) return arg.trim();
55
+ return null;
56
+ }
57
+
58
+ const client = new Client({ intents: 0 });
59
+
60
+ client.on(Events.Ready, () => {
61
+ console.log(
62
+ `Logged in as ${client.user?.username}. Moderation commands: !ban, !kick, !unban, !perms`,
63
+ );
64
+ });
65
+
66
+ /** Return array of permission names the user has. */
67
+ function getPermissionNames(perms) {
68
+ return Object.keys(PermissionFlags).filter((name) => perms.has(PermissionFlags[name]));
69
+ }
70
+
71
+ client.on(Events.MessageCreate, async (message) => {
72
+ if (message.author.bot || !message.content?.startsWith(PREFIX)) return;
73
+
74
+ const args = message.content.slice(PREFIX.length).trim().split(/\s+/);
75
+ const command = args[0]?.toLowerCase();
76
+ const targetArg = args[1];
77
+ const reason = args.slice(2).join(' ') || null;
78
+
79
+ let guild = message.guild;
80
+ if (!guild && message.guildId) {
81
+ guild = await message.client.guilds.fetch(message.guildId);
82
+ }
83
+ if (!guild) {
84
+ await message.reply('Moderation commands only work in a server.');
85
+ return;
86
+ }
87
+
88
+ const userId = parseUserId(targetArg);
89
+ const perms = await getModeratorPerms(message);
90
+ if (!perms) {
91
+ await message.reply(
92
+ 'Could not load your member data. The bot may need access to view server members.',
93
+ );
94
+ return;
95
+ }
96
+
97
+ const canBan = perms.has(PermissionFlags.BanMembers) || perms.has(PermissionFlags.Administrator);
98
+ const canKick =
99
+ perms.has(PermissionFlags.KickMembers) || perms.has(PermissionFlags.Administrator);
100
+
101
+ if (command === 'perms') {
102
+ const names = getPermissionNames(perms);
103
+ await message.reply(
104
+ names.length > 0
105
+ ? `**Your server permissions:**\n\`\`\`\n${names.join(', ')}\n\`\`\``
106
+ : 'You have no server permissions.',
107
+ );
108
+ return;
109
+ }
110
+
111
+ if (command === 'ban') {
112
+ if (!canBan) {
113
+ await message.reply('You need the Ban Members permission to use this command.');
114
+ return;
115
+ }
116
+ if (!userId) {
117
+ await message.reply('Usage: `!ban @user [reason]`');
118
+ return;
119
+ }
120
+ try {
121
+ await guild.ban(userId, {
122
+ reason: reason ?? undefined,
123
+ delete_message_days: 1,
124
+ });
125
+ const targetUser = message.mentions.find((u) => u.id === userId) ?? { username: 'Unknown' };
126
+ const embed = new EmbedBuilder()
127
+ .setTitle('User Banned')
128
+ .setColor(0xe74c3c)
129
+ .addFields(
130
+ { name: 'User', value: `<@${userId}> (${targetUser.username})`, inline: true },
131
+ { name: 'Moderator', value: `${message.author.username}`, inline: true },
132
+ )
133
+ .setTimestamp();
134
+ if (reason) embed.addFields({ name: 'Reason', value: reason });
135
+ await message.reply({ embeds: [embed.toJSON()] });
136
+ } catch (err) {
137
+ const code = err instanceof FluxerError ? err.code : null;
138
+ const status = err?.statusCode ?? err?.cause?.statusCode;
139
+ const msg =
140
+ code === ErrorCodes.MemberNotFound || status === 404
141
+ ? 'User not found or not in this server.'
142
+ : (err?.message ?? 'Failed to ban user.');
143
+ await message.reply(`Error: ${msg}`);
144
+ }
145
+ return;
146
+ }
147
+
148
+ if (command === 'kick') {
149
+ if (!canKick) {
150
+ await message.reply('You need the Kick Members permission to use this command.');
151
+ return;
152
+ }
153
+ if (!userId) {
154
+ await message.reply('Usage: `!kick @user [reason]`');
155
+ return;
156
+ }
157
+ try {
158
+ await guild.kick(userId);
159
+ const targetUser = message.mentions.find((u) => u.id === userId) ?? { username: 'Unknown' };
160
+ const embed = new EmbedBuilder()
161
+ .setTitle('User Kicked')
162
+ .setColor(0xf39c12)
163
+ .addFields(
164
+ { name: 'User', value: `<@${userId}> (${targetUser.username})`, inline: true },
165
+ { name: 'Moderator', value: `${message.author.username}`, inline: true },
166
+ )
167
+ .setTimestamp();
168
+ if (reason) embed.addFields({ name: 'Reason', value: reason });
169
+ await message.reply({ embeds: [embed.toJSON()] });
170
+ } catch (err) {
171
+ const code = err instanceof FluxerError ? err.code : null;
172
+ const status = err?.statusCode ?? err?.cause?.statusCode;
173
+ const msg =
174
+ code === ErrorCodes.MemberNotFound || status === 404
175
+ ? 'User not found or not in this server.'
176
+ : (err?.message ?? 'Failed to kick user.');
177
+ await message.reply(`Error: ${msg}`);
178
+ }
179
+ return;
180
+ }
181
+
182
+ if (command === 'unban') {
183
+ if (!canBan) {
184
+ await message.reply('You need the Ban Members permission to use this command.');
185
+ return;
186
+ }
187
+ if (!userId) {
188
+ await message.reply('Usage: `!unban @user`');
189
+ return;
190
+ }
191
+ try {
192
+ await guild.unban(userId);
193
+ await message.reply(`Unbanned <@${userId}>.`);
194
+ } catch (err) {
195
+ const status = err?.statusCode ?? err?.cause?.statusCode;
196
+ const msg =
197
+ status === 404 ? 'User is not banned.' : (err?.message ?? 'Failed to unban user.');
198
+ await message.reply(`Error: ${msg}`);
199
+ }
200
+ return;
201
+ }
202
+ });
203
+
204
+ client.on(Events.Error, (err) => console.error('[fluxer]', err));
205
+
206
+ client.login(process.env.FLUXER_BOT_TOKEN).catch((err) => {
207
+ console.error('Login failed:', err);
208
+ process.exit(1);
209
+ });
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "fluxer-examples",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "lint": "eslint . --max-warnings 0 --config ../eslint.config.js",
7
+ "lint:fix": "eslint . --fix --config ../eslint.config.js"
8
+ },
9
+ "dependencies": {
10
+ "@erinjs/core": "workspace:*",
11
+ "@erinjs/voice": "workspace:*",
12
+ "youtube-dl-exec": "^3.1.1"
13
+ }
14
+ }