trivious 1.3.26 → 1.4.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 (51) hide show
  1. package/dist/core/client/trivious.client.cjs +20 -2
  2. package/dist/core/client/trivious.client.cjs.map +1 -1
  3. package/dist/core/client/trivious.client.d.cts +1 -1
  4. package/dist/core/client/trivious.client.d.ts +1 -1
  5. package/dist/core/client/trivious.client.js +16 -2
  6. package/dist/core/client/trivious.client.js.map +1 -1
  7. package/dist/core/commands/command.base.d.cts +1 -1
  8. package/dist/core/commands/command.base.d.ts +1 -1
  9. package/dist/core/commands/subcommand.base.d.cts +1 -1
  10. package/dist/core/commands/subcommand.base.d.ts +1 -1
  11. package/dist/core/components/component.base.d.cts +1 -1
  12. package/dist/core/components/component.base.d.ts +1 -1
  13. package/dist/core/events/clientReady.d.cts +1 -1
  14. package/dist/core/events/clientReady.d.ts +1 -1
  15. package/dist/core/events/interactionCreate.d.cts +1 -1
  16. package/dist/core/events/interactionCreate.d.ts +1 -1
  17. package/dist/core/registry/command.registry.d.cts +1 -1
  18. package/dist/core/registry/command.registry.d.ts +1 -1
  19. package/dist/core/registry/component.registry.d.cts +1 -1
  20. package/dist/core/registry/component.registry.d.ts +1 -1
  21. package/dist/core/registry/event.registry.d.cts +1 -1
  22. package/dist/core/registry/event.registry.d.ts +1 -1
  23. package/dist/core/registry/index.d.cts +1 -1
  24. package/dist/core/registry/index.d.ts +1 -1
  25. package/dist/core/registry/module.registry.d.cts +1 -1
  26. package/dist/core/registry/module.registry.d.ts +1 -1
  27. package/dist/{index-5IsAwOsi.d.ts → index-D5NcshUu.d.ts} +13 -0
  28. package/dist/{index-BjPKCNAw.d.cts → index-SutqlRMo.d.cts} +13 -0
  29. package/dist/index.d.cts +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/shared/typings/client.d.cts +1 -1
  32. package/dist/shared/typings/client.d.ts +1 -1
  33. package/dist/shared/typings/commands.d.cts +1 -1
  34. package/dist/shared/typings/commands.d.ts +1 -1
  35. package/dist/shared/typings/components.d.cts +1 -1
  36. package/dist/shared/typings/components.d.ts +1 -1
  37. package/dist/shared/typings/events.d.cts +1 -1
  38. package/dist/shared/typings/events.d.ts +1 -1
  39. package/dist/shared/typings/index.d.cts +1 -1
  40. package/dist/shared/typings/index.d.ts +1 -1
  41. package/dist/shared/typings/module.d.cts +1 -1
  42. package/dist/shared/typings/module.d.ts +1 -1
  43. package/dist/shared/typings/permissions.d.cts +1 -1
  44. package/dist/shared/typings/permissions.d.ts +1 -1
  45. package/dist/shared/utility/functions.cjs +8 -0
  46. package/dist/shared/utility/functions.cjs.map +1 -1
  47. package/dist/shared/utility/functions.d.cts +4 -3
  48. package/dist/shared/utility/functions.d.ts +4 -3
  49. package/dist/shared/utility/functions.js +8 -1
  50. package/dist/shared/utility/functions.js.map +1 -1
  51. package/package.json +1 -1
@@ -2,6 +2,13 @@
2
2
 
3
3
  var discord_js = require('discord.js');
4
4
  var index_js = require('../registry/index.js');
5
+ var functions_js = require('../../shared/utility/functions.js');
6
+ var path = require('node:path');
7
+ var node_fs = require('node:fs');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var path__default = /*#__PURE__*/_interopDefault(path);
5
12
 
