From 40db3cc9ace603d8bc230dc46544f1b0167b0254 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 21:09:40 -0600 Subject: [PATCH 01/12] feat: Create new template This template implements class-based modules, mongodb connection, custom logger, and all latest packages. --- templates/ts-class-template/README.md | 1 + templates/ts-class-template/package-lock.json | 1150 +++++++++++++++++ templates/ts-class-template/package.json | 52 + templates/ts-class-template/sern.config.json | 7 + .../src/Structures/client/index.ts | 48 + .../src/Structures/client/load.ts | 53 + .../src/Structures/client/utils.ts | 11 + .../src/Structures/handler/index.ts | 2 + .../src/Structures/handler/plugins.ts | 1 + .../src/Structures/handler/sparky.ts | 40 + .../src/Structures/mongo/properties.ts | 18 + .../src/Structures/mongo/schemas/guild.ts | 12 + templates/ts-class-template/src/client.ts | 23 + .../src/commands/tools/ping.ts | 12 + .../src/events/discord/client/ready.ts | 13 + .../ts-class-template/src/plugins/publish.ts | 188 +++ templates/ts-class-template/tsconfig.json | 32 + 17 files changed, 1663 insertions(+) create mode 100644 templates/ts-class-template/README.md create mode 100644 templates/ts-class-template/package-lock.json create mode 100644 templates/ts-class-template/package.json create mode 100644 templates/ts-class-template/sern.config.json create mode 100644 templates/ts-class-template/src/Structures/client/index.ts create mode 100644 templates/ts-class-template/src/Structures/client/load.ts create mode 100644 templates/ts-class-template/src/Structures/client/utils.ts create mode 100644 templates/ts-class-template/src/Structures/handler/index.ts create mode 100644 templates/ts-class-template/src/Structures/handler/plugins.ts create mode 100644 templates/ts-class-template/src/Structures/handler/sparky.ts create mode 100644 templates/ts-class-template/src/Structures/mongo/properties.ts create mode 100644 templates/ts-class-template/src/Structures/mongo/schemas/guild.ts create mode 100644 templates/ts-class-template/src/client.ts create mode 100644 templates/ts-class-template/src/commands/tools/ping.ts create mode 100644 templates/ts-class-template/src/events/discord/client/ready.ts create mode 100644 templates/ts-class-template/src/plugins/publish.ts create mode 100644 templates/ts-class-template/tsconfig.json diff --git a/templates/ts-class-template/README.md b/templates/ts-class-template/README.md new file mode 100644 index 00000000..46409041 --- /dev/null +++ b/templates/ts-class-template/README.md @@ -0,0 +1 @@ +# TODO diff --git a/templates/ts-class-template/package-lock.json b/templates/ts-class-template/package-lock.json new file mode 100644 index 00000000..48b8378a --- /dev/null +++ b/templates/ts-class-template/package-lock.json @@ -0,0 +1,1150 @@ +{ + "name": "ts-class-example", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ts-class-example", + "version": "1.0.0", + "license": "UNLICENSED", + "dependencies": { + "@sern/handler": "^2.5.3", + "@spark.ts/logger": "^1.4.0", + "colorette": "^2.0.19", + "discord.js": "^14.7.1", + "mongoose": "^7.0.1" + }, + "devDependencies": { + "@types/node": "^18.14.6", + "typescript": "^4.9.5" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz", + "integrity": "sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA==", + "dependencies": { + "@discordjs/util": "^0.1.0", + "@sapphire/shapeshift": "^3.7.1", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.2", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/collection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.3.0.tgz", + "integrity": "sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg==", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/rest": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.5.0.tgz", + "integrity": "sha512-lXgNFqHnbmzp5u81W0+frdXN6Etf4EUi8FAPcWpSykKd8hmlWh1xy6BmE0bsJypU1pxohaA8lQCgp70NUI3uzA==", + "dependencies": { + "@discordjs/collection": "^1.3.0", + "@discordjs/util": "^0.1.0", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.37.23", + "file-type": "^18.0.0", + "tslib": "^2.4.1", + "undici": "^5.13.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/util": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.1.0.tgz", + "integrity": "sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ==", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz", + "integrity": "sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", + "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sern/handler": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@sern/handler/-/handler-2.5.3.tgz", + "integrity": "sha512-vNwlBqrM4OZC+UuIpnR4bq802g7UPuUsr2m83q5U71/5pVtk+uirdzbPGbLGrhqlzeDMMTygtNSFpsGZ/pvbqA==", + "dependencies": { + "iti": "^0.6.0", + "rxjs": "^7.8.0", + "ts-pattern": "^4.1.4", + "ts-results-es": "^3.5.0" + } + }, + "node_modules/@spark.ts/logger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@spark.ts/logger/-/logger-1.4.0.tgz", + "integrity": "sha512-sJSlO6MQkJMadnq6Ak5PLmKL8CfvkTGqP+R7LJ4rmHvJRYbQGhyjSYON3P0pJkthTu92cWFAwwApFSY9xWDeIA==", + "dependencies": { + "ansi-colors": "^4.1.3" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@types/node": { + "version": "18.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", + "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bson": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.0.1.tgz", + "integrity": "sha512-y09gBGusgHtinMon/GVbv1J6FrXhnr/+6hqLlSmEFzkz6PodqF6TxjyvfvY3AfO+oG1mgUtbC86xSbOlwvM62Q==", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/discord-api-types": { + "version": "0.37.35", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.35.tgz", + "integrity": "sha512-iyKZ/82k7FX3lcmHiAvvWu5TmyfVo78RtghBV/YsehK6CID83k5SI03DKKopBcln+TiEIYw5MGgq7SJXSpNzMg==" + }, + "node_modules/discord.js": { + "version": "14.7.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.7.1.tgz", + "integrity": "sha512-1FECvqJJjjeYcjSm0IGMnPxLqja/pmG1B0W2l3lUY2Gi4KXiyTeQmU1IxWcbXHn2k+ytP587mMWqva2IA87EbA==", + "dependencies": { + "@discordjs/builders": "^1.4.0", + "@discordjs/collection": "^1.3.0", + "@discordjs/rest": "^1.4.0", + "@discordjs/util": "^0.1.0", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.1", + "undici": "^5.13.0", + "ws": "^8.11.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/file-type": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", + "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/iti": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/iti/-/iti-0.6.0.tgz", + "integrity": "sha512-JqujcnAIF3pmzitjbT3acc0LkordU6oHBDvWeT6a25wvEVBddFX3DFx/p6YBwGX1TTFsyLgVZtwhGOknthC96A==", + "dependencies": { + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mongodb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.1.0.tgz", + "integrity": "sha512-qgKb7y+EI90y4weY3z5+lIgm8wmexbonz0GalHkSElQXVKtRuwqXuhXKccyvIjXCJVy9qPV82zsinY0W1FBnJw==", + "dependencies": { + "bson": "^5.0.1", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.201.0", + "mongodb-client-encryption": "^2.3.0", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.0.1.tgz", + "integrity": "sha512-fxm2bPRG457Hb8RLwN8cMCokK8HNem/7g+qp5SrHC7Pt4Z4jqn1+/3cuc8W7uqehKDWEtpirggI7uw08x2ZIjQ==", + "dependencies": { + "bson": "^5.0.1", + "kareem": "2.5.1", + "mongodb": "5.1.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-mixer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + }, + "node_modules/ts-pattern": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.1.tgz", + "integrity": "sha512-lXCmHZb01QOM9HdCLvisCGUH9ATdKPON9UaUvwe007gJAhuSBhRWIAIowys5QqNxEq6odWctfMIdI96vzjnOMQ==" + }, + "node_modules/ts-results-es": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ts-results-es/-/ts-results-es-3.5.0.tgz", + "integrity": "sha512-W7Vtg9u7QsutEfDbLEJNDlDrYGK7spxab6Je+K9+tjI/ixCM1ouniQmHJX0mZUok5WsWiCGxQy6lIrI//nBzTg==" + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ws": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + }, + "dependencies": { + "@discordjs/builders": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz", + "integrity": "sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA==", + "requires": { + "@discordjs/util": "^0.1.0", + "@sapphire/shapeshift": "^3.7.1", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.2", + "tslib": "^2.4.1" + } + }, + "@discordjs/collection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.3.0.tgz", + "integrity": "sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg==" + }, + "@discordjs/rest": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.5.0.tgz", + "integrity": "sha512-lXgNFqHnbmzp5u81W0+frdXN6Etf4EUi8FAPcWpSykKd8hmlWh1xy6BmE0bsJypU1pxohaA8lQCgp70NUI3uzA==", + "requires": { + "@discordjs/collection": "^1.3.0", + "@discordjs/util": "^0.1.0", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.37.23", + "file-type": "^18.0.0", + "tslib": "^2.4.1", + "undici": "^5.13.0" + } + }, + "@discordjs/util": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.1.0.tgz", + "integrity": "sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ==" + }, + "@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==" + }, + "@sapphire/shapeshift": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz", + "integrity": "sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + } + }, + "@sapphire/snowflake": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", + "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==" + }, + "@sern/handler": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@sern/handler/-/handler-2.5.3.tgz", + "integrity": "sha512-vNwlBqrM4OZC+UuIpnR4bq802g7UPuUsr2m83q5U71/5pVtk+uirdzbPGbLGrhqlzeDMMTygtNSFpsGZ/pvbqA==", + "requires": { + "iti": "^0.6.0", + "rxjs": "^7.8.0", + "ts-pattern": "^4.1.4", + "ts-results-es": "^3.5.0" + } + }, + "@spark.ts/logger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@spark.ts/logger/-/logger-1.4.0.tgz", + "integrity": "sha512-sJSlO6MQkJMadnq6Ak5PLmKL8CfvkTGqP+R7LJ4rmHvJRYbQGhyjSYON3P0pJkthTu92cWFAwwApFSY9xWDeIA==", + "requires": { + "ansi-colors": "^4.1.3" + } + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "@types/node": { + "version": "18.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", + "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==" + }, + "@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "requires": { + "@types/node": "*" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + }, + "bson": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.0.1.tgz", + "integrity": "sha512-y09gBGusgHtinMon/GVbv1J6FrXhnr/+6hqLlSmEFzkz6PodqF6TxjyvfvY3AfO+oG1mgUtbC86xSbOlwvM62Q==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "discord-api-types": { + "version": "0.37.35", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.35.tgz", + "integrity": "sha512-iyKZ/82k7FX3lcmHiAvvWu5TmyfVo78RtghBV/YsehK6CID83k5SI03DKKopBcln+TiEIYw5MGgq7SJXSpNzMg==" + }, + "discord.js": { + "version": "14.7.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.7.1.tgz", + "integrity": "sha512-1FECvqJJjjeYcjSm0IGMnPxLqja/pmG1B0W2l3lUY2Gi4KXiyTeQmU1IxWcbXHn2k+ytP587mMWqva2IA87EbA==", + "requires": { + "@discordjs/builders": "^1.4.0", + "@discordjs/collection": "^1.3.0", + "@discordjs/rest": "^1.4.0", + "@discordjs/util": "^0.1.0", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.37.20", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.1", + "undici": "^5.13.0", + "ws": "^8.11.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "file-type": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", + "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "iti": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/iti/-/iti-0.6.0.tgz", + "integrity": "sha512-JqujcnAIF3pmzitjbT3acc0LkordU6oHBDvWeT6a25wvEVBddFX3DFx/p6YBwGX1TTFsyLgVZtwhGOknthC96A==", + "requires": { + "utility-types": "^3.10.0" + } + }, + "kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "mongodb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.1.0.tgz", + "integrity": "sha512-qgKb7y+EI90y4weY3z5+lIgm8wmexbonz0GalHkSElQXVKtRuwqXuhXKccyvIjXCJVy9qPV82zsinY0W1FBnJw==", + "requires": { + "bson": "^5.0.1", + "mongodb-connection-string-url": "^2.6.0", + "saslprep": "^1.0.3", + "socks": "^2.7.1" + } + }, + "mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "mongoose": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.0.1.tgz", + "integrity": "sha512-fxm2bPRG457Hb8RLwN8cMCokK8HNem/7g+qp5SrHC7Pt4Z4jqn1+/3cuc8W7uqehKDWEtpirggI7uw08x2ZIjQ==", + "requires": { + "bson": "^5.0.1", + "kareem": "2.5.1", + "mongodb": "5.1.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + } + }, + "mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" + }, + "mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "requires": { + "debug": "4.x" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + } + }, + "rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "ts-mixer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + }, + "ts-pattern": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.1.tgz", + "integrity": "sha512-lXCmHZb01QOM9HdCLvisCGUH9ATdKPON9UaUvwe007gJAhuSBhRWIAIowys5QqNxEq6odWctfMIdI96vzjnOMQ==" + }, + "ts-results-es": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ts-results-es/-/ts-results-es-3.5.0.tgz", + "integrity": "sha512-W7Vtg9u7QsutEfDbLEJNDlDrYGK7spxab6Je+K9+tjI/ixCM1ouniQmHJX0mZUok5WsWiCGxQy6lIrI//nBzTg==" + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "requires": { + "busboy": "^1.6.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "ws": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "requires": {} + } + } +} diff --git a/templates/ts-class-template/package.json b/templates/ts-class-template/package.json new file mode 100644 index 00000000..e8759035 --- /dev/null +++ b/templates/ts-class-template/package.json @@ -0,0 +1,52 @@ +{ + "name": "ts-class-example", + "version": "1.0.0", + "description": "Class-based example", + "main": "dist/client.js", + "type": "module", + "scripts": { + "build": "tsc", + "start": "tsc && node ./dist/client.js", + "dev": "tsc && nodemon ./dist/client.js" + }, + "keywords": [ + "typescript", + "sern", + "discord.js" + ], + "license": "UNLICENSED", + "dependencies": { + "@sern/handler": "^2.5.3", + "@spark.ts/logger": "^1.4.0", + "colorette": "^2.0.19", + "discord.js": "^14.7.1", + "mongoose": "^7.0.1" + }, + "devDependencies": { + "@types/node": "^18.14.6", + "typescript": "^4.9.5" + }, + "imports": { + "#client": [ + "./dist/Structures/client/index.js" + ], + "#utils": [ + "./dist/Structures/client/utils.js" + ], + "#BOT": [ + "./dist/client.js" + ], + "#logger": [ + "./dist/Structures/handler/sparky.js" + ], + "#handler": [ + "./dist/Structures/handler/index.js" + ], + "#plugins": [ + "./dist/Structures/handler/plugins.js" + ], + "#schemas/*": [ + "./dist/Structures/mongo/schemas/*.js" + ] + } +} diff --git a/templates/ts-class-template/sern.config.json b/templates/ts-class-template/sern.config.json new file mode 100644 index 00000000..267655bf --- /dev/null +++ b/templates/ts-class-template/sern.config.json @@ -0,0 +1,7 @@ +{ + "language": "typescript", + "paths": { + "base": "src", + "commands": "commands" + } +} \ No newline at end of file diff --git a/templates/ts-class-template/src/Structures/client/index.ts b/templates/ts-class-template/src/Structures/client/index.ts new file mode 100644 index 00000000..5febff42 --- /dev/null +++ b/templates/ts-class-template/src/Structures/client/index.ts @@ -0,0 +1,48 @@ +import { Client, GatewayIntentBits, Partials } from 'discord.js'; +import { Sern } from '@sern/handler'; +import type { useContainer } from '#BOT'; +import { env } from '#utils'; + +export class BOT extends Client { + constructor() { + super({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMembers, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, //Make sure this is enabled for text commands! + ], + partials: [ + Partials.Channel, + Partials.GuildMember, + Partials.GuildScheduledEvent, + Partials.Message, + Partials.Reaction, + Partials.ThreadMember, + Partials.User, + ], + shards: 'auto', + /** + * uncomment this to prevent bot from replying to users. + * allowedMentions: { + * repliedUser: false, + * users: [], + * }, + */ + }); + this.token = env.DISCORD_TOKEN; + } + + async start(container: typeof useContainer) { + Sern.init({ + defaultPrefix: 'astra!', + commands: 'dist/commands', + events: 'dist/events', + containerConfig: { + get: container, + }, + }); + this.setMaxListeners(0); + await this.login(this.token!); + } +} diff --git a/templates/ts-class-template/src/Structures/client/load.ts b/templates/ts-class-template/src/Structures/client/load.ts new file mode 100644 index 00000000..86dfb93a --- /dev/null +++ b/templates/ts-class-template/src/Structures/client/load.ts @@ -0,0 +1,53 @@ +import { existsSync, readFileSync } from 'fs'; +export function load( + struct: Struct, + path: string = '.env', + inject: boolean = true +): T { + const out: T = {} as never; + + if (!existsSync(path)) { + throw new Error(`Cannot read contents of '${path}': File does not exist`); + } + + const file = readFileSync(path); + const lines = file.toString().split('\n'); + + const raw: Record = {}; + + for (const line of lines) { + const [key, value] = [ + line.split('=')[0], + line.split('=').slice(1).join('='), + ] as [string, string]; + + let real_value = value; + + try { + real_value = JSON.stringify(JSON.parse(value)); + } catch { + void real_value; + } + + raw[key] = value; + } + + for (const key in struct) { + if (!(key in raw)) { + throw new Error(`Cannot map key '${key}': Key does not exist`); + } + + // safety(as): assertion above guarantees string + out[key] = struct[key](raw[key] as string); + } + + if (inject) { + Object.assign(process.env, out); + } + + return out; +} + +export type Struct = { + [P in keyof T]: (str: string) => T[P]; +}; diff --git a/templates/ts-class-template/src/Structures/client/utils.ts b/templates/ts-class-template/src/Structures/client/utils.ts new file mode 100644 index 00000000..65dc2023 --- /dev/null +++ b/templates/ts-class-template/src/Structures/client/utils.ts @@ -0,0 +1,11 @@ +import { useContainer } from '#BOT'; +import fs from 'fs'; +import { load } from './load.js'; + +export const rds = fs.readdirSync; +export const logger = () => useContainer('@sern/logger')[0]; +export const env = load({ + DISCORD_TOKEN: String, + CONNECT: String, + ownerIDs: Array, +}); diff --git a/templates/ts-class-template/src/Structures/handler/index.ts b/templates/ts-class-template/src/Structures/handler/index.ts new file mode 100644 index 00000000..17094aa5 --- /dev/null +++ b/templates/ts-class-template/src/Structures/handler/index.ts @@ -0,0 +1,2 @@ +export * from './sparky.js'; +export * from '../mongo/properties.js'; diff --git a/templates/ts-class-template/src/Structures/handler/plugins.ts b/templates/ts-class-template/src/Structures/handler/plugins.ts new file mode 100644 index 00000000..891756d5 --- /dev/null +++ b/templates/ts-class-template/src/Structures/handler/plugins.ts @@ -0,0 +1 @@ +export * from '../../plugins/publish.js'; diff --git a/templates/ts-class-template/src/Structures/handler/sparky.ts b/templates/ts-class-template/src/Structures/handler/sparky.ts new file mode 100644 index 00000000..c4e5d194 --- /dev/null +++ b/templates/ts-class-template/src/Structures/handler/sparky.ts @@ -0,0 +1,40 @@ +import type { Logging, LogPayload } from '@sern/handler'; +import { Logger, LogLevel, LogStyle } from '@spark.ts/logger'; +import { bold, italic } from 'colorette'; + +export class Sparky implements Logging { + private _spark!: Logger; + private _date!: Date; + constructor(logLevel: LogLevel, logStyle: LogStyle) { + console.clear(); + this._spark = new Logger({ logLevel, logStyle }); + this._date = new Date(); + } + + success(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.success( + bold(italic(this._date.toISOString() + ' => ' + payload)) + ); + } + info(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.info(bold(italic(this._date.toISOString() + ' => ' + payload))); + } + warning(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.warn(bold(italic(this._date.toISOString() + ' => ' + payload))); + } + debug(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.debug( + bold(italic(this._date.toISOString() + ' => ' + payload)) + ); + } + error(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.error( + bold(italic(this._date.toISOString() + ' => ' + payload)) + ); + } +} diff --git a/templates/ts-class-template/src/Structures/mongo/properties.ts b/templates/ts-class-template/src/Structures/mongo/properties.ts new file mode 100644 index 00000000..57798da6 --- /dev/null +++ b/templates/ts-class-template/src/Structures/mongo/properties.ts @@ -0,0 +1,18 @@ +import { useContainer } from '#BOT'; +import { env } from '#utils'; +import mongoose from 'mongoose'; +const { connect, set } = mongoose; + +export async function mongoConnect(url?: string) { + useContainer('mongoose'); + const dbOptions = { + keepAlive: true, + keepAliveInitialDelay: 300000, + autoIndex: true, + connectTimeoutMS: 10000, + family: 4, + }; + + set('strictQuery', true); + await connect(url ? url : env.CONNECT!, dbOptions); +} diff --git a/templates/ts-class-template/src/Structures/mongo/schemas/guild.ts b/templates/ts-class-template/src/Structures/mongo/schemas/guild.ts new file mode 100644 index 00000000..b5cf7175 --- /dev/null +++ b/templates/ts-class-template/src/Structures/mongo/schemas/guild.ts @@ -0,0 +1,12 @@ +import mongoose from 'mongoose'; +const { model, Schema } = mongoose; + +const name: string = 'guild'; +export default model( + name, + new Schema({ + name: String, + guildId: String, + }), + name +); diff --git a/templates/ts-class-template/src/client.ts b/templates/ts-class-template/src/client.ts new file mode 100644 index 00000000..e42ce4f1 --- /dev/null +++ b/templates/ts-class-template/src/client.ts @@ -0,0 +1,23 @@ +import { BOT } from '#client'; +import { Sern, Dependencies, Singleton, single } from '@sern/handler'; +import { Sparky } from '#handler'; +import mongoose from 'mongoose'; + +export const client = new BOT(); + +interface MyDependencies extends Dependencies { + '@sern/client': Singleton; + '@sern/logger': Singleton; + mongoose: Singleton; +} + +export const useContainer = Sern.makeDependencies({ + build: (root) => + root + .add({ '@sern/client': single(() => client) }) + .upsert({ + '@sern/logger': single(() => new Sparky('debug', 'highlight')), + }) + .add({ mongoose: single(() => mongoose.connection) }), +}); +client.start(useContainer); diff --git a/templates/ts-class-template/src/commands/tools/ping.ts b/templates/ts-class-template/src/commands/tools/ping.ts new file mode 100644 index 00000000..da9593f2 --- /dev/null +++ b/templates/ts-class-template/src/commands/tools/ping.ts @@ -0,0 +1,12 @@ +import { publish } from '#plugins'; +import { commandModule, CommandType } from '@sern/handler'; + +export default commandModule({ + type: CommandType.Both, + plugins: [publish()], + description: 'A ping command', + //alias : [], + execute: async (ctx, args) => { + await ctx.reply('Pong 🏓'); + }, +}); diff --git a/templates/ts-class-template/src/events/discord/client/ready.ts b/templates/ts-class-template/src/events/discord/client/ready.ts new file mode 100644 index 00000000..6947b53e --- /dev/null +++ b/templates/ts-class-template/src/events/discord/client/ready.ts @@ -0,0 +1,13 @@ +import { logger } from '#utils'; +import { EventType, eventModule } from '@sern/handler'; +import { Client, Events } from 'discord.js'; +import { mongoConnect } from '#handler'; + +export default eventModule({ + type: EventType.Discord, + name: Events.ClientReady, + async execute(client: Client) { + logger().success(`[CLIENT] Logged into Discord as ${client.user?.tag}`); + mongoConnect(); + }, +}); diff --git a/templates/ts-class-template/src/plugins/publish.ts b/templates/ts-class-template/src/plugins/publish.ts new file mode 100644 index 00000000..c5fa95f7 --- /dev/null +++ b/templates/ts-class-template/src/plugins/publish.ts @@ -0,0 +1,188 @@ +// @ts-nocheck +/** + * This is publish plugin, it allows you to publish your application commands using the discord.js library with ease. + * + * @author @EvolutionX-10 [<@697795666373640213>] + * @version 2.0.0 + * @example + * ```ts + * import { publish } from "#publish"; + * import { commandModule } from "@sern/handler"; + * export default commandModule({ + * plugins: [ publish() ], // put an object containing permissions, ids for guild commands, boolean for dmPermission + * // plugins: [ publish({ guildIds: ['guildId'], defaultMemberPermissions: 'Administrator'})] + * execute: (ctx) => { + * //your code here + * } + * }) + * ``` + */ +import { + CommandInitPlugin, + CommandType, + controller, + SernOptionsData, + SlashCommand, +} from '@sern/handler'; +import { + ApplicationCommandData, + ApplicationCommandType, + PermissionResolvable, +} from 'discord.js'; +import { useContainer } from '#BOT'; + +export const CommandTypeRaw = { + [CommandType.Both]: ApplicationCommandType.ChatInput, + [CommandType.CtxUser]: ApplicationCommandType.User, + [CommandType.CtxMsg]: ApplicationCommandType.Message, + [CommandType.Slash]: ApplicationCommandType.ChatInput, +} as const; + +export function publish< + T extends + | CommandType.Both + | CommandType.Slash + | CommandType.CtxMsg + | CommandType.CtxUser +>(options?: PublishOptions) { + return CommandInitPlugin(async ({ module }) => { + // Users need to provide their own useContainer function. + const [client] = useContainer('@sern/client'); + const defaultOptions = { + guildIds: [], + dmPermission: undefined, + defaultMemberPermissions: null, + }; + + options = { ...defaultOptions, ...options } as PublishOptions & + ValidPublishOptions; + let { defaultMemberPermissions, dmPermission, guildIds } = + options as unknown as ValidPublishOptions; + + function c(e: unknown) { + console.error('publish command didnt work for', module.name); + console.error(e); + } + + const log = + (...message: any[]) => + () => + console.log(...message); + const logged = (...message: any[]) => log(message); + /** + * a local function that returns either one value or the other, + * depending on {t}'s CommandType. If the commandtype of + * this module is CommandType.Both or CommandType.Text or CommandType.Slash, + * return 'is', else return 'els' + * @param t + * @returns S | T + */ + const appCmd = (t: V) => { + return (is: S, els: T) => ((t & CommandType.Both) !== 0 ? is : els); + }; + const curAppType = CommandTypeRaw[module.type]; + const createCommandData = () => { + const cmd = appCmd(module.type); + return { + name: module.name, + type: curAppType, + description: cmd(module.description, ''), + options: cmd( + optionsTransformer((module as SlashCommand).options ?? []), + [] + ), + defaultMemberPermissions, + dmPermission, + } as ApplicationCommandData; + }; + + try { + const commandData = createCommandData(); + + if (!guildIds.length) { + const cmd = (await client.application!.commands.fetch()).find( + (c) => c.name === module.name && c.type === curAppType + ); + if (cmd) { + if (!cmd.equals(commandData, true)) { + logged(`Found differences in global command ${module.name}`); + cmd + .edit(commandData) + .then(log(`${module.name} updated with new data successfully!`)); + } + return controller.next(); + } + client + .application!.commands.create(commandData) + .then(log('Command created', module.name)) + .catch(c); + return controller.next(); + } + + for (const id of guildIds) { + const guild = await client.guilds.fetch(id).catch(c); + if (!guild) continue; + const guildCmd = (await guild.commands.fetch()).find( + (c) => c.name === module.name && c.type === curAppType + ); + if (guildCmd) { + if (!guildCmd.equals(commandData, true)) { + logged(`Found differences in command ${module.name}`); + guildCmd + .edit(commandData) + .then(log(`${module.name} updated with new data successfully!`)) + .catch(c); + continue; + } + continue; + } + guild.commands + .create(commandData) + .then(log('Guild Command created', module.name, guild.name)) + .catch(c); + } + return controller.next(); + } catch (e) { + logged('Command did not register' + module.name); + logged(e); + return controller.stop(); + } + }); +} + +export function optionsTransformer(ops: Array) { + return ops.map((el) => + el.autocomplete ? (({ command, ...el }) => el)(el) : el + ); +} + +export type NonEmptyArray = [T, ...T[]]; + +export interface ValidPublishOptions { + guildIds: string[]; + dmPermission: boolean; + defaultMemberPermissions: PermissionResolvable; +} + +interface GuildPublishOptions { + guildIds?: NonEmptyArray; + defaultMemberPermissions?: PermissionResolvable; + dmPermission?: never; +} + +interface GlobalPublishOptions { + defaultMemberPermissions?: PermissionResolvable; + dmPermission?: false; + guildIds?: never; +} + +type BasePublishOptions = GuildPublishOptions | GlobalPublishOptions; + +export type PublishOptions = BasePublishOptions & + ( + | Required> + | ( + | Required> + | Required> + ) + ); diff --git a/templates/ts-class-template/tsconfig.json b/templates/ts-class-template/tsconfig.json new file mode 100644 index 00000000..e722bd24 --- /dev/null +++ b/templates/ts-class-template/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "resolveJsonModule": true, + "moduleResolution": "node", + "target": "ESNext", + "module": "ESNext", + "outDir": "dist", + "rootDir": "src", + "strict": true, + "baseUrl": ".", + "esModuleInterop": true, + "noImplicitAny": true, + "strictNullChecks": true, + "importsNotUsedAsValues": "error", + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "allowUnreachableCode": true, + "allowUnusedLabels": true, + "alwaysStrict": true, + "exactOptionalPropertyTypes": true, + "paths": { + "#client": ["src/Structures/client/index"], + "#utils": ["src/Structures/client/utils"], + "#BOT": ["src/client"], + "#logger": ["src/Structures/handler/sparky"], + "#handler": ["src/Structures/handler/index"], + "#plugins": ["src/Structures/handler/plugins"], + "#schemas/*": ["src/Structures/mongo/schemas/*"] + } + } +} From f1f05088dacec759399eb8fe9285ca9fd867f4e1 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 21:50:51 -0600 Subject: [PATCH 02/12] Add files via upload From 5fc00aaa34833d8761fb169830f5d5480b11cab1 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:25:46 -0600 Subject: [PATCH 03/12] refactor: correct spacing --- templates/ts-class-template/env.example | 3 +++ templates/ts-class-template/sern.config.json | 12 ++++++------ templates/ts-class-template/src/client.ts | 16 ++++++++-------- 3 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 templates/ts-class-template/env.example diff --git a/templates/ts-class-template/env.example b/templates/ts-class-template/env.example new file mode 100644 index 00000000..9400d875 --- /dev/null +++ b/templates/ts-class-template/env.example @@ -0,0 +1,3 @@ +DISCORD_TOKEN= +CONNECT= +ownerIDs=["your_id"] \ No newline at end of file diff --git a/templates/ts-class-template/sern.config.json b/templates/ts-class-template/sern.config.json index 267655bf..b7e37f97 100644 --- a/templates/ts-class-template/sern.config.json +++ b/templates/ts-class-template/sern.config.json @@ -1,7 +1,7 @@ { - "language": "typescript", - "paths": { - "base": "src", - "commands": "commands" - } -} \ No newline at end of file + "language": "typescript", + "paths": { + "base": "src", + "commands": "commands" + } +} diff --git a/templates/ts-class-template/src/client.ts b/templates/ts-class-template/src/client.ts index e42ce4f1..0e581bf5 100644 --- a/templates/ts-class-template/src/client.ts +++ b/templates/ts-class-template/src/client.ts @@ -1,22 +1,22 @@ -import { BOT } from '#client'; -import { Sern, Dependencies, Singleton, single } from '@sern/handler'; -import { Sparky } from '#handler'; -import mongoose from 'mongoose'; +import { BOT } from "#client"; +import { Sern, Dependencies, Singleton, single } from "@sern/handler"; +import { Sparky } from "#handler"; +import mongoose from "mongoose"; export const client = new BOT(); interface MyDependencies extends Dependencies { - '@sern/client': Singleton; - '@sern/logger': Singleton; + "@sern/client": Singleton; + "@sern/logger": Singleton; mongoose: Singleton; } export const useContainer = Sern.makeDependencies({ build: (root) => root - .add({ '@sern/client': single(() => client) }) + .add({ "@sern/client": single(() => client) }) .upsert({ - '@sern/logger': single(() => new Sparky('debug', 'highlight')), + "@sern/logger": single(() => new Sparky("debug", "highlight")), }) .add({ mongoose: single(() => mongoose.connection) }), }); From 3df3787f83e6a84da636b3e49d6f4cdfccde410a Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:32:06 -0600 Subject: [PATCH 04/12] Delete client.ts --- templates/ts-class-template/src/client.ts | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 templates/ts-class-template/src/client.ts diff --git a/templates/ts-class-template/src/client.ts b/templates/ts-class-template/src/client.ts deleted file mode 100644 index 0e581bf5..00000000 --- a/templates/ts-class-template/src/client.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BOT } from "#client"; -import { Sern, Dependencies, Singleton, single } from "@sern/handler"; -import { Sparky } from "#handler"; -import mongoose from "mongoose"; - -export const client = new BOT(); - -interface MyDependencies extends Dependencies { - "@sern/client": Singleton; - "@sern/logger": Singleton; - mongoose: Singleton; -} - -export const useContainer = Sern.makeDependencies({ - build: (root) => - root - .add({ "@sern/client": single(() => client) }) - .upsert({ - "@sern/logger": single(() => new Sparky("debug", "highlight")), - }) - .add({ mongoose: single(() => mongoose.connection) }), -}); -client.start(useContainer); From b26728bfa6cafce9fc9a148eaf8e2ae136633334 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:34:11 -0600 Subject: [PATCH 05/12] refactor: upload client.ts with good spacing --- templates/ts-class-template/src/client.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 templates/ts-class-template/src/client.ts diff --git a/templates/ts-class-template/src/client.ts b/templates/ts-class-template/src/client.ts new file mode 100644 index 00000000..0e581bf5 --- /dev/null +++ b/templates/ts-class-template/src/client.ts @@ -0,0 +1,23 @@ +import { BOT } from "#client"; +import { Sern, Dependencies, Singleton, single } from "@sern/handler"; +import { Sparky } from "#handler"; +import mongoose from "mongoose"; + +export const client = new BOT(); + +interface MyDependencies extends Dependencies { + "@sern/client": Singleton; + "@sern/logger": Singleton; + mongoose: Singleton; +} + +export const useContainer = Sern.makeDependencies({ + build: (root) => + root + .add({ "@sern/client": single(() => client) }) + .upsert({ + "@sern/logger": single(() => new Sparky("debug", "highlight")), + }) + .add({ mongoose: single(() => mongoose.connection) }), +}); +client.start(useContainer); From 728390ff868da177f80be9745e480f83ed664ad3 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:35:51 -0600 Subject: [PATCH 06/12] Delete publish.ts --- .../ts-class-template/src/plugins/publish.ts | 188 ------------------ 1 file changed, 188 deletions(-) delete mode 100644 templates/ts-class-template/src/plugins/publish.ts diff --git a/templates/ts-class-template/src/plugins/publish.ts b/templates/ts-class-template/src/plugins/publish.ts deleted file mode 100644 index c5fa95f7..00000000 --- a/templates/ts-class-template/src/plugins/publish.ts +++ /dev/null @@ -1,188 +0,0 @@ -// @ts-nocheck -/** - * This is publish plugin, it allows you to publish your application commands using the discord.js library with ease. - * - * @author @EvolutionX-10 [<@697795666373640213>] - * @version 2.0.0 - * @example - * ```ts - * import { publish } from "#publish"; - * import { commandModule } from "@sern/handler"; - * export default commandModule({ - * plugins: [ publish() ], // put an object containing permissions, ids for guild commands, boolean for dmPermission - * // plugins: [ publish({ guildIds: ['guildId'], defaultMemberPermissions: 'Administrator'})] - * execute: (ctx) => { - * //your code here - * } - * }) - * ``` - */ -import { - CommandInitPlugin, - CommandType, - controller, - SernOptionsData, - SlashCommand, -} from '@sern/handler'; -import { - ApplicationCommandData, - ApplicationCommandType, - PermissionResolvable, -} from 'discord.js'; -import { useContainer } from '#BOT'; - -export const CommandTypeRaw = { - [CommandType.Both]: ApplicationCommandType.ChatInput, - [CommandType.CtxUser]: ApplicationCommandType.User, - [CommandType.CtxMsg]: ApplicationCommandType.Message, - [CommandType.Slash]: ApplicationCommandType.ChatInput, -} as const; - -export function publish< - T extends - | CommandType.Both - | CommandType.Slash - | CommandType.CtxMsg - | CommandType.CtxUser ->(options?: PublishOptions) { - return CommandInitPlugin(async ({ module }) => { - // Users need to provide their own useContainer function. - const [client] = useContainer('@sern/client'); - const defaultOptions = { - guildIds: [], - dmPermission: undefined, - defaultMemberPermissions: null, - }; - - options = { ...defaultOptions, ...options } as PublishOptions & - ValidPublishOptions; - let { defaultMemberPermissions, dmPermission, guildIds } = - options as unknown as ValidPublishOptions; - - function c(e: unknown) { - console.error('publish command didnt work for', module.name); - console.error(e); - } - - const log = - (...message: any[]) => - () => - console.log(...message); - const logged = (...message: any[]) => log(message); - /** - * a local function that returns either one value or the other, - * depending on {t}'s CommandType. If the commandtype of - * this module is CommandType.Both or CommandType.Text or CommandType.Slash, - * return 'is', else return 'els' - * @param t - * @returns S | T - */ - const appCmd = (t: V) => { - return (is: S, els: T) => ((t & CommandType.Both) !== 0 ? is : els); - }; - const curAppType = CommandTypeRaw[module.type]; - const createCommandData = () => { - const cmd = appCmd(module.type); - return { - name: module.name, - type: curAppType, - description: cmd(module.description, ''), - options: cmd( - optionsTransformer((module as SlashCommand).options ?? []), - [] - ), - defaultMemberPermissions, - dmPermission, - } as ApplicationCommandData; - }; - - try { - const commandData = createCommandData(); - - if (!guildIds.length) { - const cmd = (await client.application!.commands.fetch()).find( - (c) => c.name === module.name && c.type === curAppType - ); - if (cmd) { - if (!cmd.equals(commandData, true)) { - logged(`Found differences in global command ${module.name}`); - cmd - .edit(commandData) - .then(log(`${module.name} updated with new data successfully!`)); - } - return controller.next(); - } - client - .application!.commands.create(commandData) - .then(log('Command created', module.name)) - .catch(c); - return controller.next(); - } - - for (const id of guildIds) { - const guild = await client.guilds.fetch(id).catch(c); - if (!guild) continue; - const guildCmd = (await guild.commands.fetch()).find( - (c) => c.name === module.name && c.type === curAppType - ); - if (guildCmd) { - if (!guildCmd.equals(commandData, true)) { - logged(`Found differences in command ${module.name}`); - guildCmd - .edit(commandData) - .then(log(`${module.name} updated with new data successfully!`)) - .catch(c); - continue; - } - continue; - } - guild.commands - .create(commandData) - .then(log('Guild Command created', module.name, guild.name)) - .catch(c); - } - return controller.next(); - } catch (e) { - logged('Command did not register' + module.name); - logged(e); - return controller.stop(); - } - }); -} - -export function optionsTransformer(ops: Array) { - return ops.map((el) => - el.autocomplete ? (({ command, ...el }) => el)(el) : el - ); -} - -export type NonEmptyArray = [T, ...T[]]; - -export interface ValidPublishOptions { - guildIds: string[]; - dmPermission: boolean; - defaultMemberPermissions: PermissionResolvable; -} - -interface GuildPublishOptions { - guildIds?: NonEmptyArray; - defaultMemberPermissions?: PermissionResolvable; - dmPermission?: never; -} - -interface GlobalPublishOptions { - defaultMemberPermissions?: PermissionResolvable; - dmPermission?: false; - guildIds?: never; -} - -type BasePublishOptions = GuildPublishOptions | GlobalPublishOptions; - -export type PublishOptions = BasePublishOptions & - ( - | Required> - | ( - | Required> - | Required> - ) - ); From 16edf1a150e19514f39aef2db39db515a9022b18 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:36:56 -0600 Subject: [PATCH 07/12] refactor: changed spacing in publish.ts --- .../ts-class-template/src/plugins/publish.ts | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 templates/ts-class-template/src/plugins/publish.ts diff --git a/templates/ts-class-template/src/plugins/publish.ts b/templates/ts-class-template/src/plugins/publish.ts new file mode 100644 index 00000000..c5fa95f7 --- /dev/null +++ b/templates/ts-class-template/src/plugins/publish.ts @@ -0,0 +1,188 @@ +// @ts-nocheck +/** + * This is publish plugin, it allows you to publish your application commands using the discord.js library with ease. + * + * @author @EvolutionX-10 [<@697795666373640213>] + * @version 2.0.0 + * @example + * ```ts + * import { publish } from "#publish"; + * import { commandModule } from "@sern/handler"; + * export default commandModule({ + * plugins: [ publish() ], // put an object containing permissions, ids for guild commands, boolean for dmPermission + * // plugins: [ publish({ guildIds: ['guildId'], defaultMemberPermissions: 'Administrator'})] + * execute: (ctx) => { + * //your code here + * } + * }) + * ``` + */ +import { + CommandInitPlugin, + CommandType, + controller, + SernOptionsData, + SlashCommand, +} from '@sern/handler'; +import { + ApplicationCommandData, + ApplicationCommandType, + PermissionResolvable, +} from 'discord.js'; +import { useContainer } from '#BOT'; + +export const CommandTypeRaw = { + [CommandType.Both]: ApplicationCommandType.ChatInput, + [CommandType.CtxUser]: ApplicationCommandType.User, + [CommandType.CtxMsg]: ApplicationCommandType.Message, + [CommandType.Slash]: ApplicationCommandType.ChatInput, +} as const; + +export function publish< + T extends + | CommandType.Both + | CommandType.Slash + | CommandType.CtxMsg + | CommandType.CtxUser +>(options?: PublishOptions) { + return CommandInitPlugin(async ({ module }) => { + // Users need to provide their own useContainer function. + const [client] = useContainer('@sern/client'); + const defaultOptions = { + guildIds: [], + dmPermission: undefined, + defaultMemberPermissions: null, + }; + + options = { ...defaultOptions, ...options } as PublishOptions & + ValidPublishOptions; + let { defaultMemberPermissions, dmPermission, guildIds } = + options as unknown as ValidPublishOptions; + + function c(e: unknown) { + console.error('publish command didnt work for', module.name); + console.error(e); + } + + const log = + (...message: any[]) => + () => + console.log(...message); + const logged = (...message: any[]) => log(message); + /** + * a local function that returns either one value or the other, + * depending on {t}'s CommandType. If the commandtype of + * this module is CommandType.Both or CommandType.Text or CommandType.Slash, + * return 'is', else return 'els' + * @param t + * @returns S | T + */ + const appCmd = (t: V) => { + return (is: S, els: T) => ((t & CommandType.Both) !== 0 ? is : els); + }; + const curAppType = CommandTypeRaw[module.type]; + const createCommandData = () => { + const cmd = appCmd(module.type); + return { + name: module.name, + type: curAppType, + description: cmd(module.description, ''), + options: cmd( + optionsTransformer((module as SlashCommand).options ?? []), + [] + ), + defaultMemberPermissions, + dmPermission, + } as ApplicationCommandData; + }; + + try { + const commandData = createCommandData(); + + if (!guildIds.length) { + const cmd = (await client.application!.commands.fetch()).find( + (c) => c.name === module.name && c.type === curAppType + ); + if (cmd) { + if (!cmd.equals(commandData, true)) { + logged(`Found differences in global command ${module.name}`); + cmd + .edit(commandData) + .then(log(`${module.name} updated with new data successfully!`)); + } + return controller.next(); + } + client + .application!.commands.create(commandData) + .then(log('Command created', module.name)) + .catch(c); + return controller.next(); + } + + for (const id of guildIds) { + const guild = await client.guilds.fetch(id).catch(c); + if (!guild) continue; + const guildCmd = (await guild.commands.fetch()).find( + (c) => c.name === module.name && c.type === curAppType + ); + if (guildCmd) { + if (!guildCmd.equals(commandData, true)) { + logged(`Found differences in command ${module.name}`); + guildCmd + .edit(commandData) + .then(log(`${module.name} updated with new data successfully!`)) + .catch(c); + continue; + } + continue; + } + guild.commands + .create(commandData) + .then(log('Guild Command created', module.name, guild.name)) + .catch(c); + } + return controller.next(); + } catch (e) { + logged('Command did not register' + module.name); + logged(e); + return controller.stop(); + } + }); +} + +export function optionsTransformer(ops: Array) { + return ops.map((el) => + el.autocomplete ? (({ command, ...el }) => el)(el) : el + ); +} + +export type NonEmptyArray = [T, ...T[]]; + +export interface ValidPublishOptions { + guildIds: string[]; + dmPermission: boolean; + defaultMemberPermissions: PermissionResolvable; +} + +interface GuildPublishOptions { + guildIds?: NonEmptyArray; + defaultMemberPermissions?: PermissionResolvable; + dmPermission?: never; +} + +interface GlobalPublishOptions { + defaultMemberPermissions?: PermissionResolvable; + dmPermission?: false; + guildIds?: never; +} + +type BasePublishOptions = GuildPublishOptions | GlobalPublishOptions; + +export type PublishOptions = BasePublishOptions & + ( + | Required> + | ( + | Required> + | Required> + ) + ); From 43859555f6555138ad0584e9ca17a7ebe6b3a909 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:38:08 -0600 Subject: [PATCH 08/12] Delete sparky.ts --- .../src/Structures/handler/sparky.ts | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 templates/ts-class-template/src/Structures/handler/sparky.ts diff --git a/templates/ts-class-template/src/Structures/handler/sparky.ts b/templates/ts-class-template/src/Structures/handler/sparky.ts deleted file mode 100644 index c4e5d194..00000000 --- a/templates/ts-class-template/src/Structures/handler/sparky.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { Logging, LogPayload } from '@sern/handler'; -import { Logger, LogLevel, LogStyle } from '@spark.ts/logger'; -import { bold, italic } from 'colorette'; - -export class Sparky implements Logging { - private _spark!: Logger; - private _date!: Date; - constructor(logLevel: LogLevel, logStyle: LogStyle) { - console.clear(); - this._spark = new Logger({ logLevel, logStyle }); - this._date = new Date(); - } - - success(payload: LogPayload | any): void { - payload = payload.message || { payload }.payload; - this._spark.success( - bold(italic(this._date.toISOString() + ' => ' + payload)) - ); - } - info(payload: LogPayload | any): void { - payload = payload.message || { payload }.payload; - this._spark.info(bold(italic(this._date.toISOString() + ' => ' + payload))); - } - warning(payload: LogPayload | any): void { - payload = payload.message || { payload }.payload; - this._spark.warn(bold(italic(this._date.toISOString() + ' => ' + payload))); - } - debug(payload: LogPayload | any): void { - payload = payload.message || { payload }.payload; - this._spark.debug( - bold(italic(this._date.toISOString() + ' => ' + payload)) - ); - } - error(payload: LogPayload | any): void { - payload = payload.message || { payload }.payload; - this._spark.error( - bold(italic(this._date.toISOString() + ' => ' + payload)) - ); - } -} From 76b8d68caa2801891920a66360363548c6bc781d Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:38:46 -0600 Subject: [PATCH 09/12] refactor: changed spacing in sparky.ts --- .../src/Structures/handler/sparky.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 templates/ts-class-template/src/Structures/handler/sparky.ts diff --git a/templates/ts-class-template/src/Structures/handler/sparky.ts b/templates/ts-class-template/src/Structures/handler/sparky.ts new file mode 100644 index 00000000..c4e5d194 --- /dev/null +++ b/templates/ts-class-template/src/Structures/handler/sparky.ts @@ -0,0 +1,40 @@ +import type { Logging, LogPayload } from '@sern/handler'; +import { Logger, LogLevel, LogStyle } from '@spark.ts/logger'; +import { bold, italic } from 'colorette'; + +export class Sparky implements Logging { + private _spark!: Logger; + private _date!: Date; + constructor(logLevel: LogLevel, logStyle: LogStyle) { + console.clear(); + this._spark = new Logger({ logLevel, logStyle }); + this._date = new Date(); + } + + success(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.success( + bold(italic(this._date.toISOString() + ' => ' + payload)) + ); + } + info(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.info(bold(italic(this._date.toISOString() + ' => ' + payload))); + } + warning(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.warn(bold(italic(this._date.toISOString() + ' => ' + payload))); + } + debug(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.debug( + bold(italic(this._date.toISOString() + ' => ' + payload)) + ); + } + error(payload: LogPayload | any): void { + payload = payload.message || { payload }.payload; + this._spark.error( + bold(italic(this._date.toISOString() + ' => ' + payload)) + ); + } +} From b529aca8466a22a61e70c72c9545b5b13e5081ef Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:39:41 -0600 Subject: [PATCH 10/12] Delete load.ts --- .../src/Structures/client/load.ts | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 templates/ts-class-template/src/Structures/client/load.ts diff --git a/templates/ts-class-template/src/Structures/client/load.ts b/templates/ts-class-template/src/Structures/client/load.ts deleted file mode 100644 index 86dfb93a..00000000 --- a/templates/ts-class-template/src/Structures/client/load.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { existsSync, readFileSync } from 'fs'; -export function load( - struct: Struct, - path: string = '.env', - inject: boolean = true -): T { - const out: T = {} as never; - - if (!existsSync(path)) { - throw new Error(`Cannot read contents of '${path}': File does not exist`); - } - - const file = readFileSync(path); - const lines = file.toString().split('\n'); - - const raw: Record = {}; - - for (const line of lines) { - const [key, value] = [ - line.split('=')[0], - line.split('=').slice(1).join('='), - ] as [string, string]; - - let real_value = value; - - try { - real_value = JSON.stringify(JSON.parse(value)); - } catch { - void real_value; - } - - raw[key] = value; - } - - for (const key in struct) { - if (!(key in raw)) { - throw new Error(`Cannot map key '${key}': Key does not exist`); - } - - // safety(as): assertion above guarantees string - out[key] = struct[key](raw[key] as string); - } - - if (inject) { - Object.assign(process.env, out); - } - - return out; -} - -export type Struct = { - [P in keyof T]: (str: string) => T[P]; -}; From f791b16429071d093d4d6c032f8cf6d79db0cff6 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:42:18 -0600 Subject: [PATCH 11/12] refactor: changed spacing in load.ts Also giving credit to @trueharuu for making this env loader to support arrays --- .../src/Structures/client/load.ts | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 templates/ts-class-template/src/Structures/client/load.ts diff --git a/templates/ts-class-template/src/Structures/client/load.ts b/templates/ts-class-template/src/Structures/client/load.ts new file mode 100644 index 00000000..9ab9fb11 --- /dev/null +++ b/templates/ts-class-template/src/Structures/client/load.ts @@ -0,0 +1,56 @@ +/** +* courtesy of @trueharuu [<@504698587221852172>] +*/ +import { existsSync, readFileSync } from 'fs'; +export function load( + struct: Struct, + path: string = '.env', + inject: boolean = true +): T { + const out: T = {} as never; + + if (!existsSync(path)) { + throw new Error(`Cannot read contents of '${path}': File does not exist`); + } + + const file = readFileSync(path); + const lines = file.toString().split('\n'); + + const raw: Record = {}; + + for (const line of lines) { + const [key, value] = [ + line.split('=')[0], + line.split('=').slice(1).join('='), + ] as [string, string]; + + let real_value = value; + + try { + real_value = JSON.stringify(JSON.parse(value)); + } catch { + void real_value; + } + + raw[key] = value; + } + + for (const key in struct) { + if (!(key in raw)) { + throw new Error(`Cannot map key '${key}': Key does not exist`); + } + + // safety(as): assertion above guarantees string + out[key] = struct[key](raw[key] as string); + } + + if (inject) { + Object.assign(process.env, out); + } + + return out; +} + +export type Struct = { + [P in keyof T]: (str: string) => T[P]; +}; From 1c1e68387013be37595f4605d134cbf80717e580 Mon Sep 17 00:00:00 2001 From: Peter-MJ-Parker <34216187+Peter-MJ-Parker@users.noreply.github.com> Date: Wed, 8 Mar 2023 03:18:42 -0600 Subject: [PATCH 12/12] feat: bypasses mongoose connection if no uri Edit ready event so it will bypass the mongoose connection if there is no uri present --- .../ts-class-template/src/events/discord/client/ready.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/templates/ts-class-template/src/events/discord/client/ready.ts b/templates/ts-class-template/src/events/discord/client/ready.ts index 6947b53e..f4e3be5e 100644 --- a/templates/ts-class-template/src/events/discord/client/ready.ts +++ b/templates/ts-class-template/src/events/discord/client/ready.ts @@ -1,13 +1,14 @@ -import { logger } from '#utils'; -import { EventType, eventModule } from '@sern/handler'; -import { Client, Events } from 'discord.js'; -import { mongoConnect } from '#handler'; +import { env, logger } from "#utils"; +import { EventType, eventModule } from "@sern/handler"; +import { Client, Events } from "discord.js"; +import { mongoConnect } from "#handler"; export default eventModule({ type: EventType.Discord, name: Events.ClientReady, async execute(client: Client) { logger().success(`[CLIENT] Logged into Discord as ${client.user?.tag}`); + if (!env.CONNECT) return; mongoConnect(); }, });