diff options
| author | IRONM00N <64110067+IRONM00N@users.noreply.github.com> | 2021-07-04 15:25:32 -0400 |
|---|---|---|
| committer | IRONM00N <64110067+IRONM00N@users.noreply.github.com> | 2021-07-04 15:25:32 -0400 |
| commit | cf564dbb6435886f97e2e9870363144386af368d (patch) | |
| tree | d535cd73f24a145ca9d7ce1a0e1174cba0d38b31 | |
| parent | 34f0d1d3ff3e2a90193c9a4d4de29d8335160d6a (diff) | |
| download | tanzanite-cf564dbb6435886f97e2e9870363144386af368d.tar.gz tanzanite-cf564dbb6435886f97e2e9870363144386af368d.tar.bz2 tanzanite-cf564dbb6435886f97e2e9870363144386af368d.zip | |
mute command
| -rwxr-xr-x | .pnp.js | 128 | ||||
| -rw-r--r-- | package.json | 10 | ||||
| -rw-r--r-- | src/commands/dev/eval.ts | 2 | ||||
| -rw-r--r-- | src/commands/dev/reload.ts | 6 | ||||
| -rw-r--r-- | src/commands/dev/testDuration.ts | 54 | ||||
| -rw-r--r-- | src/commands/moderation/kick.ts | 2 | ||||
| -rw-r--r-- | src/commands/moderation/mute.ts | 171 | ||||
| -rw-r--r-- | src/lib/extensions/discord-akairo/BushClient.ts | 14 | ||||
| -rw-r--r-- | src/lib/extensions/discord-akairo/BushClientUtil.ts | 106 | ||||
| -rw-r--r-- | src/lib/extensions/discord.js/BushGuildMember.ts | 62 | ||||
| -rw-r--r-- | src/lib/models/Ban.ts | 10 | ||||
| -rw-r--r-- | src/lib/models/Guild.ts | 8 | ||||
| -rw-r--r-- | src/lib/models/ModLog.ts | 11 | ||||
| -rw-r--r-- | src/lib/models/Mute.ts | 10 | ||||
| -rw-r--r-- | src/lib/models/PunishmentRole.ts | 10 | ||||
| -rw-r--r-- | src/lib/utils/BushConstants.ts | 24 | ||||
| -rw-r--r-- | src/listeners/commands/commandError.ts | 17 | ||||
| -rw-r--r-- | src/listeners/commands/commandMissingPermissions.ts | 12 | ||||
| -rw-r--r-- | src/listeners/commands/slashCommandError.ts | 17 | ||||
| -rw-r--r-- | yarn.lock | 80 |
20 files changed, 494 insertions, 260 deletions
@@ -40,8 +40,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@discordjs/voice", "npm:0.4.0"], ["@types/common-tags", "npm:1.8.0"], ["@types/express", "npm:4.17.12"], + ["@types/humanize-duration", "npm:3.25.0"], ["@types/node", "npm:14.17.4"], - ["@types/uuid", "npm:8.3.0"], + ["@types/uuid", "npm:8.3.1"], ["@typescript-eslint/eslint-plugin", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:4.28.1"], ["@typescript-eslint/parser", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:4.28.1"], ["body-parser", "npm:1.19.0"], @@ -49,11 +50,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["common-tags", "npm:1.8.0"], ["discord-akairo", "https://github.com/NotEnoughUpdates/discord-akairo.git#commit=58e5a8610d9cb47257cb163a94e284113a39a62b"], ["discord-api-types", "npm:0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e"], - ["discord.js", "npm:13.0.0-dev.fe6cc0c.1625184228"], + ["discord.js", "npm:13.0.0-dev.7e30011.1625338909"], ["esbuild", "npm:0.12.14"], - ["eslint", "npm:7.29.0"], + ["eslint", "npm:7.30.0"], ["eslint-config-prettier", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:8.3.0"], ["got", "npm:11.8.2"], + ["humanize-duration", "npm:3.27.0"], ["moment", "npm:2.29.1"], ["pg", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:8.6.0"], ["pg-hstore", "npm:2.3.4"], @@ -99,10 +101,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }] ]], ["@discordjs/builders", [ - ["npm:0.1.1", { - "packageLocation": "./.yarn/cache/@discordjs-builders-npm-0.1.1-86a3db61e4-2902d53542.zip/node_modules/@discordjs/builders/", + ["npm:0.2.0", { + "packageLocation": "./.yarn/cache/@discordjs-builders-npm-0.2.0-7a1dcef5dd-d273d10d71.zip/node_modules/@discordjs/builders/", "packageDependencies": [ - ["@discordjs/builders", "npm:0.1.1"], + ["@discordjs/builders", "npm:0.2.0"], ["discord-api-types", "npm:0.18.1"], ["tslib", "npm:2.3.0"] ], @@ -135,7 +137,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@discordjs-voice-npm-0.4.0-275bceca0f-a1b65c946d.zip/node_modules/@discordjs/voice/", "packageDependencies": [ ["@discordjs/voice", "npm:0.4.0"], - ["@types/ws", "npm:7.4.5"], + ["@types/ws", "npm:7.4.6"], ["discord-api-types", "npm:0.18.1"], ["prism-media", "virtual:275bceca0f79f8e7aeb7f77acb5a6bd201e7eea264e9dfd8dcc0bcf35691357327303c09557dfc1495b9a1f8e9cf8278133d234783570df6cb70a249778f3198#npm:1.3.1"], ["tiny-typed-emitter", "npm:2.0.3"], @@ -162,6 +164,27 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD", }] ]], + ["@humanwhocodes/config-array", [ + ["npm:0.5.0", { + "packageLocation": "./.yarn/cache/@humanwhocodes-config-array-npm-0.5.0-5ded120470-71e3c1fef4.zip/node_modules/@humanwhocodes/config-array/", + "packageDependencies": [ + ["@humanwhocodes/config-array", "npm:0.5.0"], + ["@humanwhocodes/object-schema", "npm:1.2.0"], + ["debug", "virtual:f8b688e6542ef635eefae684748f7db5410cd1803b0f43b02ae3ebd860a79349e9ae07146ce05bdfb5fca9536ad9dbe230ed7f4c2f2ffe26893f1f1b0b8700e7#npm:4.3.2"], + ["minimatch", "npm:3.0.4"] + ], + "linkType": "HARD", + }] + ]], + ["@humanwhocodes/object-schema", [ + ["npm:1.2.0", { + "packageLocation": "./.yarn/cache/@humanwhocodes-object-schema-npm-1.2.0-6bc0ff9fda-ef533ee0d2.zip/node_modules/@humanwhocodes/object-schema/", + "packageDependencies": [ + ["@humanwhocodes/object-schema", "npm:1.2.0"] + ], + "linkType": "HARD", + }] + ]], ["@nodelib/fs.scandir", [ ["npm:2.1.5", { "packageLocation": "./.yarn/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-91b3de88d9.zip/node_modules/@nodelib/fs.scandir/", @@ -227,7 +250,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["@types/body-parser", "npm:1.19.0"], ["@types/connect", "npm:3.4.34"], - ["@types/node", "npm:15.14.0"] + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] @@ -239,7 +262,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/cacheable-request", "npm:6.0.1"], ["@types/http-cache-semantics", "npm:4.0.0"], ["@types/keyv", "npm:3.1.1"], - ["@types/node", "npm:15.14.0"], + ["@types/node", "npm:16.0.0"], ["@types/responselike", "npm:1.0.0"] ], "linkType": "HARD", @@ -259,7 +282,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@types-connect-npm-3.4.34-39e4f7bb55-6f712a0408.zip/node_modules/@types/connect/", "packageDependencies": [ ["@types/connect", "npm:3.4.34"], - ["@types/node", "npm:15.14.0"] + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] @@ -282,7 +305,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@types-express-serve-static-core-npm-4.17.22-e9a70ec107-e9ed12d6fd.zip/node_modules/@types/express-serve-static-core/", "packageDependencies": [ ["@types/express-serve-static-core", "npm:4.17.22"], - ["@types/node", "npm:15.14.0"], + ["@types/node", "npm:16.0.0"], ["@types/qs", "npm:6.9.6"], ["@types/range-parser", "npm:1.2.3"] ], @@ -298,6 +321,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD", }] ]], + ["@types/humanize-duration", [ + ["npm:3.25.0", { + "packageLocation": "./.yarn/cache/@types-humanize-duration-npm-3.25.0-2f39dfbb90-cd28065813.zip/node_modules/@types/humanize-duration/", + "packageDependencies": [ + ["@types/humanize-duration", "npm:3.25.0"] + ], + "linkType": "HARD", + }] + ]], ["@types/json-schema", [ ["npm:7.0.7", { "packageLocation": "./.yarn/cache/@types-json-schema-npm-7.0.7-95fb8178d7-b9d2c509fa.zip/node_modules/@types/json-schema/", @@ -312,7 +344,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@types-keyv-npm-3.1.1-779a80f2c7-3aaf557d5b.zip/node_modules/@types/keyv/", "packageDependencies": [ ["@types/keyv", "npm:3.1.1"], - ["@types/node", "npm:15.14.0"] + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] @@ -334,10 +366,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ], "linkType": "HARD", }], - ["npm:15.14.0", { - "packageLocation": "./.yarn/cache/@types-node-npm-15.14.0-b271eff214-b36835ddec.zip/node_modules/@types/node/", + ["npm:16.0.0", { + "packageLocation": "./.yarn/cache/@types-node-npm-16.0.0-99daaf613d-0302e376d5.zip/node_modules/@types/node/", "packageDependencies": [ - ["@types/node", "npm:15.14.0"] + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] @@ -365,7 +397,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@types-responselike-npm-1.0.0-85dd08af42-e6e6613c80.zip/node_modules/@types/responselike/", "packageDependencies": [ ["@types/responselike", "npm:1.0.0"], - ["@types/node", "npm:15.14.0"] + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] @@ -376,26 +408,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["@types/serve-static", "npm:1.13.9"], ["@types/mime", "npm:1.3.2"], - ["@types/node", "npm:15.14.0"] + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] ]], ["@types/uuid", [ - ["npm:8.3.0", { - "packageLocation": "./.yarn/cache/@types-uuid-npm-8.3.0-60b441a3d7-620985aed8.zip/node_modules/@types/uuid/", + ["npm:8.3.1", { + "packageLocation": "./.yarn/cache/@types-uuid-npm-8.3.1-4239b14bac-5864be8303.zip/node_modules/@types/uuid/", "packageDependencies": [ - ["@types/uuid", "npm:8.3.0"] + ["@types/uuid", "npm:8.3.1"] ], "linkType": "HARD", }] ]], ["@types/ws", [ - ["npm:7.4.5", { - "packageLocation": "./.yarn/cache/@types-ws-npm-7.4.5-3f11000a5b-b467f596cc.zip/node_modules/@types/ws/", + ["npm:7.4.6", { + "packageLocation": "./.yarn/cache/@types-ws-npm-7.4.6-292d5dff7c-bf81b170ab.zip/node_modules/@types/ws/", "packageDependencies": [ - ["@types/ws", "npm:7.4.5"], - ["@types/node", "npm:15.14.0"] + ["@types/ws", "npm:7.4.6"], + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] @@ -418,7 +450,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@typescript-eslint/parser", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:4.28.1"], ["@typescript-eslint/scope-manager", "npm:4.28.1"], ["debug", "virtual:f8b688e6542ef635eefae684748f7db5410cd1803b0f43b02ae3ebd860a79349e9ae07146ce05bdfb5fca9536ad9dbe230ed7f4c2f2ffe26893f1f1b0b8700e7#npm:4.3.2"], - ["eslint", "npm:7.29.0"], + ["eslint", "npm:7.30.0"], ["functional-red-black-tree", "npm:1.0.1"], ["regexpp", "npm:3.2.0"], ["semver", "npm:7.3.5"], @@ -452,7 +484,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@typescript-eslint/scope-manager", "npm:4.28.1"], ["@typescript-eslint/types", "npm:4.28.1"], ["@typescript-eslint/typescript-estree", "virtual:fa0658a3262f0ec4c70032bfff5a258eb88f64f6e176c2c2ba25415d8f40b4600e45fe35d5759e7bb129491bde554953d2634a2029329b48b524f61629e9358b#npm:4.28.1"], - ["eslint", "npm:7.29.0"], + ["eslint", "npm:7.30.0"], ["eslint-scope", "npm:5.1.1"], ["eslint-utils", "virtual:fa0658a3262f0ec4c70032bfff5a258eb88f64f6e176c2c2ba25415d8f40b4600e45fe35d5759e7bb129491bde554953d2634a2029329b48b524f61629e9358b#npm:3.0.0"] ], @@ -480,7 +512,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@typescript-eslint/types", "npm:4.28.1"], ["@typescript-eslint/typescript-estree", "virtual:0dc5aa9f6f0f733d6c5540fb4e88f0a87a2e2803a976d019384f6d94d38591e0499786bdfa77aa81af9beb4356234f85a21e2901f1bfbc3ea45729114940d517#npm:4.28.1"], ["debug", "virtual:f8b688e6542ef635eefae684748f7db5410cd1803b0f43b02ae3ebd860a79349e9ae07146ce05bdfb5fca9536ad9dbe230ed7f4c2f2ffe26893f1f1b0b8700e7#npm:4.3.2"], - ["eslint", "npm:7.29.0"], + ["eslint", "npm:7.30.0"], ["typescript", "patch:typescript@npm%3A4.2.4#builtin<compat/typescript>::version=4.2.4&hash=ddfc1b"] ], "packagePeers": [ @@ -789,8 +821,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@discordjs/voice", "npm:0.4.0"], ["@types/common-tags", "npm:1.8.0"], ["@types/express", "npm:4.17.12"], + ["@types/humanize-duration", "npm:3.25.0"], ["@types/node", "npm:14.17.4"], - ["@types/uuid", "npm:8.3.0"], + ["@types/uuid", "npm:8.3.1"], ["@typescript-eslint/eslint-plugin", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:4.28.1"], ["@typescript-eslint/parser", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:4.28.1"], ["body-parser", "npm:1.19.0"], @@ -798,11 +831,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["common-tags", "npm:1.8.0"], ["discord-akairo", "https://github.com/NotEnoughUpdates/discord-akairo.git#commit=58e5a8610d9cb47257cb163a94e284113a39a62b"], ["discord-api-types", "npm:0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e"], - ["discord.js", "npm:13.0.0-dev.fe6cc0c.1625184228"], + ["discord.js", "npm:13.0.0-dev.7e30011.1625338909"], ["esbuild", "npm:0.12.14"], - ["eslint", "npm:7.29.0"], + ["eslint", "npm:7.30.0"], ["eslint-config-prettier", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:8.3.0"], ["got", "npm:11.8.2"], + ["humanize-duration", "npm:3.27.0"], ["moment", "npm:2.29.1"], ["pg", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:8.6.0"], ["pg-hstore", "npm:2.3.4"], @@ -1071,7 +1105,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ]], ["discord-akairo", [ ["https://github.com/NotEnoughUpdates/discord-akairo.git#commit=58e5a8610d9cb47257cb163a94e284113a39a62b", { - "packageLocation": "./.yarn/cache/discord-akairo-https-10183ac4c6-3a07eb6541.zip/node_modules/discord-akairo/", + "packageLocation": "./.yarn/unplugged/discord-akairo-https-10183ac4c6/node_modules/discord-akairo/", "packageDependencies": [ ["discord-akairo", "https://github.com/NotEnoughUpdates/discord-akairo.git#commit=58e5a8610d9cb47257cb163a94e284113a39a62b"] ], @@ -1095,15 +1129,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }] ]], ["discord.js", [ - ["npm:13.0.0-dev.fe6cc0c.1625184228", { - "packageLocation": "./.yarn/cache/discord.js-npm-13.0.0-dev.fe6cc0c.1625184228-ea99e41fe8-0b2a39e708.zip/node_modules/discord.js/", + ["npm:13.0.0-dev.7e30011.1625338909", { + "packageLocation": "./.yarn/unplugged/discord.js-npm-13.0.0-dev.7e30011.1625338909-42f62a3a15/node_modules/discord.js/", "packageDependencies": [ - ["discord.js", "npm:13.0.0-dev.fe6cc0c.1625184228"], - ["@discordjs/builders", "npm:0.1.1"], + ["discord.js", "npm:13.0.0-dev.7e30011.1625338909"], + ["@discordjs/builders", "npm:0.2.0"], ["@discordjs/collection", "npm:0.1.6"], ["@discordjs/form-data", "npm:3.0.1"], ["@sapphire/async-queue", "npm:1.1.4"], - ["@types/ws", "npm:7.4.5"], + ["@types/ws", "npm:7.4.6"], ["abort-controller", "npm:3.0.0"], ["discord-api-types", "npm:0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e"], ["node-fetch", "npm:2.6.1"], @@ -1195,12 +1229,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }] ]], ["eslint", [ - ["npm:7.29.0", { - "packageLocation": "./.yarn/cache/eslint-npm-7.29.0-aec1968387-812f8c5123.zip/node_modules/eslint/", + ["npm:7.30.0", { + "packageLocation": "./.yarn/cache/eslint-npm-7.30.0-8a8a06f9b4-028048847e.zip/node_modules/eslint/", "packageDependencies": [ - ["eslint", "npm:7.29.0"], + ["eslint", "npm:7.30.0"], ["@babel/code-frame", "npm:7.12.11"], ["@eslint/eslintrc", "npm:0.4.2"], + ["@humanwhocodes/config-array", "npm:0.5.0"], ["ajv", "npm:6.12.6"], ["chalk", "npm:4.1.1"], ["cross-spawn", "npm:7.0.3"], @@ -1255,7 +1290,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["eslint-config-prettier", "virtual:d7ae587dddcefd495158f5c047acecbca3203324d75e681c7d8657c07f901f74e152f0b39978f7428d3a91daad7b5020c47ece28de69c22fcbd49d04707bf15c#npm:8.3.0"], ["@types/eslint", null], - ["eslint", "npm:7.29.0"] + ["eslint", "npm:7.30.0"] ], "packagePeers": [ "@types/eslint", @@ -1296,7 +1331,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [ ["eslint-utils", "virtual:fa0658a3262f0ec4c70032bfff5a258eb88f64f6e176c2c2ba25415d8f40b4600e45fe35d5759e7bb129491bde554953d2634a2029329b48b524f61629e9358b#npm:3.0.0"], ["@types/eslint", null], - ["eslint", "npm:7.29.0"], + ["eslint", "npm:7.30.0"], ["eslint-visitor-keys", "npm:2.1.0"] ], "packagePeers": [ @@ -1636,6 +1671,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD", }] ]], + ["humanize-duration", [ + ["npm:3.27.0", { + "packageLocation": "./.yarn/cache/humanize-duration-npm-3.27.0-dde7ed8208-2cda40de2b.zip/node_modules/humanize-duration/", + "packageDependencies": [ + ["humanize-duration", "npm:3.27.0"] + ], + "linkType": "HARD", + }] + ]], ["iconv-lite", [ ["npm:0.4.24", { "packageLocation": "./.yarn/cache/iconv-lite-npm-0.4.24-c5c4ac6695-a9b9521066.zip/node_modules/iconv-lite/", @@ -2964,7 +3008,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/wkx-npm-0.5.0-fca5152cd8-ea38c886b8.zip/node_modules/wkx/", "packageDependencies": [ ["wkx", "npm:0.5.0"], - ["@types/node", "npm:15.14.0"] + ["@types/node", "npm:16.0.0"] ], "linkType": "HARD", }] diff --git a/package.json b/package.json index f0f63f0..0d1e9bb 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "devDependencies": { "@types/common-tags": "^1.8.0", "@types/express": "^4.17.12", + "@types/humanize-duration": "^3", "@types/node": "^14.14.22", "@types/uuid": "^8.3.0", "@typescript-eslint/eslint-plugin": "^4.14.1", @@ -41,6 +42,7 @@ "discord-api-types": "0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e", "discord.js": "dev", "got": "^11.8.2", + "humanize-duration": "^3.27.0", "moment": "^2.29.1", "pg": "^8.5.1", "pg-hstore": "^2.3.3", @@ -94,5 +96,13 @@ "quoteProps": "consistent", "singleQuote": true, "trailingComma": "none" + }, + "dependenciesMeta": { + "discord-akairo@8.2.2": { + "unplugged": true + }, + "discord.js@13.0.0-dev.7e30011.1625338909": { + "unplugged": true + } } } diff --git a/src/commands/dev/eval.ts b/src/commands/dev/eval.ts index 4896945..ebf055b 100644 --- a/src/commands/dev/eval.ts +++ b/src/commands/dev/eval.ts @@ -259,7 +259,7 @@ export default class EvalCommand extends BushCommand { } else { embed.addField('📥 Input', await this.client.util.codeblock(inputJS, 1024, 'js')); } - embed.addField('📤 Output', await this.client.util.codeblock(e?.stack, 1024, 'js')); + embed.addField('📤 Output', await this.client.util.codeblock(typeof e === 'object' ? e?.stack : e, 1024, 'js')); } if (!args.silent && !message.util.isSlash) { await message.util.reply({ embeds: [embed], ephemeral: args.silent }); diff --git a/src/commands/dev/reload.ts b/src/commands/dev/reload.ts index d932816..4a69098 100644 --- a/src/commands/dev/reload.ts +++ b/src/commands/dev/reload.ts @@ -46,7 +46,11 @@ export default class ReloadCommand extends BushCommand { return message.util.send(`🔁 Successfully reloaded! (${new Date().getTime() - s.getTime()}ms)`); } catch (e) { return message.util.send( - `An error occurred while reloading:\n${await this.client.util.codeblock(e.stack, 2048 - 34, 'js')}` + `An error occurred while reloading:\n${await this.client.util.codeblock( + typeof e === 'object' ? e?.stack : e, + 2048 - 34, + 'js' + )}` ); } } diff --git a/src/commands/dev/testDuration.ts b/src/commands/dev/testDuration.ts new file mode 100644 index 0000000..bf30840 --- /dev/null +++ b/src/commands/dev/testDuration.ts @@ -0,0 +1,54 @@ +import { stripIndents } from 'common-tags'; +import { Message } from 'discord.js'; +import { BushCommand } from '../../lib/extensions/discord-akairo/BushCommand'; +import { BushSlashMessage } from '../../lib/extensions/discord-akairo/BushSlashMessage'; + +export default class TestDurationCommand extends BushCommand { + public constructor() { + super('testduration', { + aliases: ['testduration'], + category: 'dev', + description: { + content: 'Tests duration parsing.', + usage: 'testduration [reason]', + examples: ['testduration'] + }, + args: [ + { + id: 'reason', + type: 'contentWithDuration', + match: 'rest', + prompt: { + start: 'Enter text and a duration here.', + retry: '{error} Error parsing duration and text.', + optional: true + } + } + ], + slash: true, + slashOptions: [ + { + type: 'STRING', + name: 'reason', + description: 'Enter text and a duration here.', + required: false + } + ], + hidden: true, + ownerOnly: true + }); + } + + async exec( + message: Message | BushSlashMessage, + { reason }: { reason?: { duration: number; contentWithoutTime: string } } + ): Promise<unknown> { + const rawDuration = reason.duration; + const text = reason.contentWithoutTime; + const humanizedDuration = this.client.util.humanizeDuration(rawDuration); + return await message.util.reply(stripIndents` + **rawDuration:** ${rawDuration} + **text:** ${text} + **humanizedDuration:** ${humanizedDuration}`); + } +} diff --git a/src/commands/moderation/kick.ts b/src/commands/moderation/kick.ts index df538bc..f88819b 100644 --- a/src/commands/moderation/kick.ts +++ b/src/commands/moderation/kick.ts @@ -76,7 +76,7 @@ export default class KickCommand extends BushCommand { // }); // await modlogEnry.save(); // } catch (e) { - // this.client.console.error(`KickCommand`, `Error saving to database. ${e?.stack}`); + // this.client.console.error(`KickCommand`, `Error saving to database. ${typeof e === 'object' ? e?.stack : e}`); // yield `${this.client.util.emojis.error} Error saving to database. Please report this to a developer.`; // return; // } diff --git a/src/commands/moderation/mute.ts b/src/commands/moderation/mute.ts index ffad432..8ac77a7 100644 --- a/src/commands/moderation/mute.ts +++ b/src/commands/moderation/mute.ts @@ -53,136 +53,83 @@ export default class MuteCommand extends BushCommand { slash: true }); } - // async *genResponses( - // message: Message | CommandInteraction, - // user: User, - // reason?: string, - // time?: number - // ): AsyncIterable<string> { - // const duration = moment.duration(time); - // let modlogEnry: ModLog; - // let muteEntry: Mute; - // // Create guild entry so postgres doesn't get mad when I try and add a modlog entry - // await Guild.findOrCreate({ - // where: { - // id: message.guild.id - // }, - // defaults: { - // id: message.guild.id - // } - // }); - // try { - // const muteRole = (await Guild.findByPk(message.guild.id)).get('muteRole'); - // try { - // if (time) { - // modlogEnry = ModLog.build({ - // user: user.id, - // guild: message.guild.id, - // reason, - // type: ModLogType.TEMP_MUTE, - // duration: duration.asMilliseconds(), - // moderator: message instanceof CommandInteraction ? message.user.id : message.author.id - // }); - // muteEntry = Mute.build({ - // user: user.id, - // guild: message.guild.id, - // reason, - // expires: new Date(new Date().getTime() + duration.asMilliseconds()), - // modlog: modlogEnry.id - // }); - // } else { - // modlogEnry = ModLog.build({ - // user: user.id, - // guild: message.guild.id, - // reason, - // type: ModLogType.MUTE, - // moderator: message instanceof CommandInteraction ? message.user.id : message.author.id - // }); - // muteEntry = Mute.build({ - // user: user.id, - // guild: message.guild.id, - // reason, - // modlog: modlogEnry.id - // }); - // } - // await modlogEnry.save(); - // await muteEntry.save(); - // } catch (e) { - // this.client.console.error(`MuteCommand`, `Error saving to database. ${e?.stack}`); - // yield `${this.client.util.emojis.error} Error saving to database. Please report this to a developer.`; - // return; - // } - // try { - // await user.send( - // `You were muted in ${message.guild.name} ${time ? `for ${duration.humanize()}` : 'permanently'} with reason \`${ - // reason || 'No reason given' - // }\`` - // ); - // } catch (e) { - // yield `${this.client.util.emojis.warn} Unable to dm user`; - // } - // await ( - // await message.guild.members.fetch(user) - // ).roles.add( - // muteRole, - // `Muted by ${message instanceof CommandInteraction ? message.user.tag : message.author.tag} with ${ - // reason ? `reason ${reason}` : 'no reason' - // }` - // ); - // yield `${this.client.util.emojis.success} muted <@!${user.id}> ${ - // time ? `for ${duration.humanize()}` : 'permanently' - // } with reason \`${reason || 'No reason given'}\``; - // } catch { - // yield `${this.client.util.emojis.error} Error muting :/`; - // await muteEntry.destroy(); - // await modlogEnry.destroy(); - // return; - // } - // } async exec( message: BushMessage, { user, reason }: { user: BushUser; reason?: { duration: number; contentWithoutTime: string } } ): Promise<unknown> { - return message.util.reply(`${this.client.util.emojis.error} This command is not finished.`); - // this.client.console.debug(reason); - - // if (typeof time === 'string') { - // time = (await Argument.cast('duration', this.client.commandHandler.resolver, message, time)) as number; - // } - // for await (const response of this.genResponses(message, user, reason.join(' '), time)) { - // await message.util.sendNew(response); - // } - + const error = this.client.util.emojis.error; const member = message.guild.members.cache.get(user.id) as BushGuildMember; - if (!this.client.util.moderatorCanModerateUser(message.member, member)) { - return message.util.reply({ - content: `${this.client.util.emojis.error} You cannot mute **${member.user.tag}**.` - }); + const canModerateResponse = this.client.util.moderationPermissionCheck(message.member, member); + const victimBoldTag = `**${member.user.tag}**`; + switch (canModerateResponse) { + case 'moderator': + return message.util.reply(`${error} You cannot mute ${victimBoldTag} because they are a moderator.`); + case 'user hierarchy': + return message.util.reply( + `${error} You cannot mute ${victimBoldTag} because they have higher or equal role hierarchy as you do.` + ); + case 'client hierarchy': + return message.util.reply( + `${error} You cannot mute ${victimBoldTag} because they have higher or equal role hierarchy as I do.` + ); + case 'self': + return message.util.reply(`${error} You cannot mute yourself.`); } - const time = - typeof reason === 'string' - ? //@ts-ignore: you are unreachable bitch - await Argument.cast('duration', this.client.commandHandler.resolver, message, reason) - : reason.duration; + let time; + if (reason) { + time = + typeof reason === 'string' + ? await Argument.cast('duration', this.client.commandHandler.resolver, message, reason) + : reason.duration; + } const parsedReason = reason.contentWithoutTime; const response = await member.mute({ reason: parsedReason, moderator: message.author, - duration: time, - createModLogEntry: true + duration: time }); switch (response) { - case 'success': - return message.util.reply(`${this.client.util.emojis.success} Successfully muted **${member.user.tag}**.`); + case 'missing permissions': + return message.util.reply( + `${error} Could not mute ${victimBoldTag} because I am missing the \`Manage Roles\` permission.` + ); case 'no mute role': return message.util.reply( - `${this.client.util.emojis.error} Could not mute **${ - member.user.tag - }**, you must set a mute role with ${message.guild.getSetting('prefix')}.` + `${error} Could not mute ${victimBoldTag}, you must set a mute role with \`${message.guild.getSetting( + 'prefix' + )}muterole\`.` ); + case 'invalid mute role': + return message.util.reply( + `${error} Could not mute ${victimBoldTag} because the current mute role no longer exists. Please set a new mute role with \`${message.guild.getSetting( + 'prefix' + )}muterole\`.` + ); + case 'mute role not manageable': + return message.util.reply( + `${error} Could not mute ${victimBoldTag} because I cannot assign the current mute role, either change the role's position or set a new mute role with \`${message.guild.getSetting( + 'prefix' + )}muterole\`.` + ); + case 'error giving mute role': + return message.util.reply(`${error} Could not mute ${victimBoldTag}, there was an error assigning them the mute role.`); + case 'error creating modlog entry': + return message.util.reply( + `${error} While muting ${victimBoldTag}, there was an error creating a modlog entry, please report this to my developers.` + ); + case 'error creating mute entry': + return message.util.reply( + `${error} While muting ${victimBoldTag}, there was an error creating a mute entry, please report this to my developers.` + ); + case 'failed to dm': + return message.util.reply( + `${this.client.util.emojis.warn} Muted **${member.user.tag}** however I could not send them a dm.` + ); + case 'success': + return message.util.reply(`${this.client.util.emojis.success} Successfully muted **${member.user.tag}**.`); } } } diff --git a/src/lib/extensions/discord-akairo/BushClient.ts b/src/lib/extensions/discord-akairo/BushClient.ts index 6911573..ed5c90a 100644 --- a/src/lib/extensions/discord-akairo/BushClient.ts +++ b/src/lib/extensions/discord-akairo/BushClient.ts @@ -216,7 +216,11 @@ export class BushClient extends AkairoClient { loaders[loader].loadAll(); await this.logger.success('Startup', `Successfully loaded <<${loader}>>.`, false); } catch (e) { - await this.logger.error('Startup', `Unable to load loader <<${loader}>> with error:\n${e?.stack}`, false); + await this.logger.error( + 'Startup', + `Unable to load loader <<${loader}>> with error:\n${typeof e === 'object' ? e?.stack : e}`, + false + ); } } await this.dbPreInit(); @@ -237,8 +241,12 @@ export class BushClient extends AkairoClient { Models.StickyRole.initModel(this.db); await this.db.sync({ alter: true }); // Sync all tables to fix everything if updated await this.console.success('Startup', `Successfully connected to <<database>>.`, false); - } catch (error) { - await this.console.error('Startup', `Failed to connect to <<database>> with error:\n` + error?.stack, false); + } catch (e) { + await this.console.error( + 'Startup', + `Failed to connect to <<database>> with error:\n` + typeof e === 'object' ? e?.stack : e, + false + ); } } diff --git a/src/lib/extensions/discord-akairo/BushClientUtil.ts b/src/lib/extensions/discord-akairo/BushClientUtil.ts index 9289598..5a22efc 100644 --- a/src/lib/extensions/discord-akairo/BushClientUtil.ts +++ b/src/lib/extensions/discord-akairo/BushClientUtil.ts @@ -24,8 +24,9 @@ import { WebhookEditMessageOptions } from 'discord.js'; import got from 'got'; +import humanizeDuration from 'humanize-duration'; import { promisify } from 'util'; -import { Global, Guild, ModLog, ModLogType } from '../../models'; +import { Ban, Global, Guild, ModLog, ModLogType, Mute, PunishmentRole } from '../../models'; import { BushCache } from '../../utils/BushCache' |