6
13
  class TriviousClient extends discord_js.Client {
7
14
  /**
@@ -63,11 +70,22 @@ class TriviousClient extends discord_js.Client {
63
70
  * @returns {*}
64
71
  */
65
72
  async deploy() {
73
+ const { commandHashConfig } = this._options;
66
74
  const clientId = process.env[this._options.clientIdReference];
67
75
  const token = process.env[this._options.tokenReference];
68
76
  if (!clientId || !token) throw new Error("[Trivious] Invalid clientId or token reference");
69
- const slashCommands = Array.from(this.registries.commands.get().values());
70
- const body = [...slashCommands.map((command) => command.toJSON())];
77
+ const commands = Array.from(this.registries.commands.get().values());
78
+ const body = [...commands.map((command) => command.toJSON())];
79
+ if (commandHashConfig.enabled) {
80
+ const hashFile = path__default.default.join(commandHashConfig.filePath || "data", "commands.hash");
81
+ const newHash = await functions_js.hashCommands(body);
82
+ let oldHash = "";
83
+ if (await functions_js.exists(hashFile)) oldHash = node_fs.readFileSync(hashFile, "utf-8");
84
+ if (newHash === oldHash) {
85
+ console.debug(`[Trivious] No changes in commands found, skipping deployment`);
86
+ return;
87
+ }
88
+ }
71
89
  const rest = new discord_js.REST({ version: "10" }).setToken(token);
72
90
  await rest.put(discord_js.Routes.applicationCommands(clientId), { body });
73
91
  console.log(`[Trivious] Deployed ${body.length} commands`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/client/trivious.client.ts"],"names":["Client","registries","REST","Routes"],"mappings":"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","file":"trivious.client.cjs","sourcesContent":["import { Client, REST, Routes } from \"discord.js\";\nimport { registries } from \"../registry/index.js\";\nimport { TriviousClientOptions, PermissionLevel } from \"src/shared/typings/index.js\";\n\n/**\n * Trivious base client.\n *\n * @export\n * @class TriviousClient\n * @typedef {TriviousClient}\n * @extends {Client}\n */\nexport default class TriviousClient extends Client {\n\t/**\n\t * Client registries.\n\t *\n\t * @public\n\t * @readonly\n\t * @type {*}\n\t */\n\tpublic readonly registries = registries();\n\t/**\n\t * Client copy of the constructor options.\n\t *\n\t * @private\n\t * @type {TriviousClientOptions}\n\t */\n\tpublic readonly _options: TriviousClientOptions;\n\n\t/**\n\t * Creates an instance of TriviousClient.\n\t *\n\t * @constructor\n\t * @param {TriviousClientOptions} options\n\t */\n\tconstructor(options: TriviousClientOptions) {\n\t\tsuper(options);\n\t\tthis._options = options;\n\t}\n\n\t/**\n\t * Load all registries.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync register() {\n\t\tconst { registries } = this;\n\t\tawait registries.loadAll(this._options);\n\t\tconsole.log(\n\t\t\t`[Trivious] Loaded all registries (${registries.commands.get().size} commands, ${registries.events.get().size} events, ${registries.components.get().size} components, ${registries.modules.get().size} modules)`\n\t\t);\n\t}\n\n\t/**\n\t * Login and start the bot.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync start() {\n\t\tif (!process.env[this._options.tokenReference]) {\n\t\t\tif (process.env.NODE_ENV !== \"production\") return;\n\t\t\telse throw new Error(\"[Trivious] Invalid token reference\");\n\t\t}\n\n\t\tthis.registries.bind(this);\n\t\tawait this.login(process.env[this._options.tokenReference]);\n\t}\n\n\t/**\n\t * Deploy all commands.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync deploy() {\n\t\tconst clientId = process.env[this._options.clientIdReference];\n\t\tconst token = process.env[this._options.tokenReference];\n\t\tif (!clientId || !token) throw new Error(\"[Trivious] Invalid clientId or token reference\");\n\n\t\tconst slashCommands = Array.from(this.registries.commands.get().values());\n\t\tconst body = [...slashCommands.map(command => command.toJSON())];\n\n\t\tconst rest = new REST({ version: \"10\" }).setToken(token);\n\t\tawait rest.put(Routes.applicationCommands(clientId), { body });\n\t\tconsole.log(`[Trivious] Deployed ${body.length} commands`);\n\t}\n\n\t/**\n\t * Set the roles tied to a permission level.\n\t *\n\t * @param {Record<string, PermissionLevel>} roles\n\t */\n\tsetRolePermissions(roles: Record<string, PermissionLevel>) {\n\t\tthis._options.rolePermissions = roles;\n\t}\n\n\tget rolePermissions() {\n\t\treturn this._options.rolePermissions ?? {};\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../src/core/client/trivious.client.ts"],"names":["Client","registries","path","hashCommands","exists","readFileSync","REST","Routes"],"mappings":"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","file":"trivious.client.cjs","sourcesContent":["import { Client, REST, Routes } from \"discord.js\";\nimport { registries } from \"../registry/index.js\";\nimport { TriviousClientOptions, PermissionLevel } from \"src/shared/typings/index.js\";\nimport { exists, hashCommands } from \"src/shared/utility/functions.js\";\nimport path from \"node:path\";\nimport { readFileSync } from \"node:fs\";\n\n/**\n * Trivious base client.\n *\n * @export\n * @class TriviousClient\n * @typedef {TriviousClient}\n * @extends {Client}\n */\nexport default class TriviousClient extends Client {\n\t/**\n\t * Client registries.\n\t *\n\t * @public\n\t * @readonly\n\t * @type {*}\n\t */\n\tpublic readonly registries = registries();\n\t/**\n\t * Client copy of the constructor options.\n\t *\n\t * @private\n\t * @type {TriviousClientOptions}\n\t */\n\tpublic readonly _options: TriviousClientOptions;\n\n\t/**\n\t * Creates an instance of TriviousClient.\n\t *\n\t * @constructor\n\t * @param {TriviousClientOptions} options\n\t */\n\tconstructor(options: TriviousClientOptions) {\n\t\tsuper(options);\n\t\tthis._options = options;\n\t}\n\n\t/**\n\t * Load all registries.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync register() {\n\t\tconst { registries } = this;\n\t\tawait registries.loadAll(this._options);\n\t\tconsole.log(\n\t\t\t`[Trivious] Loaded all registries (${registries.commands.get().size} commands, ${registries.events.get().size} events, ${registries.components.get().size} components, ${registries.modules.get().size} modules)`\n\t\t);\n\t}\n\n\t/**\n\t * Login and start the bot.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync start() {\n\t\tif (!process.env[this._options.tokenReference]) {\n\t\t\tif (process.env.NODE_ENV !== \"production\") return;\n\t\t\telse throw new Error(\"[Trivious] Invalid token reference\");\n\t\t}\n\n\t\tthis.registries.bind(this);\n\t\tawait this.login(process.env[this._options.tokenReference]);\n\t}\n\n\t/**\n\t * Deploy all commands.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync deploy() {\n\t\tconst { commandHashConfig } = this._options;\n\t\tconst clientId = process.env[this._options.clientIdReference];\n\t\tconst token = process.env[this._options.tokenReference];\n\t\tif (!clientId || !token) throw new Error(\"[Trivious] Invalid clientId or token reference\");\n\n\t\tconst commands = Array.from(this.registries.commands.get().values());\n\t\tconst body = [...commands.map(command => command.toJSON())];\n\n\t\tif (commandHashConfig.enabled) {\n\t\t\tconst hashFile = path.join(commandHashConfig.filePath || \"data\", \"commands.hash\");\n\t\t\tconst newHash = await hashCommands(body);\n\t\t\tlet oldHash = \"\";\n\n\t\t\tif (await exists(hashFile)) oldHash = readFileSync(hashFile, \"utf-8\");\n\t\t\tif (newHash === oldHash) {\n\t\t\t\tconsole.debug(`[Trivious] No changes in commands found, skipping deployment`)\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst rest = new REST({ version: \"10\" }).setToken(token);\n\t\tawait rest.put(Routes.applicationCommands(clientId), { body });\n\t\tconsole.log(`[Trivious] Deployed ${body.length} commands`);\n\t}\n\n\t/**\n\t * Set the roles tied to a permission level.\n\t *\n\t * @param {Record<string, PermissionLevel>} roles\n\t */\n\tsetRolePermissions(roles: Record<string, PermissionLevel>) {\n\t\tthis._options.rolePermissions = roles;\n\t}\n\n\tget rolePermissions() {\n\t\treturn this._options.rolePermissions ?? {};\n\t}\n}\n"]}
@@ -1,3 +1,3 @@
1
- export { T as default } from '../../index-BjPKCNAw.cjs';
1
+ export { T as default } from '../../index-SutqlRMo.cjs';
2
2
  import 'discord.js';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
- export { T as default } from '../../index-5IsAwOsi.js';
1
+ export { T as default } from '../../index-D5NcshUu.js';
2
2
  import 'discord.js';
3
3
  import '../../shared/typings/registry.js';
@@ -1,5 +1,8 @@
1
1
  import { Client, REST, Routes } from 'discord.js';
2
2
  import { registries } from '../registry/index.js';
3
+ import { hashCommands, exists } from '../../shared/utility/functions.js';
4
+ import path from 'node:path';
5
+ import { readFileSync } from 'node:fs';
3
6
 
4
7
  class TriviousClient extends Client {
5
8
  /**
@@ -61,11 +64,22 @@ class TriviousClient extends Client {
61
64
  * @returns {*}
62
65
  */
63
66
  async deploy() {
67
+ const { commandHashConfig } = this._options;
64
68
  const clientId = process.env[this._options.clientIdReference];
65
69
  const token = process.env[this._options.tokenReference];
66
70
  if (!clientId || !token) throw new Error("[Trivious] Invalid clientId or token reference");
67
- const slashCommands = Array.from(this.registries.commands.get().values());
68
- const body = [...slashCommands.map((command) => command.toJSON())];
71
+ const commands = Array.from(this.registries.commands.get().values());
72
+ const body = [...commands.map((command) => command.toJSON())];
73
+ if (commandHashConfig.enabled) {
74
+ const hashFile = path.join(commandHashConfig.filePath || "data", "commands.hash");
75
+ const newHash = await hashCommands(body);
76
+ let oldHash = "";
77
+ if (await exists(hashFile)) oldHash = readFileSync(hashFile, "utf-8");
78
+ if (newHash === oldHash) {
79
+ console.debug(`[Trivious] No changes in commands found, skipping deployment`);
80
+ return;
81
+ }
82
+ }
69
83
  const rest = new REST({ version: "10" }).setToken(token);
70
84
  await rest.put(Routes.applicationCommands(clientId), { body });
71
85
  console.log(`[Trivious] Deployed ${body.length} commands`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/client/trivious.client.ts"],"names":["registries"],"mappings":";;;AAYA,MAAO,uBAAqC,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlC,aAAa,UAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhB,YAAY,OAAA,EAAgC;AAC3C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAA,GAAW;AAChB,IAAA,MAAM,EAAE,UAAA,EAAAA,WAAAA,EAAW,GAAI,IAAA;AACvB,IAAA,MAAMA,WAAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACtC,IAAA,OAAA,CAAQ,GAAA;AAAA,MACP,CAAA,kCAAA,EAAqCA,YAAW,QAAA,CAAS,GAAA,GAAM,IAAI,CAAA,WAAA,EAAcA,WAAAA,CAAW,MAAA,CAAO,GAAA,EAAI,CAAE,IAAI,CAAA,SAAA,EAAYA,WAAAA,CAAW,UAAA,CAAW,GAAA,EAAI,CAAE,IAAI,gBAAgBA,WAAAA,CAAW,OAAA,CAAQ,GAAA,EAAI,CAAE,IAAI,CAAA,SAAA;AAAA,KACvM;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAA,GAAQ;AACb,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,EAAG;AAC/C,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AAAA,WACtC,MAAM,IAAI,KAAA,CAAM,oCAAoC,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,IAAI,CAAA;AACzB,IAAA,MAAM,KAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,GAAS;AACd,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAS,iBAAiB,CAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAS,cAAc,CAAA;AACtD,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAO,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAEzF,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,IAAA,CAAK,WAAW,QAAA,CAAS,GAAA,EAAI,CAAE,MAAA,EAAQ,CAAA;AACxE,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,aAAA,CAAc,IAAI,CAAA,OAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAE/D,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,SAAS,IAAA,EAAM,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACvD,IAAA,MAAM,IAAA,CAAK,IAAI,MAAA,CAAO,mBAAA,CAAoB,QAAQ,CAAA,EAAG,EAAE,MAAM,CAAA;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,IAAA,CAAK,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,KAAA,EAAwC;AAC1D,IAAA,IAAA,CAAK,SAAS,eAAA,GAAkB,KAAA;AAAA,EACjC;AAAA,EAEA,IAAI,eAAA,GAAkB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,eAAA,IAAmB,EAAC;AAAA,EAC1C;AACD","file":"trivious.client.js","sourcesContent":["import { Client, REST, Routes } from \"discord.js\";\nimport { registries } from \"../registry/index.js\";\nimport { TriviousClientOptions, PermissionLevel } from \"src/shared/typings/index.js\";\n\n/**\n * Trivious base client.\n *\n * @export\n * @class TriviousClient\n * @typedef {TriviousClient}\n * @extends {Client}\n */\nexport default class TriviousClient extends Client {\n\t/**\n\t * Client registries.\n\t *\n\t * @public\n\t * @readonly\n\t * @type {*}\n\t */\n\tpublic readonly registries = registries();\n\t/**\n\t * Client copy of the constructor options.\n\t *\n\t * @private\n\t * @type {TriviousClientOptions}\n\t */\n\tpublic readonly _options: TriviousClientOptions;\n\n\t/**\n\t * Creates an instance of TriviousClient.\n\t *\n\t * @constructor\n\t * @param {TriviousClientOptions} options\n\t */\n\tconstructor(options: TriviousClientOptions) {\n\t\tsuper(options);\n\t\tthis._options = options;\n\t}\n\n\t/**\n\t * Load all registries.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync register() {\n\t\tconst { registries } = this;\n\t\tawait registries.loadAll(this._options);\n\t\tconsole.log(\n\t\t\t`[Trivious] Loaded all registries (${registries.commands.get().size} commands, ${registries.events.get().size} events, ${registries.components.get().size} components, ${registries.modules.get().size} modules)`\n\t\t);\n\t}\n\n\t/**\n\t * Login and start the bot.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync start() {\n\t\tif (!process.env[this._options.tokenReference]) {\n\t\t\tif (process.env.NODE_ENV !== \"production\") return;\n\t\t\telse throw new Error(\"[Trivious] Invalid token reference\");\n\t\t}\n\n\t\tthis.registries.bind(this);\n\t\tawait this.login(process.env[this._options.tokenReference]);\n\t}\n\n\t/**\n\t * Deploy all commands.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync deploy() {\n\t\tconst clientId = process.env[this._options.clientIdReference];\n\t\tconst token = process.env[this._options.tokenReference];\n\t\tif (!clientId || !token) throw new Error(\"[Trivious] Invalid clientId or token reference\");\n\n\t\tconst slashCommands = Array.from(this.registries.commands.get().values());\n\t\tconst body = [...slashCommands.map(command => command.toJSON())];\n\n\t\tconst rest = new REST({ version: \"10\" }).setToken(token);\n\t\tawait rest.put(Routes.applicationCommands(clientId), { body });\n\t\tconsole.log(`[Trivious] Deployed ${body.length} commands`);\n\t}\n\n\t/**\n\t * Set the roles tied to a permission level.\n\t *\n\t * @param {Record<string, PermissionLevel>} roles\n\t */\n\tsetRolePermissions(roles: Record<string, PermissionLevel>) {\n\t\tthis._options.rolePermissions = roles;\n\t}\n\n\tget rolePermissions() {\n\t\treturn this._options.rolePermissions ?? {};\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../src/core/client/trivious.client.ts"],"names":["registries"],"mappings":"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","file":"trivious.client.js","sourcesContent":["import { Client, REST, Routes } from \"discord.js\";\nimport { registries } from \"../registry/index.js\";\nimport { TriviousClientOptions, PermissionLevel } from \"src/shared/typings/index.js\";\nimport { exists, hashCommands } from \"src/shared/utility/functions.js\";\nimport path from \"node:path\";\nimport { readFileSync } from \"node:fs\";\n\n/**\n * Trivious base client.\n *\n * @export\n * @class TriviousClient\n * @typedef {TriviousClient}\n * @extends {Client}\n */\nexport default class TriviousClient extends Client {\n\t/**\n\t * Client registries.\n\t *\n\t * @public\n\t * @readonly\n\t * @type {*}\n\t */\n\tpublic readonly registries = registries();\n\t/**\n\t * Client copy of the constructor options.\n\t *\n\t * @private\n\t * @type {TriviousClientOptions}\n\t */\n\tpublic readonly _options: TriviousClientOptions;\n\n\t/**\n\t * Creates an instance of TriviousClient.\n\t *\n\t * @constructor\n\t * @param {TriviousClientOptions} options\n\t */\n\tconstructor(options: TriviousClientOptions) {\n\t\tsuper(options);\n\t\tthis._options = options;\n\t}\n\n\t/**\n\t * Load all registries.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync register() {\n\t\tconst { registries } = this;\n\t\tawait registries.loadAll(this._options);\n\t\tconsole.log(\n\t\t\t`[Trivious] Loaded all registries (${registries.commands.get().size} commands, ${registries.events.get().size} events, ${registries.components.get().size} components, ${registries.modules.get().size} modules)`\n\t\t);\n\t}\n\n\t/**\n\t * Login and start the bot.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync start() {\n\t\tif (!process.env[this._options.tokenReference]) {\n\t\t\tif (process.env.NODE_ENV !== \"production\") return;\n\t\t\telse throw new Error(\"[Trivious] Invalid token reference\");\n\t\t}\n\n\t\tthis.registries.bind(this);\n\t\tawait this.login(process.env[this._options.tokenReference]);\n\t}\n\n\t/**\n\t * Deploy all commands.\n\t *\n\t * @async\n\t * @returns {*}\n\t */\n\tasync deploy() {\n\t\tconst { commandHashConfig } = this._options;\n\t\tconst clientId = process.env[this._options.clientIdReference];\n\t\tconst token = process.env[this._options.tokenReference];\n\t\tif (!clientId || !token) throw new Error(\"[Trivious] Invalid clientId or token reference\");\n\n\t\tconst commands = Array.from(this.registries.commands.get().values());\n\t\tconst body = [...commands.map(command => command.toJSON())];\n\n\t\tif (commandHashConfig.enabled) {\n\t\t\tconst hashFile = path.join(commandHashConfig.filePath || \"data\", \"commands.hash\");\n\t\t\tconst newHash = await hashCommands(body);\n\t\t\tlet oldHash = \"\";\n\n\t\t\tif (await exists(hashFile)) oldHash = readFileSync(hashFile, \"utf-8\");\n\t\t\tif (newHash === oldHash) {\n\t\t\t\tconsole.debug(`[Trivious] No changes in commands found, skipping deployment`)\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst rest = new REST({ version: \"10\" }).setToken(token);\n\t\tawait rest.put(Routes.applicationCommands(clientId), { body });\n\t\tconsole.log(`[Trivious] Deployed ${body.length} commands`);\n\t}\n\n\t/**\n\t * Set the roles tied to a permission level.\n\t *\n\t * @param {Record<string, PermissionLevel>} roles\n\t */\n\tsetRolePermissions(roles: Record<string, PermissionLevel>) {\n\t\tthis._options.rolePermissions = roles;\n\t}\n\n\tget rolePermissions() {\n\t\treturn this._options.rolePermissions ?? {};\n\t}\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { j as CommandBuilder, l as ContextMenuBuilder, k as ContextMenuCommand, S as SlashCommand, i as default } from '../../index-BjPKCNAw.cjs';
2
+ export { j as CommandBuilder, l as ContextMenuBuilder, k as ContextMenuCommand, S as SlashCommand, i as default } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { j as CommandBuilder, l as ContextMenuBuilder, k as ContextMenuCommand, S as SlashCommand, i as default } from '../../index-5IsAwOsi.js';
2
+ export { j as CommandBuilder, l as ContextMenuBuilder, k as ContextMenuCommand, S as SlashCommand, i as default } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { n as SubcommandBuilder, m as default } from '../../index-BjPKCNAw.cjs';
2
+ export { n as SubcommandBuilder, m as default } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { n as SubcommandBuilder, m as default } from '../../index-5IsAwOsi.js';
2
+ export { n as SubcommandBuilder, m as default } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { v as ComponentBuilder, u as default } from '../../index-BjPKCNAw.cjs';
2
+ export { v as ComponentBuilder, u as default } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { v as ComponentBuilder, u as default } from '../../index-5IsAwOsi.js';
2
+ export { v as ComponentBuilder, u as default } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { T as TriviousClient } from '../../index-BjPKCNAw.cjs';
2
+ import { T as TriviousClient } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
4
4
 
5
5
  declare const _default: {
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { T as TriviousClient } from '../../index-5IsAwOsi.js';
2
+ import { T as TriviousClient } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
4
4
 
5
5
  declare const _default: {
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { T as TriviousClient } from '../../index-BjPKCNAw.cjs';
2
+ import { T as TriviousClient } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
4
4
 
5
5
  declare const _default: {
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { T as TriviousClient } from '../../index-5IsAwOsi.js';
2
+ import { T as TriviousClient } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
4
4
 
5
5
  declare const _default: {
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { C as default } from '../../index-BjPKCNAw.cjs';
2
+ export { C as default } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { C as default } from '../../index-5IsAwOsi.js';
2
+ export { C as default } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { a as default } from '../../index-BjPKCNAw.cjs';
2
+ export { a as default } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { a as default } from '../../index-5IsAwOsi.js';
2
+ export { a as default } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { E as default } from '../../index-BjPKCNAw.cjs';
2
+ export { E as default } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { E as default } from '../../index-5IsAwOsi.js';
2
+ export { E as default } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
@@ -1,4 +1,4 @@
1
- import { C as CommandRegistry, a as ComponentRegistry, E as EventRegistry, M as ModuleRegistry, b as TriviousClientOptions, T as TriviousClient } from '../../index-BjPKCNAw.cjs';
1
+ import { C as CommandRegistry, a as ComponentRegistry, E as EventRegistry, M as ModuleRegistry, b as TriviousClientOptions, T as TriviousClient } from '../../index-SutqlRMo.cjs';
2
2
  import '../../shared/typings/registry.cjs';
3
3
  import 'discord.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { C as CommandRegistry, a as ComponentRegistry, E as EventRegistry, M as ModuleRegistry, b as TriviousClientOptions, T as TriviousClient } from '../../index-5IsAwOsi.js';
1
+ import { C as CommandRegistry, a as ComponentRegistry, E as EventRegistry, M as ModuleRegistry, b as TriviousClientOptions, T as TriviousClient } from '../../index-D5NcshUu.js';
2
2
  import '../../shared/typings/registry.js';
3
3
  import 'discord.js';
4
4
 
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { M as default } from '../../index-BjPKCNAw.cjs';
2
+ export { M as default } from '../../index-SutqlRMo.cjs';
3
3
  import '../../shared/typings/registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { M as default } from '../../index-5IsAwOsi.js';
2
+ export { M as default } from '../../index-D5NcshUu.js';
3
3
  import '../../shared/typings/registry.js';
@@ -609,6 +609,19 @@ interface TriviousClientOptions extends ClientOptions {
609
609
  * @type {string[]}
610
610
  */
611
611
  botOwnerIds?: string[];
612
+ /**
613
+ * Configuration for auto-command deployment based on hashes
614
+ * i.e. commands are only deployed if changes to the builders are detected.
615
+ *
616
+ * @type {{
617
+ * enabled: boolean;
618
+ * filePath: string;
619
+ * }}
620
+ */
621
+ commandHashConfig: {
622
+ enabled: boolean;
623
+ filePath: string;
624
+ };
612
625
  }
613
626
 
614
627
  /**
@@ -609,6 +609,19 @@ interface TriviousClientOptions extends ClientOptions {
609
609
  * @type {string[]}
610
610
  */
611
611
  botOwnerIds?: string[];
612
+ /**
613
+ * Configuration for auto-command deployment based on hashes
614
+ * i.e. commands are only deployed if changes to the builders are detected.
615
+ *
616
+ * @type {{
617
+ * enabled: boolean;
618
+ * filePath: string;
619
+ * }}
620
+ */
621
+ commandHashConfig: {
622
+ enabled: boolean;
623
+ filePath: string;
624
+ };
612
625
  }
613
626
 
614
627
  /**
package/dist/index.d.cts CHANGED
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { A as AnyCommand, B as ButtonInteraction, w as ChatInputCommandInteraction, i as Command, j as CommandBuilder, o as CommandInteraction, p as CommandMetadata, C as CommandRegistry, u as Component, v as ComponentBuilder, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, a as ComponentRegistry, e as ComponentType, l as ContextMenuBuilder, k as ContextMenuCommand, z as ContextMenuCommandInteraction, r as ContextMenuMetadata, s as Event, y as ModalSubmitInteraction, t as Module, P as PermissionLevel, S as SlashCommand, x as StringSelectMenuInteraction, m as Subcommand, n as SubcommandBuilder, q as SubcommandMetadata, T as TriviousClient, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from './index-BjPKCNAw.cjs';
2
+ export { A as AnyCommand, B as ButtonInteraction, w as ChatInputCommandInteraction, i as Command, j as CommandBuilder, o as CommandInteraction, p as CommandMetadata, C as CommandRegistry, u as Component, v as ComponentBuilder, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, a as ComponentRegistry, e as ComponentType, l as ContextMenuBuilder, k as ContextMenuCommand, z as ContextMenuCommandInteraction, r as ContextMenuMetadata, s as Event, y as ModalSubmitInteraction, t as Module, P as PermissionLevel, S as SlashCommand, x as StringSelectMenuInteraction, m as Subcommand, n as SubcommandBuilder, q as SubcommandMetadata, T as TriviousClient, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from './index-SutqlRMo.cjs';
3
3
  export { BaseRegistry } from './shared/typings/registry.cjs';
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { A as AnyCommand, B as ButtonInteraction, w as ChatInputCommandInteraction, i as Command, j as CommandBuilder, o as CommandInteraction, p as CommandMetadata, C as CommandRegistry, u as Component, v as ComponentBuilder, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, a as ComponentRegistry, e as ComponentType, l as ContextMenuBuilder, k as ContextMenuCommand, z as ContextMenuCommandInteraction, r as ContextMenuMetadata, s as Event, y as ModalSubmitInteraction, t as Module, P as PermissionLevel, S as SlashCommand, x as StringSelectMenuInteraction, m as Subcommand, n as SubcommandBuilder, q as SubcommandMetadata, T as TriviousClient, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from './index-5IsAwOsi.js';
2
+ export { A as AnyCommand, B as ButtonInteraction, w as ChatInputCommandInteraction, i as Command, j as CommandBuilder, o as CommandInteraction, p as CommandMetadata, C as CommandRegistry, u as Component, v as ComponentBuilder, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, a as ComponentRegistry, e as ComponentType, l as ContextMenuBuilder, k as ContextMenuCommand, z as ContextMenuCommandInteraction, r as ContextMenuMetadata, s as Event, y as ModalSubmitInteraction, t as Module, P as PermissionLevel, S as SlashCommand, x as StringSelectMenuInteraction, m as Subcommand, n as SubcommandBuilder, q as SubcommandMetadata, T as TriviousClient, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from './index-D5NcshUu.js';
3
3
  export { BaseRegistry } from './shared/typings/registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { b as TriviousClientOptions } from '../../index-BjPKCNAw.cjs';
2
+ export { b as TriviousClientOptions } from '../../index-SutqlRMo.cjs';
3
3
  import './registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { b as TriviousClientOptions } from '../../index-5IsAwOsi.js';
2
+ export { b as TriviousClientOptions } from '../../index-D5NcshUu.js';
3
3
  import './registry.js';
@@ -1,3 +1,3 @@
1
- export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, r as ContextMenuMetadata, q as SubcommandMetadata } from '../../index-BjPKCNAw.cjs';
1
+ export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, r as ContextMenuMetadata, q as SubcommandMetadata } from '../../index-SutqlRMo.cjs';
2
2
  import 'discord.js';
3
3
  import './registry.cjs';
@@ -1,3 +1,3 @@
1
- export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, r as ContextMenuMetadata, q as SubcommandMetadata } from '../../index-5IsAwOsi.js';
1
+ export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, r as ContextMenuMetadata, q as SubcommandMetadata } from '../../index-D5NcshUu.js';
2
2
  import 'discord.js';
3
3
  import './registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, h as deconstructCustomId } from '../../index-BjPKCNAw.cjs';
2
+ export { c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, h as deconstructCustomId } from '../../index-SutqlRMo.cjs';
3
3
  import './registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, h as deconstructCustomId } from '../../index-5IsAwOsi.js';
2
+ export { c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, h as deconstructCustomId } from '../../index-D5NcshUu.js';
3
3
  import './registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { s as Event } from '../../index-BjPKCNAw.cjs';
2
+ export { s as Event } from '../../index-SutqlRMo.cjs';
3
3
  import './registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { s as Event } from '../../index-5IsAwOsi.js';
2
+ export { s as Event } from '../../index-D5NcshUu.js';
3
3
  import './registry.js';
@@ -1,3 +1,3 @@
1
- export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, r as ContextMenuMetadata, s as Event, t as Module, P as PermissionLevel, q as SubcommandMetadata, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from '../../index-BjPKCNAw.cjs';
1
+ export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, r as ContextMenuMetadata, s as Event, t as Module, P as PermissionLevel, q as SubcommandMetadata, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from '../../index-SutqlRMo.cjs';
2
2
  export { BaseRegistry } from './registry.cjs';
3
3
  import 'discord.js';
@@ -1,3 +1,3 @@
1
- export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, r as ContextMenuMetadata, s as Event, t as Module, P as PermissionLevel, q as SubcommandMetadata, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from '../../index-5IsAwOsi.js';
1
+ export { A as AnyCommand, o as CommandInteraction, p as CommandMetadata, c as ComponentCustomIdTag, d as ComponentInteraction, f as ComponentMetadata, e as ComponentType, r as ContextMenuMetadata, s as Event, t as Module, P as PermissionLevel, q as SubcommandMetadata, b as TriviousClientOptions, h as deconstructCustomId, g as getPermissionLevel } from '../../index-D5NcshUu.js';
2
2
  export { BaseRegistry } from './registry.js';
3
3
  import 'discord.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { t as Module } from '../../index-BjPKCNAw.cjs';
2
+ export { t as Module } from '../../index-SutqlRMo.cjs';
3
3
  import './registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { t as Module } from '../../index-5IsAwOsi.js';
2
+ export { t as Module } from '../../index-D5NcshUu.js';
3
3
  import './registry.js';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { P as PermissionLevel, g as getPermissionLevel } from '../../index-BjPKCNAw.cjs';
2
+ export { P as PermissionLevel, g as getPermissionLevel } from '../../index-SutqlRMo.cjs';
3
3
  import './registry.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'discord.js';
2
- export { P as PermissionLevel, g as getPermissionLevel } from '../../index-5IsAwOsi.js';
2
+ export { P as PermissionLevel, g as getPermissionLevel } from '../../index-D5NcshUu.js';
3
3
  import './registry.js';
@@ -70,11 +70,19 @@ function hasPermission(client, options) {
70
70
  }
71
71
  return false;
72
72
  }
73
+ async function hashCommands(commands) {
74
+ const json = JSON.stringify(commands.sort((a, b) => a.name.localeCompare(b.name)));
75
+ const encoder = new TextEncoder();
76
+ const data = encoder.encode(json);
77
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
78
+ return Buffer.from(hashBuffer).toString("hex");
79
+ }
73
80
 
74
81
  exports.FRAMEWORK_PACKAGE_ROOT = FRAMEWORK_PACKAGE_ROOT;
75
82
  exports.exists = exists;
76
83
  exports.getCorePath = getCorePath;
77
84
  exports.hasPermission = hasPermission;
85
+ exports.hashCommands = hashCommands;
78
86
  exports.resolveUserPath = resolveUserPath;
79
87
  //# sourceMappingURL=functions.cjs.map
80
88
  //# sourceMappingURL=functions.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/shared/utility/functions.ts"],"names":["__filename","fileURLToPath","__dirname","dirname","existsSync","join","resolve","fs","PermissionLevel","getPermissionLevel"],"mappings":";;;;;;;;;AAQA,MAAMA,YAAA,GAAaC,iBAAA,CAAc,+PAAe,CAAA;AAChD,MAAMC,WAAA,GAAYC,aAAQH,YAAU,CAAA;AAOpC,MAAM,iBAAiB,MAAc;AACpC,EAAA,IAAI,GAAA,GAAME,WAAA;AAEV,EAAA,OAAO,GAAA,KAAQC,YAAA,CAAQ,GAAG,CAAA,EAAG;AAC5B,IAAA,IAAIC,aAAA,CAAWC,cAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA,IAAKD,aAAA,CAAWC,cAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA,EAAG;AACnF,MAAA,OAAO,GAAA;AAAA,IACR;AACA,IAAA,GAAA,GAAMF,aAAQ,GAAG,CAAA;AAAA,EAClB;AACA,EAAA,OAAOD,WAAA;AACR,CAAA;AAOO,MAAM,yBAAyB,cAAA;AAS/B,SAAS,YAAY,OAAA,EAGL;AACtB,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAc,GAAI,OAAA;AACpC,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,UAAA,GAAa;AAAA,IAClBG,cAAA,CAAK,sBAAA,EAAwB,MAAA,EAAQ,aAAa,CAAA;AAAA,IAClDA,cAAA,CAAK,sBAAA,EAAwB,KAAA,EAAO,aAAa;AAAA,GAClD;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AACnC,IAAA,IAAID,aAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAO,SAAA;AAAA,IACR;AAAA,EACD;AAEA,EAAA,OAAO,MAAA;AACR;AASO,SAAS,gBAAgB,YAAA,EAA8B;AAC7D,EAAA,MAAM,UAAA,GAAa;AAAA,IAClBC,cAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAY,CAAA;AAAA,IAEhCA,cAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,OAAO,YAAY,CAAA;AAAA,IACvCA,cAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,QAAQ,YAAY,CAAA;AAAA,IAExCA,cAAA,CAAK,wBAAwB,YAAY,CAAA;AAAA,IACzCA,cAAA,CAAK,sBAAA,EAAwB,KAAA,EAAO,YAAY,CAAA;AAAA,IAChDA,cAAA,CAAK,sBAAA,EAAwB,MAAA,EAAQ,YAAY;AAAA,GAClD;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AACnC,IAAA,MAAM,IAAA,GAAOC,kBAAQ,SAAS,CAAA;AAC9B,IAAA,IAAIF,aAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,EAC9B;AAEA,EAAA,OAAOC,cAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAY,CAAA;AACxC;AAUA,eAAsB,OAAO,IAAA,EAAc;AAC1C,EAAA,IAAI;AACH,IAAA,MAAME,WAAA,CAAG,OAAO,IAAI,CAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACR,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,KAAA;AAAA,EACR;AACD;AAaO,SAAS,aAAA,CACf,QACA,OAAA,EAKC;AACD,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,MAAA,EAAO,GAAI,OAAA;AAGrC,EAAA,IAAI,UAAA,KAAeC,8BAAA,CAAgB,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS,WAAA;AAC/D,IAAA,OAAO,IAAA,GACJ,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,SAAS,IAAA,CAAK,EAAE,CAAA,GAC5C,MAAA,GACC,OAAO,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAC9C,KAAA;AAGL,EAAA,IAAI,MAAM,OAAO,IAAA;AAGjB,EAAA,IAAI,MAAA,EAAQ;AACX,IAAA,MAAM,gBAAA,GAAmBC,iCAAA,CAAmB,MAAA,EAAQ,MAAM,CAAA;AAC1D,IAAA,OAAO,gBAAA,IAAoB,UAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAA;AACR","file":"functions.cjs","sourcesContent":["import TriviousClient from \"src/core/client/trivious.client.js\";\nimport { promises as fs, existsSync } from \"fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\nimport { getPermissionLevel, PermissionLevel } from \"../typings/permissions.js\";\nimport { GuildMember, User } from \"discord.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the package root.\n *\n * @returns {string}\n */\nconst getPackageRoot = (): string => {\n\tlet dir = __dirname;\n\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\")) || existsSync(join(dir, \"node_modules\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\treturn __dirname;\n};\n\n/**\n * Framework package root.\n *\n * @type {string}\n */\nexport const FRAMEWORK_PACKAGE_ROOT = getPackageRoot();\n\n/**\n * Get the core path.\n *\n * @export\n * @param {{ userPath?: string; coreDirectory: string }} options\n * @returns {string}\n */\nexport function getCorePath(options: {\n\tuserPath?: string;\n\tcoreDirectory: string;\n}): string | undefined {\n\tconst { userPath, coreDirectory } = options;\n\tif (userPath) {\n\t\treturn resolveUserPath(userPath);\n\t}\n\n\tconst candidates = [\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", coreDirectory),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", coreDirectory),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tif (existsSync(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Resolve a user given core path.\n *\n * @export\n * @param {string} relativePath\n * @returns {string}\n */\nexport function resolveUserPath(relativePath: string): string {\n\tconst candidates = [\n\t\tjoin(process.cwd(), relativePath),\n\n\t\tjoin(process.cwd(), \"lib\", relativePath),\n\t\tjoin(process.cwd(), \"dist\", relativePath),\n\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", relativePath),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tconst full = resolve(candidate);\n\t\tif (existsSync(full)) return full;\n\t}\n\n\treturn join(process.cwd(), relativePath);\n}\n\n/**\n * Whether a directory or file exists.\n *\n * @export\n * @async\n * @param {string} path\n * @returns {unknown}\n */\nexport async function exists(path: string) {\n\ttry {\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Whether a user/member has permission.\n *\n * @export\n * @param {{\n * \tpermission: PermissionLevel;\n * \tuser?: User;\n * \tmember?: GuildMember;\n * }} options\n * @returns {boolean}\n */\nexport function hasPermission(\n\tclient: TriviousClient,\n\toptions: {\n\t\tpermission: PermissionLevel;\n\t\tuser?: User;\n\t\tmember?: GuildMember;\n\t}\n) {\n\tconst { permission, user, member } = options;\n\n\t// Bot owner check\n\tif (permission === PermissionLevel.BOT_OWNER && client._options.botOwnerIds)\n\t\treturn user\n\t\t\t? client._options.botOwnerIds.includes(user.id)\n\t\t\t: member\n\t\t\t\t? client._options.botOwnerIds.includes(member.id)\n\t\t\t\t: false;\n\n\t// Outside of a guild\n\tif (user) return true;\n\n\t// Inside a guild\n\tif (member) {\n\t\tconst memberPermission = getPermissionLevel(client, member);\n\t\treturn memberPermission >= permission;\n\t}\n\n\treturn false;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/shared/utility/functions.ts"],"names":["__filename","fileURLToPath","__dirname","dirname","existsSync","join","resolve","fs","PermissionLevel","getPermissionLevel"],"mappings":"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","file":"functions.cjs","sourcesContent":["import TriviousClient from \"src/core/client/trivious.client.js\";\nimport { promises as fs, existsSync } from \"fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\nimport { getPermissionLevel, PermissionLevel } from \"../typings/permissions.js\";\nimport { GuildMember, RESTPostAPIApplicationCommandsJSONBody, User } from \"discord.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the package root.\n *\n * @returns {string}\n */\nconst getPackageRoot = (): string => {\n\tlet dir = __dirname;\n\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\")) || existsSync(join(dir, \"node_modules\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\treturn __dirname;\n};\n\n/**\n * Framework package root.\n *\n * @type {string}\n */\nexport const FRAMEWORK_PACKAGE_ROOT = getPackageRoot();\n\n/**\n * Get the core path.\n *\n * @export\n * @param {{ userPath?: string; coreDirectory: string }} options\n * @returns {string}\n */\nexport function getCorePath(options: {\n\tuserPath?: string;\n\tcoreDirectory: string;\n}): string | undefined {\n\tconst { userPath, coreDirectory } = options;\n\tif (userPath) {\n\t\treturn resolveUserPath(userPath);\n\t}\n\n\tconst candidates = [\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", coreDirectory),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", coreDirectory),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tif (existsSync(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Resolve a user given core path.\n *\n * @export\n * @param {string} relativePath\n * @returns {string}\n */\nexport function resolveUserPath(relativePath: string): string {\n\tconst candidates = [\n\t\tjoin(process.cwd(), relativePath),\n\n\t\tjoin(process.cwd(), \"lib\", relativePath),\n\t\tjoin(process.cwd(), \"dist\", relativePath),\n\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", relativePath),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tconst full = resolve(candidate);\n\t\tif (existsSync(full)) return full;\n\t}\n\n\treturn join(process.cwd(), relativePath);\n}\n\n/**\n * Whether a directory or file exists.\n *\n * @export\n * @async\n * @param {string} path\n * @returns {unknown}\n */\nexport async function exists(path: string) {\n\ttry {\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Whether a user/member has permission.\n *\n * @export\n * @param {{\n * \tpermission: PermissionLevel;\n * \tuser?: User;\n * \tmember?: GuildMember;\n * }} options\n * @returns {boolean}\n */\nexport function hasPermission(\n\tclient: TriviousClient,\n\toptions: {\n\t\tpermission: PermissionLevel;\n\t\tuser?: User;\n\t\tmember?: GuildMember;\n\t}\n) {\n\tconst { permission, user, member } = options;\n\n\t// Bot owner check\n\tif (permission === PermissionLevel.BOT_OWNER && client._options.botOwnerIds)\n\t\treturn user\n\t\t\t? client._options.botOwnerIds.includes(user.id)\n\t\t\t: member\n\t\t\t\t? client._options.botOwnerIds.includes(member.id)\n\t\t\t\t: false;\n\n\t// Outside of a guild\n\tif (user) return true;\n\n\t// Inside a guild\n\tif (member) {\n\t\tconst memberPermission = getPermissionLevel(client, member);\n\t\treturn memberPermission >= permission;\n\t}\n\n\treturn false;\n}\n\nexport async function hashCommands(commands: RESTPostAPIApplicationCommandsJSONBody[]) {\n\tconst json = JSON.stringify(commands.sort((a, b) => a.name.localeCompare(b.name)));\n\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(json);\n\tconst hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n\n\treturn Buffer.from(hashBuffer).toString(\"hex\");\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { T as TriviousClient, P as PermissionLevel } from '../../index-BjPKCNAw.cjs';
2
- import { User, GuildMember } from 'discord.js';
1
+ import { T as TriviousClient, P as PermissionLevel } from '../../index-SutqlRMo.cjs';
2
+ import { User, GuildMember, RESTPostAPIApplicationCommandsJSONBody } from 'discord.js';
3
3
  import '../typings/registry.cjs';
4
4
 
5
5
  /**
@@ -52,5 +52,6 @@ declare function hasPermission(client: TriviousClient, options: {
52
52
  user?: User;
53
53
  member?: GuildMember;
54
54
  }): boolean;
55
+ declare function hashCommands(commands: RESTPostAPIApplicationCommandsJSONBody[]): Promise<string>;
55
56
 
56
- export { FRAMEWORK_PACKAGE_ROOT, exists, getCorePath, hasPermission, resolveUserPath };
57
+ export { FRAMEWORK_PACKAGE_ROOT, exists, getCorePath, hasPermission, hashCommands, resolveUserPath };
@@ -1,5 +1,5 @@
1
- import { T as TriviousClient, P as PermissionLevel } from '../../index-5IsAwOsi.js';
2
- import { User, GuildMember } from 'discord.js';
1
+ import { T as TriviousClient, P as PermissionLevel } from '../../index-D5NcshUu.js';
2
+ import { User, GuildMember, RESTPostAPIApplicationCommandsJSONBody } from 'discord.js';
3
3
  import '../typings/registry.js';
4
4
 
5
5
  /**
@@ -52,5 +52,6 @@ declare function hasPermission(client: TriviousClient, options: {
52
52
  user?: User;
53
53
  member?: GuildMember;
54
54
  }): boolean;
55
+ declare function hashCommands(commands: RESTPostAPIApplicationCommandsJSONBody[]): Promise<string>;
55
56
 
56
- export { FRAMEWORK_PACKAGE_ROOT, exists, getCorePath, hasPermission, resolveUserPath };
57
+ export { FRAMEWORK_PACKAGE_ROOT, exists, getCorePath, hasPermission, hashCommands, resolveUserPath };
@@ -67,7 +67,14 @@ function hasPermission(client, options) {
67
67
  }
68
68
  return false;
69
69
  }
70
+ async function hashCommands(commands) {
71
+ const json = JSON.stringify(commands.sort((a, b) => a.name.localeCompare(b.name)));
72
+ const encoder = new TextEncoder();
73
+ const data = encoder.encode(json);
74
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
75
+ return Buffer.from(hashBuffer).toString("hex");
76
+ }
70
77
 
71
- export { FRAMEWORK_PACKAGE_ROOT, exists, getCorePath, hasPermission, resolveUserPath };
78
+ export { FRAMEWORK_PACKAGE_ROOT, exists, getCorePath, hasPermission, hashCommands, resolveUserPath };
72
79
  //# sourceMappingURL=functions.js.map
73
80
  //# sourceMappingURL=functions.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/shared/utility/functions.ts"],"names":["__filename","__dirname","fs"],"mappings":"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","file":"functions.js","sourcesContent":["import TriviousClient from \"src/core/client/trivious.client.js\";\nimport { promises as fs, existsSync } from \"fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\nimport { getPermissionLevel, PermissionLevel } from \"../typings/permissions.js\";\nimport { GuildMember, User } from \"discord.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the package root.\n *\n * @returns {string}\n */\nconst getPackageRoot = (): string => {\n\tlet dir = __dirname;\n\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\")) || existsSync(join(dir, \"node_modules\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\treturn __dirname;\n};\n\n/**\n * Framework package root.\n *\n * @type {string}\n */\nexport const FRAMEWORK_PACKAGE_ROOT = getPackageRoot();\n\n/**\n * Get the core path.\n *\n * @export\n * @param {{ userPath?: string; coreDirectory: string }} options\n * @returns {string}\n */\nexport function getCorePath(options: {\n\tuserPath?: string;\n\tcoreDirectory: string;\n}): string | undefined {\n\tconst { userPath, coreDirectory } = options;\n\tif (userPath) {\n\t\treturn resolveUserPath(userPath);\n\t}\n\n\tconst candidates = [\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", coreDirectory),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", coreDirectory),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tif (existsSync(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Resolve a user given core path.\n *\n * @export\n * @param {string} relativePath\n * @returns {string}\n */\nexport function resolveUserPath(relativePath: string): string {\n\tconst candidates = [\n\t\tjoin(process.cwd(), relativePath),\n\n\t\tjoin(process.cwd(), \"lib\", relativePath),\n\t\tjoin(process.cwd(), \"dist\", relativePath),\n\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", relativePath),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tconst full = resolve(candidate);\n\t\tif (existsSync(full)) return full;\n\t}\n\n\treturn join(process.cwd(), relativePath);\n}\n\n/**\n * Whether a directory or file exists.\n *\n * @export\n * @async\n * @param {string} path\n * @returns {unknown}\n */\nexport async function exists(path: string) {\n\ttry {\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Whether a user/member has permission.\n *\n * @export\n * @param {{\n * \tpermission: PermissionLevel;\n * \tuser?: User;\n * \tmember?: GuildMember;\n * }} options\n * @returns {boolean}\n */\nexport function hasPermission(\n\tclient: TriviousClient,\n\toptions: {\n\t\tpermission: PermissionLevel;\n\t\tuser?: User;\n\t\tmember?: GuildMember;\n\t}\n) {\n\tconst { permission, user, member } = options;\n\n\t// Bot owner check\n\tif (permission === PermissionLevel.BOT_OWNER && client._options.botOwnerIds)\n\t\treturn user\n\t\t\t? client._options.botOwnerIds.includes(user.id)\n\t\t\t: member\n\t\t\t\t? client._options.botOwnerIds.includes(member.id)\n\t\t\t\t: false;\n\n\t// Outside of a guild\n\tif (user) return true;\n\n\t// Inside a guild\n\tif (member) {\n\t\tconst memberPermission = getPermissionLevel(client, member);\n\t\treturn memberPermission >= permission;\n\t}\n\n\treturn false;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/shared/utility/functions.ts"],"names":["__filename","__dirname","fs"],"mappings":";;;;;;AAQA,MAAMA,YAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,MAAMC,WAAA,GAAY,QAAQD,YAAU,CAAA;AAOpC,MAAM,iBAAiB,MAAc;AACpC,EAAA,IAAI,GAAA,GAAMC,WAAA;AAEV,EAAA,OAAO,GAAA,KAAQ,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5B,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA,EAAG;AACnF,MAAA,OAAO,GAAA;AAAA,IACR;AACA,IAAA,GAAA,GAAM,QAAQ,GAAG,CAAA;AAAA,EAClB;AACA,EAAA,OAAOA,WAAA;AACR,CAAA;AAOO,MAAM,yBAAyB,cAAA;AAS/B,SAAS,YAAY,OAAA,EAGL;AACtB,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAc,GAAI,OAAA;AACpC,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,UAAA,GAAa;AAAA,IAClB,IAAA,CAAK,sBAAA,EAAwB,MAAA,EAAQ,aAAa,CAAA;AAAA,IAClD,IAAA,CAAK,sBAAA,EAAwB,KAAA,EAAO,aAAa;AAAA,GAClD;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AACnC,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAO,SAAA;AAAA,IACR;AAAA,EACD;AAEA,EAAA,OAAO,MAAA;AACR;AASO,SAAS,gBAAgB,YAAA,EAA8B;AAC7D,EAAA,MAAM,UAAA,GAAa;AAAA,IAClB,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAY,CAAA;AAAA,IAEhC,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,OAAO,YAAY,CAAA;AAAA,IACvC,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,QAAQ,YAAY,CAAA;AAAA,IAExC,IAAA,CAAK,wBAAwB,YAAY,CAAA;AAAA,IACzC,IAAA,CAAK,sBAAA,EAAwB,KAAA,EAAO,YAAY,CAAA;AAAA,IAChD,IAAA,CAAK,sBAAA,EAAwB,MAAA,EAAQ,YAAY;AAAA,GAClD;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AACnC,IAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAY,CAAA;AACxC;AAUA,eAAsB,OAAO,IAAA,EAAc;AAC1C,EAAA,IAAI;AACH,IAAA,MAAMC,QAAA,CAAG,OAAO,IAAI,CAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACR,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,KAAA;AAAA,EACR;AACD;AAaO,SAAS,aAAA,CACf,QACA,OAAA,EAKC;AACD,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,MAAA,EAAO,GAAI,OAAA;AAGrC,EAAA,IAAI,UAAA,KAAe,eAAA,CAAgB,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS,WAAA;AAC/D,IAAA,OAAO,IAAA,GACJ,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,SAAS,IAAA,CAAK,EAAE,CAAA,GAC5C,MAAA,GACC,OAAO,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAC9C,KAAA;AAGL,EAAA,IAAI,MAAM,OAAO,IAAA;AAGjB,EAAA,IAAI,MAAA,EAAQ;AACX,IAAA,MAAM,gBAAA,GAAmB,kBAAA,CAAmB,MAAA,EAAQ,MAAM,CAAA;AAC1D,IAAA,OAAO,gBAAA,IAAoB,UAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAA;AACR;AAEA,eAAsB,aAAa,QAAA,EAAoD;AACtF,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAEjF,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAChC,EAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAE7D,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,KAAK,CAAA;AAC9C","file":"functions.js","sourcesContent":["import TriviousClient from \"src/core/client/trivious.client.js\";\nimport { promises as fs, existsSync } from \"fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\nimport { getPermissionLevel, PermissionLevel } from \"../typings/permissions.js\";\nimport { GuildMember, RESTPostAPIApplicationCommandsJSONBody, User } from \"discord.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the package root.\n *\n * @returns {string}\n */\nconst getPackageRoot = (): string => {\n\tlet dir = __dirname;\n\n\twhile (dir !== dirname(dir)) {\n\t\tif (existsSync(join(dir, \"package.json\")) || existsSync(join(dir, \"node_modules\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = dirname(dir);\n\t}\n\treturn __dirname;\n};\n\n/**\n * Framework package root.\n *\n * @type {string}\n */\nexport const FRAMEWORK_PACKAGE_ROOT = getPackageRoot();\n\n/**\n * Get the core path.\n *\n * @export\n * @param {{ userPath?: string; coreDirectory: string }} options\n * @returns {string}\n */\nexport function getCorePath(options: {\n\tuserPath?: string;\n\tcoreDirectory: string;\n}): string | undefined {\n\tconst { userPath, coreDirectory } = options;\n\tif (userPath) {\n\t\treturn resolveUserPath(userPath);\n\t}\n\n\tconst candidates = [\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", coreDirectory),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", coreDirectory),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tif (existsSync(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Resolve a user given core path.\n *\n * @export\n * @param {string} relativePath\n * @returns {string}\n */\nexport function resolveUserPath(relativePath: string): string {\n\tconst candidates = [\n\t\tjoin(process.cwd(), relativePath),\n\n\t\tjoin(process.cwd(), \"lib\", relativePath),\n\t\tjoin(process.cwd(), \"dist\", relativePath),\n\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"lib\", relativePath),\n\t\tjoin(FRAMEWORK_PACKAGE_ROOT, \"dist\", relativePath),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tconst full = resolve(candidate);\n\t\tif (existsSync(full)) return full;\n\t}\n\n\treturn join(process.cwd(), relativePath);\n}\n\n/**\n * Whether a directory or file exists.\n *\n * @export\n * @async\n * @param {string} path\n * @returns {unknown}\n */\nexport async function exists(path: string) {\n\ttry {\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Whether a user/member has permission.\n *\n * @export\n * @param {{\n * \tpermission: PermissionLevel;\n * \tuser?: User;\n * \tmember?: GuildMember;\n * }} options\n * @returns {boolean}\n */\nexport function hasPermission(\n\tclient: TriviousClient,\n\toptions: {\n\t\tpermission: PermissionLevel;\n\t\tuser?: User;\n\t\tmember?: GuildMember;\n\t}\n) {\n\tconst { permission, user, member } = options;\n\n\t// Bot owner check\n\tif (permission === PermissionLevel.BOT_OWNER && client._options.botOwnerIds)\n\t\treturn user\n\t\t\t? client._options.botOwnerIds.includes(user.id)\n\t\t\t: member\n\t\t\t\t? client._options.botOwnerIds.includes(member.id)\n\t\t\t\t: false;\n\n\t// Outside of a guild\n\tif (user) return true;\n\n\t// Inside a guild\n\tif (member) {\n\t\tconst memberPermission = getPermissionLevel(client, member);\n\t\treturn memberPermission >= permission;\n\t}\n\n\treturn false;\n}\n\nexport async function hashCommands(commands: RESTPostAPIApplicationCommandsJSONBody[]) {\n\tconst json = JSON.stringify(commands.sort((a, b) => a.name.localeCompare(b.name)));\n\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(json);\n\tconst hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n\n\treturn Buffer.from(hashBuffer).toString(\"hex\");\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trivious",
3
- "version": "1.3.26",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "keywords": [
6
6
  "discord-bot",