aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-07-04 15:25:32 -0400
committerIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-07-04 15:25:32 -0400
commitcf564dbb6435886f97e2e9870363144386af368d (patch)
treed535cd73f24a145ca9d7ce1a0e1174cba0d38b31
parent34f0d1d3ff3e2a90193c9a4d4de29d8335160d6a (diff)
downloadtanzanite-cf564dbb6435886f97e2e9870363144386af368d.tar.gz
tanzanite-cf564dbb6435886f97e2e9870363144386af368d.tar.bz2
tanzanite-cf564dbb6435886f97e2e9870363144386af368d.zip
mute command
-rwxr-xr-x.pnp.js128
-rw-r--r--package.json10
-rw-r--r--src/commands/dev/eval.ts2
-rw-r--r--src/commands/dev/reload.ts6
-rw-r--r--src/commands/dev/testDuration.ts54
-rw-r--r--src/commands/moderation/kick.ts2
-rw-r--r--src/commands/moderation/mute.ts171
-rw-r--r--src/lib/extensions/discord-akairo/BushClient.ts14
-rw-r--r--src/lib/extensions/discord-akairo/BushClientUtil.ts106
-rw-r--r--src/lib/extensions/discord.js/BushGuildMember.ts62
-rw-r--r--src/lib/models/Ban.ts10
-rw-r--r--src/lib/models/Guild.ts8
-rw-r--r--src/lib/models/ModLog.ts11
-rw-r--r--src/lib/models/Mute.ts10
-rw-r--r--src/lib/models/PunishmentRole.ts10
-rw-r--r--src/lib/utils/BushConstants.ts24
-rw-r--r--src/listeners/commands/commandError.ts17
-rw-r--r--src/listeners/commands/commandMissingPermissions.ts12
-rw-r--r--src/listeners/commands/slashCommandError.ts17
-rw-r--r--yarn.lock80
20 files changed, 494 insertions, 260 deletions
diff --git a/.pnp.js b/.pnp.js
index ece27cb..8bb060f 100755
--- a/.pnp.js
+++ b/.pnp.js
@@ -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'