From 9a7fbfa58fc47809de38aaa5b504332de08c222c Mon Sep 17 00:00:00 2001 From: flifloo Date: Sun, 21 Nov 2021 18:15:40 +0100 Subject: [PATCH] Base structure of the bot --- .gitignore | 9 + config.json.example | 3 + package-lock.json | 693 +++++++++++++++++++++++++++++++++ package.json | 35 ++ src/index.ts | 32 ++ src/lib/AdministratorClient.ts | 7 + src/lib/Command.ts | 47 +++ src/lib/Module.ts | 21 + src/lib/Modules.ts | 80 ++++ src/modules/Utils/about.ts | 25 ++ src/modules/Utils/index.ts | 15 + src/modules/Utils/info.ts | 91 +++++ src/modules/Utils/ping.ts | 19 + tsconfig.json | 15 + 14 files changed, 1092 insertions(+) create mode 100644 config.json.example create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/index.ts create mode 100644 src/lib/AdministratorClient.ts create mode 100644 src/lib/Command.ts create mode 100644 src/lib/Module.ts create mode 100644 src/lib/Modules.ts create mode 100644 src/modules/Utils/about.ts create mode 100644 src/modules/Utils/index.ts create mode 100644 src/modules/Utils/info.ts create mode 100644 src/modules/Utils/ping.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 6704566..d495d3a 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,12 @@ dist # TernJS port file .tern-port + +# JetBrain stuff +.idea + +# TypeScript compiled sources +*.js + +# Configuration +config.json diff --git a/config.json.example b/config.json.example new file mode 100644 index 0000000..de197e3 --- /dev/null +++ b/config.json.example @@ -0,0 +1,3 @@ +{ + "token": "" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8969710 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,693 @@ +{ + "name": "administrator", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "administrator", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@discordjs/builders": "^0.6.0", + "@discordjs/rest": "^0.1.0-canary.0", + "discord-api-types": "^0.23.1", + "discord.js": "^13.1.0" + }, + "devDependencies": { + "typescript": "^4.5.2" + } + }, + "node_modules/@discordjs/builders": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.6.0.tgz", + "integrity": "sha512-mH3Gx61LKk2CD05laCI9K5wp+a3NyASHDUGx83DGJFkqJlRlSV5WMJNY6RS37A5SjqDtGMF4wVR9jzFaqShe6Q==", + "dependencies": { + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.27.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@discordjs/collection": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.2.1.tgz", + "integrity": "sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@discordjs/rest": { + "version": "0.1.0-canary.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.1.0-canary.0.tgz", + "integrity": "sha512-d+s//ISYVV+e0w/926wMEeO7vju+Pn11x1JM4tcmVMCHSDgpi6pnFCNAXF1TEdnDcy7xf9tq5cf2pQkb/7ySTQ==", + "dependencies": { + "@discordjs/collection": "^0.1.6", + "@sapphire/async-queue": "^1.1.4", + "@sapphire/snowflake": "^1.3.5", + "abort-controller": "^3.0.0", + "discord-api-types": "^0.18.1", + "form-data": "^4.0.0", + "node-fetch": "^2.6.1", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.18.1.tgz", + "integrity": "sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg==", + "deprecated": "No longer supported. Install the latest release (0.20.2)", + "engines": { + "node": ">=12" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz", + "integrity": "sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA==", + "engines": { + "node": ">=14", + "npm": ">=6" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-1.3.6.tgz", + "integrity": "sha512-QnzuLp+p9D7agynVub/zqlDVriDza9y3STArBhNiNBUgIX8+GL5FpQxstRfw1jDr5jkZUjcuKYAHxjIuXKdJAg==", + "deprecated": "This version has been automatically deprecated by @favware/npm-deprecate. Please use a newer version.", + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@types/node": { + "version": "16.9.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", + "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/discord-api-types": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.23.1.tgz", + "integrity": "sha512-igWmn+45mzXRWNEPU25I/pr8MwxHb767wAr51oy3VRLRcTlp5ADBbrBR0lq3SA1Rfw3MtM4TQu1xo3kxscfVdQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/discord.js": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.1.0.tgz", + "integrity": "sha512-gxO4CXKdHpqA+WKG+f5RNnd3srTDj5uFJHgOathksDE90YNq/Qijkd2WlMgTTMS6AJoEnHxI7G9eDQHCuZ+xDA==", + "dependencies": { + "@discordjs/builders": "^0.5.0", + "@discordjs/collection": "^0.2.1", + "@discordjs/form-data": "^3.0.1", + "@sapphire/async-queue": "^1.1.4", + "@types/ws": "^7.4.7", + "discord-api-types": "^0.22.0", + "node-fetch": "^2.6.1", + "ws": "^7.5.1" + }, + "engines": { + "node": ">=16.6.0", + "npm": ">=7.0.0" + } + }, + "node_modules/discord.js/node_modules/@discordjs/builders": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.5.0.tgz", + "integrity": "sha512-HP5y4Rqw68o61Qv4qM5tVmDbWi4mdTFftqIOGRo33SNPpLJ1Ga3KEIR2ibKofkmsoQhEpLmopD1AZDs3cKpHuw==", + "dependencies": { + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.27.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/ow": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz", + "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==", + "dependencies": { + "@sindresorhus/is": "^4.0.1", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^1.2.1", + "vali-date": "^1.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/ts-mixer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", + "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "engines": { + "node": ">=8.3.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": "0.6.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.6.0.tgz", + "integrity": "sha512-mH3Gx61LKk2CD05laCI9K5wp+a3NyASHDUGx83DGJFkqJlRlSV5WMJNY6RS37A5SjqDtGMF4wVR9jzFaqShe6Q==", + "requires": { + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.27.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + } + } + }, + "@discordjs/collection": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.2.1.tgz", + "integrity": "sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog==" + }, + "@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "@discordjs/rest": { + "version": "0.1.0-canary.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.1.0-canary.0.tgz", + "integrity": "sha512-d+s//ISYVV+e0w/926wMEeO7vju+Pn11x1JM4tcmVMCHSDgpi6pnFCNAXF1TEdnDcy7xf9tq5cf2pQkb/7ySTQ==", + "requires": { + "@discordjs/collection": "^0.1.6", + "@sapphire/async-queue": "^1.1.4", + "@sapphire/snowflake": "^1.3.5", + "abort-controller": "^3.0.0", + "discord-api-types": "^0.18.1", + "form-data": "^4.0.0", + "node-fetch": "^2.6.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "discord-api-types": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.18.1.tgz", + "integrity": "sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg==" + } + } + }, + "@sapphire/async-queue": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz", + "integrity": "sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA==" + }, + "@sapphire/snowflake": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-1.3.6.tgz", + "integrity": "sha512-QnzuLp+p9D7agynVub/zqlDVriDza9y3STArBhNiNBUgIX8+GL5FpQxstRfw1jDr5jkZUjcuKYAHxjIuXKdJAg==" + }, + "@sindresorhus/is": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" + }, + "@types/node": { + "version": "16.9.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", + "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==" + }, + "@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "requires": { + "@types/node": "*" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "discord-api-types": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.23.1.tgz", + "integrity": "sha512-igWmn+45mzXRWNEPU25I/pr8MwxHb767wAr51oy3VRLRcTlp5ADBbrBR0lq3SA1Rfw3MtM4TQu1xo3kxscfVdQ==" + }, + "discord.js": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.1.0.tgz", + "integrity": "sha512-gxO4CXKdHpqA+WKG+f5RNnd3srTDj5uFJHgOathksDE90YNq/Qijkd2WlMgTTMS6AJoEnHxI7G9eDQHCuZ+xDA==", + "requires": { + "@discordjs/builders": "^0.5.0", + "@discordjs/collection": "^0.2.1", + "@discordjs/form-data": "^3.0.1", + "@sapphire/async-queue": "^1.1.4", + "@types/ws": "^7.4.7", + "discord-api-types": "^0.22.0", + "node-fetch": "^2.6.1", + "ws": "^7.5.1" + }, + "dependencies": { + "@discordjs/builders": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.5.0.tgz", + "integrity": "sha512-HP5y4Rqw68o61Qv4qM5tVmDbWi4mdTFftqIOGRo33SNPpLJ1Ga3KEIR2ibKofkmsoQhEpLmopD1AZDs3cKpHuw==", + "requires": { + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.27.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.0" + } + }, + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + } + } + }, + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "ow": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz", + "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==", + "requires": { + "@sindresorhus/is": "^4.0.1", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^1.2.1", + "vali-date": "^1.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "ts-mixer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", + "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" + }, + "typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "requires": {} + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..67297b5 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "administrator", + "version": "1.0.0", + "description": "A Discord bot for administration", + "main": "src/index.ts", + "directories": { + "test": "test" + }, + "scripts": { + "run": "tsc && node src/index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/flifloo/Administrator.git" + }, + "keywords": [ + "discord-bot" + ], + "author": "flifloo ", + "license": "MIT", + "bugs": { + "url": "https://github.com/flifloo/Administrator/issues" + }, + "homepage": "https://github.com/flifloo/Administrator#readme", + "dependencies": { + "@discordjs/builders": "^0.6.0", + "@discordjs/rest": "^0.1.0-canary.0", + "discord-api-types": "^0.23.1", + "discord.js": "^13.1.0" + }, + "devDependencies": { + "typescript": "^4.5.2" + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..b5d9229 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,32 @@ +import "fs"; +import { Intents } from "discord.js"; +import "./lib/Modules"; +import {AdministratorClient} from "./lib/AdministratorClient"; + +const config = require("../config.json"); +const client = new AdministratorClient({ intents: [Intents.FLAGS.GUILDS] }); + + +client.once("ready", async () => { + client.application = await client.application?.fetch() ?? null; + await client.modules.loadAllModules(); + console.log("Started !"); +}); + +client.on("interactionCreate", async interaction => { + if (!interaction.isCommand()) return; + + const command = client.modules.getCommand(interaction.commandName); + + if (!command) return; + + try { + await command.execute(interaction); + } catch (error) { + console.error(error); + await interaction.reply({ content: "There was an error while executing this command !", ephemeral: true }); + } +}); + + +void client.login(config.token); diff --git a/src/lib/AdministratorClient.ts b/src/lib/AdministratorClient.ts new file mode 100644 index 0000000..e210867 --- /dev/null +++ b/src/lib/AdministratorClient.ts @@ -0,0 +1,7 @@ +import {Client} from "discord.js"; +import {Modules} from "./Modules"; + +export class AdministratorClient extends Client { + + modules: Modules = new Modules(this); +} diff --git a/src/lib/Command.ts b/src/lib/Command.ts new file mode 100644 index 0000000..da340ef --- /dev/null +++ b/src/lib/Command.ts @@ -0,0 +1,47 @@ +import { + ApplicationCommand, ApplicationCommandData, + CommandInteraction, + GuildResolvable, +} from "discord.js"; +import {Module} from "./Module"; + + +export abstract class Command { + module: Module; + data: ApplicationCommandData; + scope: ApplicationCommand<{ guild: GuildResolvable }> | undefined; + + constructor(module: Module) { + this.module = module; + this.data = null as any; + } + + abstract execute(interaction: CommandInteraction): void; + + async register() { + try { + this.scope = await this.module.modules.client?.application?.commands.create(this.data); + + console.log("Successfully registered commands " + this.scope?.name); + } catch (error) { + console.error(error); + } + } + + async isRegister(): Promise { + if (this.scope) + return !! await this.module.modules.client?.application?.commands.fetch(this.scope.id); + + return false; + } + + async load() { + if (!await this.isRegister()) + await this.register(); + } + + async unload() { + if (await this.isRegister()) + await this.unload(); + } +} diff --git a/src/lib/Module.ts b/src/lib/Module.ts new file mode 100644 index 0000000..7eda0a2 --- /dev/null +++ b/src/lib/Module.ts @@ -0,0 +1,21 @@ +import {Command} from "./Command"; +import {Modules} from "./Modules"; + +export class Module { + commands: Command[] = new Array(); + modules: Modules; + + constructor(modules: Modules) { + this.modules = modules; + } + + async load() { + await Promise.all(this.commands.map(cmd => cmd.load())); + } + + async unload() { + if (this.modules.client) { + await Promise.all(this.commands.map(cmd => cmd.unload())) + } + } +} diff --git a/src/lib/Modules.ts b/src/lib/Modules.ts new file mode 100644 index 0000000..279a437 --- /dev/null +++ b/src/lib/Modules.ts @@ -0,0 +1,80 @@ +import { readdirSync } from "fs"; +import {Module} from "./Module"; +import {Command} from "./Command"; +import {AdministratorClient} from "./AdministratorClient"; + +export class Modules { + modules: Map = new Map(); + client: AdministratorClient; + + constructor(client: AdministratorClient) { + this.client = client; + } + + async load(name: string) { + try { + const module: Module = new (require(__dirname+`/../modules/${name}`)[name])(this); + await module.load(); + this.modules.set(name, module); + console.info(`Module ${name} loaded`) + } catch (error) { + console.error(`Fail to load module ${name}`); + console.error(error); + return false + } + return true; + } + + async unload(name: string) { + try { + const module = this.modules.get(name); + if (!module) { + console.error(`Module ${name} not found`); + return false; + } + await module.unload(); + this.modules.delete(name); + console.info(`Module ${name} unloaded`) + } catch (error) { + console.error(`Fail to unload module ${name}`); + console.error(error); + return false + } + return true; + } + + async reload(name: string) { + if (await this.unload(name)) + return await this.load(name); + return false + } + + async allModules() { + return readdirSync(__dirname+"/../modules", {withFileTypes: true}) + .filter(file => file.isDirectory()) + } + + async loadAllModules() { + for (const module of await this.allModules()) + await this.load(module.name); + } + + async unloadAllModules() { + for (const module of await this.allModules()) + await this.unload(module.name); + } + + async reloadAllModules() { + for (const module of await this.allModules()) + await this.reload(module.name); + } + + getCommand(name: string): Command | null { + for (const module of Array.from(this.modules.values())) + for (const command of module.commands) + if (command.data.name == name) + return command; + + return null; + } +} diff --git a/src/modules/Utils/about.ts b/src/modules/Utils/about.ts new file mode 100644 index 0000000..a663cf3 --- /dev/null +++ b/src/modules/Utils/about.ts @@ -0,0 +1,25 @@ +import {Command} from "../../lib/Command"; +import {ChatInputApplicationCommandData, CommandInteraction, MessageEmbed} from "discord.js"; + +export class AboutCommand extends Command { + data: ChatInputApplicationCommandData = { + name: "about", + description: "Show information about the bot" + }; + + async execute(interaction: CommandInteraction) { + const flifloo = await interaction.client.users.fetch("177393521051959306"); + + // @ts-ignore + const embed = new MessageEmbed().setTitle(interaction.guild ? interaction.guild.me.displayName : `${interaction.client.user.username}#${interaction.client.user.discriminator}`) + .setDescription(interaction.client.application?.description as string) // @ts-ignore + .setAuthor("Administrator", interaction.client.user.avatarURL(), "https://github.com/flifloo") // @ts-ignore + .setFooter(`Made with ❤️ by ${flifloo.username}#${flifloo.discriminator}`, flifloo.avatarURL()) // @ts-ignore + .addField("Owned by", interaction.client.application?.owner.toString()) + .addField("Guilds", (await interaction.client.guilds.fetch()).size.toString()) + .addField("Modules", this.module.modules.modules.size.toString()) + .addField("Commands", Array.from(this.module.modules.modules.values()).map(m => m.commands.length).reduce((sum, current) => sum+current).toString()); + + await interaction.reply({embeds: [embed]}); + } +} diff --git a/src/modules/Utils/index.ts b/src/modules/Utils/index.ts new file mode 100644 index 0000000..1204fa3 --- /dev/null +++ b/src/modules/Utils/index.ts @@ -0,0 +1,15 @@ +import {AboutCommand} from "./about"; +import {Module} from "../../lib/Module"; +import {Modules} from "../../lib/Modules"; +import {InfoCommand} from "./info"; +import {PingCommand} from "./ping"; + +export class Utils extends Module { + + constructor(modules: Modules) { + super(modules); + this.commands.push(new AboutCommand(this)); + this.commands.push(new InfoCommand(this)); + this.commands.push(new PingCommand(this)) + } +} diff --git a/src/modules/Utils/info.ts b/src/modules/Utils/info.ts new file mode 100644 index 0000000..67faf2c --- /dev/null +++ b/src/modules/Utils/info.ts @@ -0,0 +1,91 @@ +import {Command} from "../../lib/Command"; +import { + CategoryChannel, + ChatInputApplicationCommandData, + CommandInteraction, + GuildMember, + MessageEmbed, + TextChannel, + VoiceChannel +} from "discord.js"; +const {Constants: { ApplicationCommandOptionTypes }} = require("discord.js"); + + +export class InfoCommand extends Command { + data: ChatInputApplicationCommandData = { + name: "info", + description: "Show information of the current guild or the specified user", + options: [{ + type: ApplicationCommandOptionTypes.USER, + name: "target", + description: "The target user" + }] + }; + + async execute(interaction: CommandInteraction) { + let embed = new MessageEmbed(); + let target = interaction.options.get("target"); + + if (target) { + if (target.member && target.member instanceof GuildMember) { + embed = embed.addField("DisplayName", target.member.displayName) + .addField("Joined at", target.member.joinedAt?.toString() || 'N/A'); + if (target.member.premiumSince) + embed = embed.addField("Guild premium since", target.member.premiumSince.toString()); + } + + embed = embed.setTitle(`${target.user?.username}#${target.user?.discriminator}`) + .setAuthor("User info", target.user?.avatarURL() || '') + .addField("Created at", target.user?.createdAt.toString() || 'N/A') + .addField("ID", target.user?.id || 'N/A'); + + //if (target.user?.bot) + // embed = embed.addField("Owner", (await target. .fetch()).owner.toString()) + } else { + if (interaction.channel instanceof TextChannel) { + embed = embed.setTitle(interaction.guild?.name || 'N/A') + .setAuthor("Guild infos", interaction.guild?.iconURL() || ''); + //.addField("Region", interaction.guild.voiceRegions()) + const owner = await interaction.guild?.fetchOwner(); + embed.addField("Owner", `${owner?.toString()}`); + if (interaction.guild?.maximumPresences) + embed = embed.addField("Max presences", interaction.guild?.maximumPresences.toString() || 'N/A'); + if (interaction.guild?.description) + embed = embed.addField("Description", interaction.guild.description); + embed = embed.addField("Two factor authorisation level", interaction.guild?.mfaLevel || 'N/A', true) + .addField("Verification level", interaction.guild?.verificationLevel || 'N/A', true) + .addField("Explicit content filter", interaction.guild?.explicitContentFilter || 'N/A', true) + .addField("Default notifications", interaction.guild?.defaultMessageNotifications.toString() || 'N/A', true); + //if (interaction.guild.features) + // embed = embed.addField("Features", interaction.guild.features.length); + if (interaction.guild?.large) + embed = embed.addField("Large", interaction.guild?.large ? "Yes" : "No", true); + if (interaction.guild?.preferredLocale) + embed = embed.addField("Preferred locale", interaction.guild.preferredLocale, true); + embed = embed.addField("Premium", `Tier: ${interaction.guild?.premiumTier} | Boosts: ${interaction.guild?.premiumSubscriptionCount}`); + + const channels = await interaction.guild?.channels.fetch(); + // ToDo news and store channels support + embed = embed.addField("Channels", `Text: ${channels?.filter(c => c instanceof TextChannel).size} | Voice: ${channels?.filter(c => c instanceof VoiceChannel).size}\nCategories: ${channels?.filter(c => c instanceof CategoryChannel).size} | Total: ${channels?.size}`); + + + embed = embed.addField("Members", `${interaction.guild?.memberCount}${interaction.guild?.maximumMembers ? "/"+interaction.guild.maximumMembers: ""}`, true) + .addField("Roles", (await interaction.guild?.roles.fetch())?.size.toString() || 'N/A', true) + .addField("Invites", (await interaction.guild?.invites.fetch())?.size.toString() || 'N/A', true) + .addField("Emojis", (await interaction.guild?.emojis.fetch())?.size.toString() || 'N/A', true) + .addField("Addons", `Webhooks: ${(await interaction.guild?.fetchWebhooks())?.size} | Integrations: ${(await interaction.guild?.fetchIntegrations())?.size}`); + if (interaction.guild?.systemChannel) + embed = embed.addField("System channel", interaction.guild.systemChannel.toString()); + if (interaction.guild?.rulesChannel) + embed = embed.addField("Rules channel", interaction.guild.rulesChannel.toString()); + if (interaction.guild?.publicUpdatesChannel) + embed = embed.addField("Public updates channel", interaction.guild.publicUpdatesChannel.toString()); + embed = embed.addField("Created at", interaction.guild?.createdAt.toString() || 'N/A') + } + } + + embed = embed.setFooter("Administrator", interaction.client.application?.iconURL() || ''); + + await interaction.reply({embeds: [embed]}); + } +} diff --git a/src/modules/Utils/ping.ts b/src/modules/Utils/ping.ts new file mode 100644 index 0000000..41a7f95 --- /dev/null +++ b/src/modules/Utils/ping.ts @@ -0,0 +1,19 @@ +import {Command} from "../../lib/Command"; +import { + ChatInputApplicationCommandData, + CommandInteraction, +} from "discord.js"; + +export class PingCommand extends Command { + data: ChatInputApplicationCommandData = { + name: "ping", + description: "Replies with Pong and the bot ping" + }; + + async execute(interaction: CommandInteraction) { + const msg = `Pong !\nReceive: ${new Date().getTime() - interaction.createdAt.getTime()}ms`; + const start = Date.now(); + await interaction.reply(msg); + await interaction.editReply(`${msg}\nSend: ${Date.now() - start}ms`); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ceb46b8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Node 16", + + "compilerOptions": { + "lib": ["es2021"], + "module": "commonjs", + "target": "es2021", + + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} \ No newline at end of file