From acf165a119900069d16f736ad50a322017e69372 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 10 Nov 2021 21:18:49 -0600 Subject: [PATCH 01/53] Add Button Emoji --- Events/ready.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Events/ready.js b/Events/ready.js index 24bfa7f..40eb74c 100644 --- a/Events/ready.js +++ b/Events/ready.js @@ -104,7 +104,8 @@ module.exports = new Event("ready", (client) => { let button = new Discord.MessageButton() .setLabel(panelconfig.ButtonLabel) .setCustomId("openticket") - .setStyle(panelconfig.ButtonColour); + .setStyle(panelconfig.ButtonColour) + .setEmoji(panelconfig.ButtonEmoji); let row = new Discord.MessageActionRow().addComponents(button); From 13972119a8ab1686a0aa72ad156b5de146bf3ed9 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 10 Nov 2021 21:21:05 -0600 Subject: [PATCH 02/53] Update package-lock.json --- package-lock.json | 199 ++++++++++++++++++++++++++-------------------- 1 file changed, 114 insertions(+), 85 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96e00a2..5effeb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,35 +14,28 @@ } }, "node_modules/@discordjs/builders": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.6.0.tgz", - "integrity": "sha512-mH3Gx61LKk2CD05laCI9K5wp+a3NyASHDUGx83DGJFkqJlRlSV5WMJNY6RS37A5SjqDtGMF4wVR9jzFaqShe6Q==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.8.2.tgz", + "integrity": "sha512-/YRd11SrcluqXkKppq/FAVzLIPRVlIVmc6X8ZklspzMIHDtJ+A4W37D43SHvLdH//+NnK+SHW/WeOF4Ts54PeQ==", "dependencies": { - "@sindresorhus/is": "^4.0.1", - "discord-api-types": "^0.22.0", + "@sindresorhus/is": "^4.2.0", + "discord-api-types": "^0.24.0", "ow": "^0.27.0", "ts-mixer": "^6.0.0", "tslib": "^2.3.1" }, "engines": { - "node": ">=14.0.0", + "node": ">=16.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==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.3.2.tgz", + "integrity": "sha512-dMjLl60b2DMqObbH1MQZKePgWhsNe49XkKBZ0W5Acl5uVV43SN414i2QfZwRI7dXAqIn8pEWD2+XXQFn9KWxqg==", "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/@discordjs/form-data": { @@ -59,9 +52,9 @@ } }, "node_modules/@sapphire/async-queue": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.7.tgz", - "integrity": "sha512-EBRERa9NqK/EV6DIPBVtjjdHBsu/DSdMuYAydmoIyIPONzp0UAxf2G6JGJ52WkiONtPRx6KNuqB5Q8dm14fwyw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", + "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -79,9 +72,18 @@ } }, "node_modules/@types/node": { - "version": "16.11.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.4.tgz", - "integrity": "sha512-TMgXmy0v2xWyuCSCJM6NCna2snndD8yvQF67J29ipdzMcsPa9u+o0tjF5+EQNdhcuZplYuouYqpc4zcd5I6amQ==" + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + }, + "node_modules/@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } }, "node_modules/@types/ws": { "version": "8.2.0", @@ -129,24 +131,25 @@ } }, "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==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", + "integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==", "engines": { "node": ">=12" } }, "node_modules/discord.js": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.2.0.tgz", - "integrity": "sha512-nyxUvL8wuQG38zx13wUMkpcA8koFszyiXdkSLwwM9opKW2LC2H5gD0cTZxImeJ6GtEnKPWT8xBiE8lLBmbNIhw==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.3.1.tgz", + "integrity": "sha512-zn4G8tL5+tMV00+0aSsVYNYcIfMSdT2g0nudKny+Ikd+XKv7m6bqI7n3Vji0GIRqXDr5ArPaw+iYFM2I1Iw3vg==", "dependencies": { - "@discordjs/builders": "^0.6.0", - "@discordjs/collection": "^0.2.1", + "@discordjs/builders": "^0.8.1", + "@discordjs/collection": "^0.3.2", "@discordjs/form-data": "^3.0.1", - "@sapphire/async-queue": "^1.1.5", + "@sapphire/async-queue": "^1.1.8", + "@types/node-fetch": "^2.5.12", "@types/ws": "^8.2.0", - "discord-api-types": "^0.23.1", + "discord-api-types": "^0.24.0", "node-fetch": "^2.6.1", "ws": "^8.2.3" }, @@ -169,6 +172,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "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", @@ -194,28 +210,28 @@ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "node_modules/mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dependencies": { - "mime-db": "1.50.0" + "mime-db": "1.51.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -313,28 +329,21 @@ }, "dependencies": { "@discordjs/builders": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.6.0.tgz", - "integrity": "sha512-mH3Gx61LKk2CD05laCI9K5wp+a3NyASHDUGx83DGJFkqJlRlSV5WMJNY6RS37A5SjqDtGMF4wVR9jzFaqShe6Q==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.8.2.tgz", + "integrity": "sha512-/YRd11SrcluqXkKppq/FAVzLIPRVlIVmc6X8ZklspzMIHDtJ+A4W37D43SHvLdH//+NnK+SHW/WeOF4Ts54PeQ==", "requires": { - "@sindresorhus/is": "^4.0.1", - "discord-api-types": "^0.22.0", + "@sindresorhus/is": "^4.2.0", + "discord-api-types": "^0.24.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==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.3.2.tgz", + "integrity": "sha512-dMjLl60b2DMqObbH1MQZKePgWhsNe49XkKBZ0W5Acl5uVV43SN414i2QfZwRI7dXAqIn8pEWD2+XXQFn9KWxqg==" }, "@discordjs/form-data": { "version": "3.0.1", @@ -347,9 +356,9 @@ } }, "@sapphire/async-queue": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.7.tgz", - "integrity": "sha512-EBRERa9NqK/EV6DIPBVtjjdHBsu/DSdMuYAydmoIyIPONzp0UAxf2G6JGJ52WkiONtPRx6KNuqB5Q8dm14fwyw==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", + "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==" }, "@sindresorhus/is": { "version": "4.2.0", @@ -357,9 +366,18 @@ "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" }, "@types/node": { - "version": "16.11.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.4.tgz", - "integrity": "sha512-TMgXmy0v2xWyuCSCJM6NCna2snndD8yvQF67J29ipdzMcsPa9u+o0tjF5+EQNdhcuZplYuouYqpc4zcd5I6amQ==" + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + }, + "@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } }, "@types/ws": { "version": "8.2.0", @@ -398,21 +416,22 @@ "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==" + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", + "integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==" }, "discord.js": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.2.0.tgz", - "integrity": "sha512-nyxUvL8wuQG38zx13wUMkpcA8koFszyiXdkSLwwM9opKW2LC2H5gD0cTZxImeJ6GtEnKPWT8xBiE8lLBmbNIhw==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.3.1.tgz", + "integrity": "sha512-zn4G8tL5+tMV00+0aSsVYNYcIfMSdT2g0nudKny+Ikd+XKv7m6bqI7n3Vji0GIRqXDr5ArPaw+iYFM2I1Iw3vg==", "requires": { - "@discordjs/builders": "^0.6.0", - "@discordjs/collection": "^0.2.1", + "@discordjs/builders": "^0.8.1", + "@discordjs/collection": "^0.3.2", "@discordjs/form-data": "^3.0.1", - "@sapphire/async-queue": "^1.1.5", + "@sapphire/async-queue": "^1.1.8", + "@types/node-fetch": "^2.5.12", "@types/ws": "^8.2.0", - "discord-api-types": "^0.23.1", + "discord-api-types": "^0.24.0", "node-fetch": "^2.6.1", "ws": "^8.2.3" } @@ -425,6 +444,16 @@ "is-obj": "^2.0.0" } }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "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", @@ -444,22 +473,22 @@ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "1.50.0" + "mime-db": "1.51.0" } }, "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", "requires": { "whatwg-url": "^5.0.0" } From 8e0326c8f811bb4f704c9db8dc42930301ccfd0c Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 10 Nov 2021 21:21:50 -0600 Subject: [PATCH 03/53] Removed HelpMenu --- Configs/supportbot.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Configs/supportbot.yml b/Configs/supportbot.yml index 55b4355..963640a 100644 --- a/Configs/supportbot.yml +++ b/Configs/supportbot.yml @@ -18,7 +18,6 @@ SupportBot_Version: "7.3" Name: "SupportBot" # No Prefix, as everything uses the new Slash (/) Commands feature! -Token: "BOT_TOKEN" # ------------------------- # Activity Configuration From c9cf7c942ba42dd43769a22168ec6d977f4c5c3e Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 10 Nov 2021 21:22:08 -0600 Subject: [PATCH 04/53] Prettier --- Commands/help.js | 92 +++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/Commands/help.js b/Commands/help.js index bc02091..f6fc373 100644 --- a/Commands/help.js +++ b/Commands/help.js @@ -40,67 +40,65 @@ module.exports = new Command({ (adminRole) => adminRole.id === supportbot.Admin ); - if (supportbot.HelpMenu) { - let botCommands = ""; - botCommands += `**/${cmdconfig.HelpCommand}** ${cmdconfig.HelpCommandDesc}\n`; - botCommands += `**/${cmdconfig.InfoCommand}** ${cmdconfig.InfoCommandDesc}\n`; - botCommands += `**/${cmdconfig.PingCommand}** ${cmdconfig.PingCommandDesc}\n`; + let botCommands = ""; + botCommands += `**/${cmdconfig.HelpCommand}** ${cmdconfig.HelpCommandDesc}\n`; + botCommands += `**/${cmdconfig.InfoCommand}** ${cmdconfig.InfoCommandDesc}\n`; + botCommands += `**/${cmdconfig.PingCommand}** ${cmdconfig.PingCommandDesc}\n`; - let ticketCommands = ""; - ticketCommands += `**/${cmdconfig.OpenTicket}** ${cmdconfig.OpenTicketDesc}\n`; - ticketCommands += `**/${cmdconfig.CloseTicket}** ${cmdconfig.CloseTicketDesc}\n`; + let ticketCommands = ""; + ticketCommands += `**/${cmdconfig.OpenTicket}** ${cmdconfig.OpenTicketDesc}\n`; + ticketCommands += `**/${cmdconfig.CloseTicket}** ${cmdconfig.CloseTicketDesc}\n`; - let staffCommands = ""; - staffCommands += `**/${cmdconfig.TicketAdd}** ${cmdconfig.TicketAddDesc}\n`; - staffCommands += `**/${cmdconfig.TicketRemove}** ${cmdconfig.TicketRemoveDesc}\n`; + let staffCommands = ""; + staffCommands += `**/${cmdconfig.TicketAdd}** ${cmdconfig.TicketAddDesc}\n`; + staffCommands += `**/${cmdconfig.TicketRemove}** ${cmdconfig.TicketRemoveDesc}\n`; - const HelpEmbed1 = new Discord.MessageEmbed() - .setTitle(supportbot.Name + " Commands") - .setThumbnail(interaction.user.displayAvatarURL()) + const HelpEmbed1 = new Discord.MessageEmbed() + .setTitle(supportbot.Name + " Commands") + .setThumbnail(interaction.user.displayAvatarURL()) - .addFields( - { - name: "🖥️ General Commands\n", - value: `${botCommands}\n`, - inline: false, - }, - { - name: "🎫 Support Commands\n", - value: `${ticketCommands}\n`, - inline: false, - } - ) + .addFields( + { + name: "🖥️ General Commands\n", + value: `${botCommands}\n`, + inline: false, + }, + { + name: "🎫 Support Commands\n", + value: `${ticketCommands}\n`, + inline: false, + } + ) - .setColor(supportbot.EmbedColour) - .setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()); + .setColor(supportbot.EmbedColour) + .setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()); - if (interaction.member.roles.cache.has(SupportStaff.id)) { + if (interaction.member.roles.cache.has(SupportStaff.id)) { + HelpEmbed1.addFields({ + name: "🔐 Staff Commands\n", + value: `${staffCommands}\n`, + inline: false, + }); + } else { + if (interaction.member.roles.cache.has(AdminStaff.id)) { HelpEmbed1.addFields({ name: "🔐 Staff Commands\n", value: `${staffCommands}\n`, inline: false, }); - } else { - if (interaction.member.roles.cache.has(AdminStaff.id)) { - HelpEmbed1.addFields({ - name: "🔐 Staff Commands\n", - value: `${staffCommands}\n`, - inline: false, - }); - } } + } - if (supportbot.SendHelpPage === "dm") { - interaction.user.reply({ - embeds: [HelpEmbed1], - }); - } + if (supportbot.SendHelpPage === "dm") { + interaction.user.reply({ + embeds: [HelpEmbed1], + }); + } - if (supportbot.SendHelpPage === "channel") { - interaction.reply({ - embeds: [HelpEmbed1], - }); - } + if (supportbot.SendHelpPage === "channel") { + interaction.reply({ + embeds: [HelpEmbed1], + }); } }, }); From 12a7680275d1cd6f9553d7d1bb3c4295a51c4151 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 10 Nov 2021 21:23:07 -0600 Subject: [PATCH 05/53] Fix spelling --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01cd9e6..8e9e13e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## What is SupportBot? -SupportBot is an open-sourced support system for discord. It's completely free to use with high amounts of customisation to match your own brand. +SupportBot is an open-sourced support system for discord. It's completely free to use with high amounts of customization to match your own brand. ## Quick Links From b674872c56bff4ce3a246315d35463993d0d3e10 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 10 Nov 2021 21:41:12 -0600 Subject: [PATCH 06/53] Fixed Archive Bug --- Events/interactionCreate.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Events/interactionCreate.js b/Events/interactionCreate.js index d7e67a1..801e3e3 100644 --- a/Events/interactionCreate.js +++ b/Events/interactionCreate.js @@ -12,7 +12,7 @@ const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8")); const Event = require("../Structures/Event.js"); -module.exports = new Event("interactionCreate", (client, interaction) => { +module.exports = new Event("interactionCreate", async (client, interaction) => { if (interaction.isCommand()) { const command = client.commands.find( (cmd) => cmd.name.toLowerCase() == interaction.commandName @@ -129,7 +129,6 @@ module.exports = new Event("interactionCreate", (client, interaction) => { if (interaction.customId === "ticketlock") { if (interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) { interaction.message.fetch(); - interaction.deferUpdate(); let Admin = interaction.guild.roles.cache.find( (AdminUser) => AdminUser.name === supportbot.Admin @@ -137,6 +136,12 @@ module.exports = new Event("interactionCreate", (client, interaction) => { interaction.guild.roles.cache.find( (AdminUser) => AdminUser.id === supportbot.Admin ); + if (!interaction.member.roles.cache.has(Admin.id)) { + return await interaction.reply({ + content: "You don't have permission to do that.", + ephemeral: true, + }); + } let all = interaction.channel.permissionOverwrites.cache; let parent = @@ -175,7 +180,7 @@ module.exports = new Event("interactionCreate", (client, interaction) => { .setDescription(`Archived ${interaction.channel.name}`) .setColor(`${supportbot.SuccessColour}`); - interaction.channel.send({ embeds: [ArchiveEmbed] }); + interaction.reply({ embeds: [ArchiveEmbed] }); interaction.message.edit({ components: [row] }); } } From 300c83512c0dea63b21ec56301975c5ebbd4bc42 Mon Sep 17 00:00:00 2001 From: Noah Date: Thu, 11 Nov 2021 17:18:30 -0600 Subject: [PATCH 07/53] Fixed token, and changed version for future --- Configs/supportbot.yml | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Configs/supportbot.yml b/Configs/supportbot.yml index 963640a..b128c03 100644 --- a/Configs/supportbot.yml +++ b/Configs/supportbot.yml @@ -10,7 +10,7 @@ # Discord Support: https://emeraldsrv.dev/discord # Community Resources: https://emeraldsrv.dev/resources -SupportBot_Version: "7.3" +SupportBot_Version: "7.4.0" # ------------------------- # General Configuration @@ -18,6 +18,7 @@ SupportBot_Version: "7.3" Name: "SupportBot" # No Prefix, as everything uses the new Slash (/) Commands feature! +Token: "BOT_TOKEN" # ------------------------- # Activity Configuration @@ -57,7 +58,6 @@ InfoColour: "#f74343" # Help Configuration # ------------------------- -HelpMenu: true # Do not change! SendHelpPage: "channel" # Set to channel or dm # ------------------------- diff --git a/package-lock.json b/package-lock.json index 5effeb9..9690841 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "supportbot", - "version": "7.3.0", + "version": "7.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "supportbot", - "version": "7.3.0", + "version": "7.4.0", "license": "MIT", "dependencies": { "discord.js": "^13.2.0", diff --git a/package.json b/package.json index d7e99f0..7ae153e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "supportbot", - "version": "7.3.0", + "version": "7.4.0", "description": "SupportBot is an open-sourced support system for discord. It's completely free to use with high amounts of customization to match your own brand.", "main": "index.js", "scripts": { From 007c78930e4060f029c845a306c65e3c6f55b6ce Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 17 Nov 2021 19:03:11 -0600 Subject: [PATCH 08/53] Added Guild to config --- Configs/supportbot.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Configs/supportbot.yml b/Configs/supportbot.yml index b128c03..125a608 100644 --- a/Configs/supportbot.yml +++ b/Configs/supportbot.yml @@ -19,6 +19,8 @@ SupportBot_Version: "7.4.0" Name: "SupportBot" # No Prefix, as everything uses the new Slash (/) Commands feature! Token: "BOT_TOKEN" +# Guild ID Ex: 123456789123456789 +Guild: "" # ------------------------- # Activity Configuration @@ -66,7 +68,6 @@ SendHelpPage: "channel" # Set to channel or dm AutoRole: true AutoRole_Role: "Member" -LockdownRole: "@everyone" Staff: "Staff" Admin: "Admin" @@ -131,8 +132,6 @@ RemovedUser: "👍 <@%user%> has been removed from this ticket" # SUCCESS - Green # Secondary - Grey -TicketLockReaction: "🔒" -TicketDeleteReaction: "⛔" LockTicketCategory: "Archive" TicketCloseEmoji: "❌" From a82101ab30e3a9704333b64ae8034924453c21fd Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 17 Nov 2021 19:03:35 -0600 Subject: [PATCH 09/53] Register commands in Guild --- Structures/Client.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Structures/Client.js b/Structures/Client.js index e70422d..f04bc30 100644 --- a/Structures/Client.js +++ b/Structures/Client.js @@ -76,10 +76,9 @@ class Client extends Discord.Client { this.on("ready", async () => { const allCommands = slashCommands.concat(slashCommands1); - await this.application?.commands.set(allCommands); - + await this.application?.commands.set(allCommands, supportbot.Guild); console.log(" "); - console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Slash Command ▬▬▬▬▬▬▬"), + console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Slash Commands ▬▬▬▬▬▬▬"), console.log(" "); slashCommands.forEach((cmd) => From ef838328198f22a4ac934a3da45ba73261acd0b6 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 17 Nov 2021 19:04:20 -0600 Subject: [PATCH 10/53] Added missing role and channel check --- Events/ready.js | 61 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/Events/ready.js b/Events/ready.js index 40eb74c..bbf436d 100644 --- a/Events/ready.js +++ b/Events/ready.js @@ -14,7 +14,7 @@ const panelconfig = yaml.load( const Event = require("../Structures/Event.js"); -module.exports = new Event("ready", (client) => { +module.exports = new Event("ready", async (client) => { client.user.setActivity(supportbot.BotActivity, { type: supportbot.ActivityType, url: supportbot.StreamingURL, @@ -65,7 +65,66 @@ module.exports = new Event("ready", (client) => { console.log(`\u001b[37m`, `SupportBot proudly created by Emerald Services`); console.log(` `); console.log(`\u001b[31m`, `――――――――――――――――――――――――――――――――――――――――――――`); + if ( + !supportbot.Guild || + (await client.guilds.cache.size) !== 1 || + (await client.guilds.cache.first().id) !== supportbot.Guild + ) { + console.log( + `\u001b[31m`, + `${client.user.username} is not in the correct server set in your config. Please join the server and restart the bot.` + ); + console.log(`\u001b[31m`, `${client.user.username} will now exit.`); + return process.exit(1); + } + const roles = [ + supportbot.Admin, + supportbot.Staff, + supportbot.TicketBlackListRole, + supportbot.DepartmentRole_1, + supportbot.DepartmentRole_2, + supportbot.DepartmentRole_3, + ]; + if (supportbot.AutoRole) roles.push(supportbot.AutoRole_Role); + const channels = [ + supportbot.SuggestionChannel, + supportbot.TicketLog, + supportbot.TranscriptLog, + panelconfig.Channel, + ]; + const missingR = []; + const missingC = []; + for (let c of channels) { + const find = await client.channels.cache.find( + (channel) => channel.name === c || channel.id === c + ); + if (!find) missingC.push(c); + } + for (let r of roles) { + const find = await client.guilds.cache + .first() + .roles.cache.find((role) => role.name === r || role.id === r); + if (!find) missingR.push(r); + } + + if (missingR.length > 0) { + console.log( + "\u001b[33m", + `[WARN] The following Roles could not be found! Please check your configs!\n${missingR.join( + ", " + )}` + ); + } + + if (missingC.length > 0) { + console.log( + "\u001b[33m", + `[WARN] The following Channels could not be found! Please check your configs!\n${missingC.join( + ", " + )}` + ); + } if (panelconfig.TicketPanel) { let chan1 = client.channels.cache.find( (channel) => channel.name === panelconfig.Channel From 02394e310d6009a468fa9bf1c5972f2ced907142 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 17 Nov 2021 19:04:38 -0600 Subject: [PATCH 11/53] Exit if joins or leaves guild --- Events/guildCreate.js | 9 +++++++++ Events/guildDelete.js | 10 ++++++++++ 2 files changed, 19 insertions(+) create mode 100644 Events/guildCreate.js create mode 100644 Events/guildDelete.js diff --git a/Events/guildCreate.js b/Events/guildCreate.js new file mode 100644 index 0000000..16bd038 --- /dev/null +++ b/Events/guildCreate.js @@ -0,0 +1,9 @@ +const Event = require("../Structures/Event.js"); +module.exports = new Event("guildCreate", async (client) => { + console.log( + `\u001b[31m`, + `${client.user.username} is not in the correct server set in your config. Please leave all other servers and restart the bot.` + ); + console.log(`\u001b[31m`, `${client.user.username} will now exit.`); + return process.exit(1); +}); diff --git a/Events/guildDelete.js b/Events/guildDelete.js new file mode 100644 index 0000000..d3cfbd2 --- /dev/null +++ b/Events/guildDelete.js @@ -0,0 +1,10 @@ +const Event = require("../Structures/Event.js"); + +module.exports = new Event("guildDelete", async (client) => { + console.log( + `\u001b[31m`, + `${client.user.username} is not in the correct server set in your config. Please join the server and restart the bot.` + ); + console.log(`\u001b[31m`, `${client.user.username} will now exit.`); + return process.exit(1); +}); From 7eb949f1094a93bb75c3ddfbb44dcdb7ee4ad74b Mon Sep 17 00:00:00 2001 From: Noah Date: Sun, 21 Nov 2021 18:42:18 -0600 Subject: [PATCH 12/53] Better finds --- Commands/add.js | 25 +++++++------ Commands/close.js | 24 ++++++------- Commands/embed.js | 27 +++++++------- Commands/help.js | 25 ++++++------- Commands/remove.js | 25 +++++++------ Commands/suggest.js | 12 +++---- Commands/ticket.js | 86 ++++++++++++++++++--------------------------- 7 files changed, 98 insertions(+), 126 deletions(-) diff --git a/Commands/add.js b/Commands/add.js index 5aee916..6fef2da 100644 --- a/Commands/add.js +++ b/Commands/add.js @@ -32,19 +32,18 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.name === supportbot.Staff - ) || - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.id === supportbot.Staff - ); - let Admins = - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.name === supportbot.Admin - ) || - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.id === supportbot.Admin + let SupportStaff = interaction.guild.roles.cache.find( + (SupportTeam) => + SupportTeam.name == supportbot.Staff || + SupportTeam.id == supportbot.Staff + ); + let Admins = interaction.guild.roles.cache.find( + (AdminUser) => + AdminUser.name == supportbot.Admin || AdminUser.id == supportbot.Admin + ); + if (!SupportStaff || !Admins) + return interaction.reply( + "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); const NoPerms = new Discord.MessageEmbed() diff --git a/Commands/close.js b/Commands/close.js index 2a29c8a..5b8da65 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -63,13 +63,11 @@ module.exports = new Command({ } ) .then((collected) => { - let logChannel = - interaction.guild.channels.cache.find( - (channel) => channel.name === supportbot.TranscriptLog - ) || - interaction.guild.channels.cache.find( - (channel) => channel.id === supportbot.TranscriptLog - ); + let logChannel = interaction.guild.channels.cache.find( + (channel) => + channel.name === supportbot.TranscriptLog || + channel.id === supportbot.TranscriptLog + ); let user = interaction.user; let reason = interaction.options.getString("reason") || @@ -149,13 +147,11 @@ module.exports = new Command({ } if (!supportbot.CloseConfirmation) { - let logChannel = - interaction.guild.channels.cache.find( - (channel) => channel.name === supportbot.TranscriptLog - ) || - interaction.guild.channels.cache.find( - (channel) => channel.id === supportbot.TranscriptLog - ); + let logChannel = interaction.guild.channels.cache.find( + (channel) => + channel.name === supportbot.TranscriptLog || + channel.id === supportbot.TranscriptLog + ); let user = interaction.user; let reason = (await interaction.options.getString("reason")) || diff --git a/Commands/embed.js b/Commands/embed.js index 9bff3a8..278a777 100644 --- a/Commands/embed.js +++ b/Commands/embed.js @@ -31,21 +31,20 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.name === supportbot.Staff - ) || - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.id === supportbot.Staff - ); - let Admins = - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.name === supportbot.Admin - ) || - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.id === supportbot.Admin - ); + let SupportStaff = interaction.guild.roles.cache.find( + (SupportTeam) => + SupportTeam.name === supportbot.Staff || + SupportTeam.id === supportbot.Staff + ); + let Admins = interaction.guild.roles.cache.find( + (AdminUser) => + AdminUser.name === supportbot.Admin || AdminUser.id === supportbot.Admin + ); + if (!SupportStaff || !Admins) + return interaction.reply( + "Some roles seem to be missing!\nPlease check for errors when starting the bot." + ); const NoPerms = new Discord.MessageEmbed() .setTitle("Invalid Permissions!") .setDescription( diff --git a/Commands/help.js b/Commands/help.js index f6fc373..416bb68 100644 --- a/Commands/help.js +++ b/Commands/help.js @@ -25,21 +25,18 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = - interaction.guild.roles.cache.find( - (adminRole) => adminRole.name === supportbot.Staff - ) || - interaction.guild.roles.cache.find( - (staffRole) => staffRole.id === supportbot.Staff + let SupportStaff = interaction.guild.roles.cache.find( + (adminRole) => + adminRole.name === supportbot.Staff || staffRole.id === supportbot.Staff + ); + let AdminStaff = interaction.guild.roles.cache.find( + (adminRole) => + adminRole.name === supportbot.Admin || adminRole.id === supportbot.Admin + ); + if (!SupportStaff || !Admins) + return interaction.reply( + "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); - let AdminStaff = - interaction.guild.roles.cache.find( - (adminRole) => adminRole.name === supportbot.Admin - ) || - interaction.guild.roles.cache.find( - (adminRole) => adminRole.id === supportbot.Admin - ); - let botCommands = ""; botCommands += `**/${cmdconfig.HelpCommand}** ${cmdconfig.HelpCommandDesc}\n`; botCommands += `**/${cmdconfig.InfoCommand}** ${cmdconfig.InfoCommandDesc}\n`; diff --git a/Commands/remove.js b/Commands/remove.js index d062584..c90e0a1 100644 --- a/Commands/remove.js +++ b/Commands/remove.js @@ -32,19 +32,18 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.name === supportbot.Staff - ) || - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.id === supportbot.Staff - ); - let Admins = - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.name === supportbot.Admin - ) || - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.id === supportbot.Admin + let SupportStaff = interaction.guild.roles.cache.find( + (SupportTeam) => + SupportTeam.name == supportbot.Staff || + SupportTeam.id == supportbot.Staff + ); + let Admins = interaction.guild.roles.cache.find( + (AdminUser) => + AdminUser.name == supportbot.Admin || AdminUser.id == supportbot.Admin + ); + if (!SupportStaff || !Admins) + return interaction.reply( + "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); const NoPerms = new Discord.MessageEmbed() diff --git a/Commands/suggest.js b/Commands/suggest.js index 99a99bc..f06db63 100644 --- a/Commands/suggest.js +++ b/Commands/suggest.js @@ -25,13 +25,11 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - const suggestChannel = - interaction.guild.channels.cache.find( - (channel) => channel.name === supportbot.SuggestionChannel - ) || - interaction.guild.channels.cache.find( - (channel) => channel.id === supportbot.SuggestionChannel - ); + const suggestChannel = interaction.guild.channels.cache.find( + (channel) => + channel.name === supportbot.SuggestionChannel || + channel.id === supportbot.SuggestionChannel + ); const NoChannel = new Discord.MessageEmbed() .setTitle("Missing Channel!") diff --git a/Commands/ticket.js b/Commands/ticket.js index 27329fd..4c62663 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -36,10 +36,9 @@ module.exports = new Command({ if ( reactionUser.roles.cache.find( - (role) => role.name === supportbot.TicketBlackListRole - ) || - reactionUser.roles.cache.find( - (role) => role.id === supportbot.TicketBlackListRole + (role) => + role.name == supportbot.TicketBlackListRole || + role.id == supportbot.TicketBlackListRole ) ) { return interaction @@ -70,46 +69,33 @@ module.exports = new Command({ ) { return interaction.reply({ embeds: [TicketExists] }); } - const Staff = - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.name === supportbot.Staff - ) || - interaction.guild.roles.cache.find( - (SupportTeam) => SupportTeam.id === supportbot.Staff - ); - const Admins = - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.name === supportbot.Admin - ) || - interaction.guild.roles.cache.find( - (AdminUser) => AdminUser.id === supportbot.Admin - ); - const DeptRole1 = - interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.name === `${supportbot.DepartmentRole_1}` - ) || - interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.id === `${supportbot.DepartmentRole_1}` - ); - const DeptRole2 = - interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.name === `${supportbot.DepartmentRole_2}` - ) || - interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.id === `${supportbot.DepartmentRole_2}` - ); - const DeptRole3 = - interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.name === `${supportbot.DepartmentRole_3}` - ) || - interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.id === `${supportbot.DepartmentRole_3}` + const Staff = interaction.guild.roles.cache.find( + (SupportTeam) => + SupportTeam.name === supportbot.Staff || + SupportTeam.id === supportbot.Staff + ); + const Admins = interaction.guild.roles.cache.find( + (AdminUser) => + AdminUser.name === supportbot.Admin || AdminUser.id === supportbot.Admin + ); + const DeptRole1 = interaction.guild.roles.cache.find( + (DepartmentRole) => + DepartmentRole.name === supportbot.DepartmentRole_1 || + DepartmentRole.id === supportbot.DepartmentRole_1 + ); + const DeptRole2 = interaction.guild.roles.cache.find( + (DepartmentRole) => + DepartmentRole.name === supportbot.DepartmentRole_2 || + DepartmentRole.id === supportbot.DepartmentRole_2 + ); + const DeptRole3 = interaction.guild.roles.cache.find( + (DepartmentRole) => + DepartmentRole.name === supportbot.DepartmentRole_3 || + DepartmentRole.id === supportbot.DepartmentRole_3 + ); + if (!Staff || !Admins || !DeptRole1 || !DeptRole2 || !DeptRole3) + return interaction.reply( + "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); const Author = interaction.user; const Everyone = interaction.guild.id; @@ -158,13 +144,11 @@ module.exports = new Command({ ticketChannel.permissionOverwrites.create(index, { VIEW_CHANNEL: false }); }); - let TicketCategory = - interaction.guild.channels.cache.find( - (category) => category.name === supportbot.TicketCategory - ) || - interaction.guild.channels.cache.find( - (category) => category.id === supportbot.TicketCategory - ); + let TicketCategory = interaction.guild.channels.cache.find( + (category) => + category.name === supportbot.TicketCategory || + category.id === supportbot.TicketCategory + ); if (TicketCategory) { ticketChannel.setParent(TicketCategory.id); } From e740c17837cd8d5d20d1c5951f8dac8008c225a1 Mon Sep 17 00:00:00 2001 From: Noah Date: Sun, 21 Nov 2021 18:42:24 -0600 Subject: [PATCH 13/53] Update package-lock.json --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9690841..7bc7e43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,9 +72,9 @@ } }, "node_modules/@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + "version": "16.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", + "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -366,9 +366,9 @@ "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" }, "@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" + "version": "16.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", + "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" }, "@types/node-fetch": { "version": "2.5.12", From b6a0016f5f3fb3ede85c757c60724ae1c61da7f5 Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 15:48:45 -0600 Subject: [PATCH 14/53] Changed TicketData Structure --- Commands/ticket.js | 20 +++++++++++++++++++- Data/TicketData.json | 5 ++++- Data/ticket-panel-id.json | 4 +--- Structures/TicketID.js | 36 ++++++++++++++---------------------- 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/Commands/ticket.js b/Commands/ticket.js index 4c62663..b19134d 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -51,7 +51,11 @@ module.exports = new Command({ } // Ticket ID - let ticketNumberID = TicketNumberID.pad(interaction.guild.id); + let ticketNumberID = await TicketNumberID.pad(); + + let TicketData = await JSON.parse( + fs.readFileSync("./Data/TicketData.json", "utf8") + ); // Ticket Subject const TicketSubject = @@ -105,6 +109,20 @@ module.exports = new Command({ type: "GUILD_TEXT", } ); + await TicketData.tickets.push({ + id: ticketChannel.id, + name: ticketChannel.name, + user: Author.id, + number: ticketNumberID, + reason: TicketSubject, + }); + fs.writeFileSync( + "./Data/TicketData.json", + JSON.stringify(TicketData, null, 4), + (err) => { + if (err) console.error(err); + } + ); if ( interaction.channel.name === supportbot.ReactionChannel || diff --git a/Data/TicketData.json b/Data/TicketData.json index 0967ef4..6201053 100644 --- a/Data/TicketData.json +++ b/Data/TicketData.json @@ -1 +1,4 @@ -{} +{ + "id": 10, + "tickets": [] +} diff --git a/Data/ticket-panel-id.json b/Data/ticket-panel-id.json index b2367c6..ad5728f 100644 --- a/Data/ticket-panel-id.json +++ b/Data/ticket-panel-id.json @@ -1,3 +1 @@ -{ - "TicketPanelID": "" -} +{"TicketPanelID":""} \ No newline at end of file diff --git a/Structures/TicketID.js b/Structures/TicketID.js index 11c9d9f..6725b8c 100644 --- a/Structures/TicketID.js +++ b/Structures/TicketID.js @@ -14,74 +14,66 @@ const supportbot = yaml.load( ); class TicketNumberID { - static pad(guildId) { - let n = this.get(guildId) + ""; + static async pad() { + let n = this.get() + ""; let z = "0"; let width = 4; - setTimeout(() => { - this.set(guildId, this.get(guildId) + 1); - }, 50); + await this.set(this.get() + 1); return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } - static get(guildId) { + static get() { let ticketnumberID = JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") ); - if (!ticketnumberID[guildId]) { - ticketnumberID[guildId] = { - id: 0, - }; + if (!ticketnumberID.id) { + ticketnumberID.id = 0; fs.writeFileSync( "./Data/TicketData.json", JSON.stringify(ticketnumberID, null, 4), (err) => { - if (err) console.log(err); + if (err) console.error(err); } ); return 0; } else { - return ticketnumberID[guildId].id; + return ticketnumberID.id; } } - static set(guildId, value) { + static set(value) { let ticketnumberID = JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") ); - ticketnumberID[guildId] = { - id: value, - }; + ticketnumberID.id = value; fs.writeFileSync( "./Data/TicketData.json", JSON.stringify(ticketnumberID, null, 4), (err) => { - if (err) console.log(err); + if (err) console.error(err); } ); return value; } - static reset(guildId) { + static reset() { let ticketnumberID = JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") ); - ticketnumberID[guildId] = { - id: 0, - }; + ticketnumberID.id = 0; fs.writeFileSync( "./Data/TicketData.json", JSON.stringify(ticketnumberID, null, 4), (err) => { - if (err) console.log(err); + if (err) console.error(err); } ); From edbef6a36f6e232fc0ee8829d281529c3ea394b2 Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 15:49:37 -0600 Subject: [PATCH 15/53] Fixed close command --- Commands/close.js | 277 +++++++++++++++++----------------------------- 1 file changed, 102 insertions(+), 175 deletions(-) diff --git a/Commands/close.js b/Commands/close.js index 5b8da65..12c4290 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -11,13 +11,6 @@ const supportbot = yaml.load( const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8")); const Command = require("../Structures/Command.js"); -const TicketNumberID = require("../Structures/TicketID.js"); - -async function asyncForEach(array, callback) { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index, array); - } -} module.exports = new Command({ name: cmdconfig.CloseTicket, @@ -32,6 +25,10 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { + let TicketData = await JSON.parse( + fs.readFileSync("./Data/TicketData.json", "utf8") + ).tickets.find((t) => t.id === interaction.channel.id); + let tUser = interaction.client.users.cache.get(TicketData.user); if (!interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) { const Exists = new Discord.MessageEmbed() .setTitle("No Ticket Found!") @@ -39,7 +36,21 @@ module.exports = new Command({ .setColor(supportbot.WarningColour); return interaction.reply({ embed: Exists }); } + let transcriptChannel = await interaction.guild.channels.cache.find( + (channel) => + channel.name == supportbot.TranscriptLog || + channel.id == supportbot.TranscriptLog + ); + let logChannel = await interaction.guild.channels.cache.find( + (channel) => + channel.name == supportbot.TicketLog || + channel.id == supportbot.TicketLog + ); + let reason = + (await interaction.options.getString("reason")) || "No Reason Provided."; + if (!transcriptChannel || !logChannel) + return interaction.reply("Some Channels seem to be missing!"); if (supportbot.CloseConfirmation) { const CloseTicketRequest = new Discord.MessageEmbed() .setTitle(`**${supportbot.ClosingTicket}**`) @@ -48,180 +59,96 @@ module.exports = new Command({ ) .setColor(supportbot.EmbedColour); - interaction - .reply(CloseTicketRequest) - .then((m) => { - interaction.channel - .awaitMessages( - (response) => - response.content.toLowerCase() === - supportbot.ClosingConfirmation_Word, - { - max: 1, - time: 20000, - errors: ["time"], - } - ) - .then((collected) => { - let logChannel = interaction.guild.channels.cache.find( - (channel) => - channel.name === supportbot.TranscriptLog || - channel.id === supportbot.TranscriptLog - ); - let user = interaction.user; - let reason = - interaction.options.getString("reason") || - "No Reason Provided."; - - let name = interaction.channel.name; - let ticketChannel = interaction.channel; - - interaction - .reply(`**${supportbot.ClosingTicket}**`) - - .then(() => { - const logEmbed = new Discord.MessageEmbed() - .setTitle(supportbot.TranscriptTitle) - .setColor(supportbot.EmbedColour) - .setFooter(supportbot.EmbedFooter) - .addField("Closed By", interaction.user.tag) - .addField("Reason", reason); - - interaction.channel.interactions - .fetch({ limit: 100 }) - .then((msgs) => { - let html = ""; - - msgs = msgs.sort( - (a, b) => a.createdTimestamp - b.createdTimestamp - ); - html += ``; - html += `Server Name: ${interaction.guild.name}
`; - html += `Ticket: ${ticketChannel.name}
`; - html += `Message: ${msgs.size} Messages


`; - - msgs.forEach((msg) => { - if (msg.content) { - html += `User: ${msg.author.tag}
`; - html += `Message: ${msg.content}
`; - html += `-----

`; - } - }); - - logChannel.send({ embeds: [logEmbed] }).catch((err) => { - interaction.reply(err); - }); - - let file = new Discord.MessageAttachment( - Buffer.from(html), - `${name}.html` - ); - logChannel - .send({ embeds: [logEmbed], files: [file] }) - .catch((err) => { - interaction.reply(err); - }); - - interaction.channel.delete().catch((error) => { - if ( - error.code !== - Discord.Constants.APIErrors.UNKNOWN_CHANNEL - ) { - console.error( - "Failed to delete the interaction:", - error - ); - } - }); - }); - }); - }); - }) - .catch(() => { - interaction - .followUp({ - content: "The request to close the ticket has timed out.", - }) - .then((m2) => setTimeout(() => interaction.channel.delete(3000))); - }); - } - - if (!supportbot.CloseConfirmation) { - let logChannel = interaction.guild.channels.cache.find( - (channel) => - channel.name === supportbot.TranscriptLog || - channel.id === supportbot.TranscriptLog + await interaction.reply(CloseTicketRequest); + await interaction.channel.awaitMessages( + (r) => + r.content.toLowerCase() === supportbot.ClosingConfirmation_Word && + r.author.id === interaction.author.id, + { + max: 1, + time: 20000, + errors: ["time"], + } ); - let user = interaction.user; - let reason = - (await interaction.options.getString("reason")) || - "No Reason Provided."; + } + try { + await interaction.reply(`**${supportbot.ClosingTicket}**`); + const transcriptEmbed = new Discord.MessageEmbed() + .setTitle(supportbot.TranscriptTitle) + .setColor(supportbot.EmbedColour) + .setFooter(supportbot.EmbedFooter) + .addField( + "Ticket", + `${interaction.channel.name} (${interaction.channel.id})` + ) + .addField( + "User", + `${tUser.username}#${tUser.discriminator} (${tUser.id})` + ) + .addField("Closed By", interaction.user.tag) + .addField("Reason", reason); + const logEmbed = new Discord.MessageEmbed() + .setTitle(supportbot.TicketLog_Title) + .setColor(supportbot.EmbedColour) + .setFooter(supportbot.EmbedFooter) + .addField( + "Ticket", + `${interaction.channel.name} (${interaction.channel.id})` + ) + .addField( + "User", + `${tUser.username}#${tUser.discriminator} (${tUser.id})` + ) + .addField("Closed By", interaction.user.tag) + .addField("Reason", reason); + let msgs = await interaction.channel.messages.fetch(); + let html = ""; - let name = interaction.channel.name; - let ticketChannel = interaction.channel; + msgs = msgs.sort((a, b) => a.createdTimestamp - b.createdTimestamp); + html += ``; + html += `Server Name: ${interaction.guild.name}
`; + html += `Ticket: ${interaction.channel.name}
`; + html += `Message: ${msgs.size} Messages


`; - interaction - .reply(`**${supportbot.ClosingTicket}**`) + await msgs.forEach((msg) => { + if (msg.content) { + html += `User: ${msg.author.tag}
`; + html += `Message: ${msg.content}
`; + html += `-----

`; + } + }); - .then(() => { - const logEmbed = new Discord.MessageEmbed() - .setTitle(supportbot.TranscriptTitle) - .setColor(supportbot.EmbedColour) - .setFooter(supportbot.EmbedFooter) - .addField("Closed By", interaction.user.tag) - .addField("Reason", reason); + await logChannel.send({ embeds: [logEmbed] }).catch((err) => { + console.error(err); + }); - interaction.channel.interactions - .fetch({ limit: 100 }) - .then((msgs) => { - let html = ""; - - msgs = msgs.sort( - (a, b) => a.createdTimestamp - b.createdTimestamp - ); - html += ``; - html += `Server Name: ${interaction.guild.name}
`; - html += `Ticket: ${ticketChannel.name}
`; - html += `Message: ${msgs.size} Messages


`; - - msgs.forEach((msg) => { - if (msg.content) { - html += `User: ${msg.author.tag}
`; - html += `Message: ${msg.content}
`; - html += `-----

`; - } - }); - - logChannel.send({ embeds: [logEmbed] }).catch((err) => { - interaction.reply(err); - }); - - let file = new Discord.MessageAttachment( - Buffer.from(html), - `${name}.html` - ); - logChannel - .send({ embeds: [logEmbed], files: [file] }) - .catch((err) => { - interaction.reply(err); - }); - - interaction.channel.delete().catch((error) => { - if ( - error.code !== Discord.Constants.APIErrors.UNKNOWN_CHANNEL - ) { - console.error("Failed to delete the interaction:", error); - } - }); - }); - }) - .catch(() => { - interaction - .followUp({ - content: "The request to close the ticket has timed out.", - }) - .then((m2) => setTimeout(() => interaction.channel.delete(3000))); + let file = new Discord.MessageAttachment( + Buffer.from(html), + `${interaction.channel.name}.html` + ); + await transcriptChannel + .send({ embeds: [transcriptEmbed], files: [file] }) + .catch(async (err) => { + await console.error(err); }); + await tUser + .send({ embeds: [transcriptEmbed], files: [file] }) + .catch(async (err) => { + await console.error(err); + }); + + await interaction.channel.delete().catch(async (error) => { + console.error(error); + if (error.code !== Discord.Constants.APIErrors.UNKNOWN_CHANNEL) { + console.error("Failed to delete the interaction:", error); + } + }); + } catch (error) { + console.error(error); + await interaction.followUp({ + content: "The request to close the ticket has timed out.", + }); + setTimeout(() => interaction.channel.delete(3000)); } }, }); From cd6df02e30ccb24dfbd0d86961f851fcc296764a Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 15:50:56 -0600 Subject: [PATCH 16/53] Changed TicketLog_Title --- Configs/supportbot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configs/supportbot.yml b/Configs/supportbot.yml index 125a608..78732c8 100644 --- a/Configs/supportbot.yml +++ b/Configs/supportbot.yml @@ -92,7 +92,7 @@ TicketLog: "logs" TranscriptLog: "transcripts" TranscriptTitle: "Ticket Transcript" -TicketLog_Title: "Ticket Log" +TicketLog_Title: "Ticket Closed" TicketBlackListMessage: "You are not allowed to open a ticket" TicketSubject: "description" From b6747a034056103b86f12268ea7255159980d1ff Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 16:51:28 -0600 Subject: [PATCH 17/53] Made warning ephemeral --- Commands/ticket.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Commands/ticket.js b/Commands/ticket.js index b19134d..ef98dba 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -98,9 +98,11 @@ module.exports = new Command({ DepartmentRole.id === supportbot.DepartmentRole_3 ); if (!Staff || !Admins || !DeptRole1 || !DeptRole2 || !DeptRole3) - return interaction.reply( - "Some roles seem to be missing!\nPlease check for errors when starting the bot." - ); + return interaction.reply({ + content: + "Some roles seem to be missing!\nPlease check for errors when starting the bot.", + ephemeral: true, + }); const Author = interaction.user; const Everyone = interaction.guild.id; const ticketChannel = await interaction.guild.channels.create( From 6c5799be0dae1330bb0f3007c40a479a8e37e1e1 Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 17:32:57 -0600 Subject: [PATCH 18/53] Fix ID --- Data/TicketData.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Data/TicketData.json b/Data/TicketData.json index 6201053..f97612b 100644 --- a/Data/TicketData.json +++ b/Data/TicketData.json @@ -1,4 +1,4 @@ { - "id": 10, + "id": 0, "tickets": [] } From 9fed504f375396e755c62aec634dfa2c27cc4d29 Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 17:37:25 -0600 Subject: [PATCH 19/53] Fixed /close --- Commands/close.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Commands/close.js b/Commands/close.js index 12c4290..e836167 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -28,14 +28,17 @@ module.exports = new Command({ let TicketData = await JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") ).tickets.find((t) => t.id === interaction.channel.id); - let tUser = interaction.client.users.cache.get(TicketData.user); - if (!interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) { + if ( + !TicketData || + !interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`) + ) { const Exists = new Discord.MessageEmbed() .setTitle("No Ticket Found!") .setDescription(`${supportbot.NoValidTicket}`) .setColor(supportbot.WarningColour); - return interaction.reply({ embed: Exists }); + return interaction.reply({ embeds: [Exists] }); } + let tUser = interaction.client.users.cache.get(TicketData.user); let transcriptChannel = await interaction.guild.channels.cache.find( (channel) => channel.name == supportbot.TranscriptLog || From ffdce5820ba4664185e10b6b5fc25eb30e56e1b1 Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 18:08:45 -0600 Subject: [PATCH 20/53] Fix close button --- Events/interactionCreate.js | 76 ++++--------------------------------- 1 file changed, 7 insertions(+), 69 deletions(-) diff --git a/Events/interactionCreate.js b/Events/interactionCreate.js index 801e3e3..32672e3 100644 --- a/Events/interactionCreate.js +++ b/Events/interactionCreate.js @@ -18,8 +18,7 @@ module.exports = new Event("interactionCreate", async (client, interaction) => { (cmd) => cmd.name.toLowerCase() == interaction.commandName ); - if (interaction.user.bot || !interaction.isCommand() || !interaction.guild) - return; + if (interaction.user.bot || !interaction.guild) return; const NotValid = new Discord.MessageEmbed() .setDescription(`:x: \`Invalid Command\` `) @@ -57,73 +56,12 @@ module.exports = new Event("interactionCreate", async (client, interaction) => { } if (interaction.customId === "ticketclose") { - if (interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) { - interaction.message.fetch(); - interaction.deferUpdate(); - const DeleteTicketEmbed = new Discord.MessageEmbed() - .setDescription(supportbot.TicketDeleteMessage) - .setColor(supportbot.EmbedColour); - interaction.channel.send({ embeds: [DeleteTicketEmbed] }); - - let logChannel = - interaction.guild.channels.cache.find( - (channel) => channel.name === supportbot.TranscriptLog - ) || - interaction.guild.channels.cache.find( - (channel) => channel.id === supportbot.TranscriptLog - ); - - let user = interaction.user; - let name = interaction.channel.name; - let ticketChannel = interaction.channel; - let reason = "No Reason Provided."; - - interaction.channel - .send({ content: `**${supportbot.ClosingTicket}**` }) - .then(() => { - const logEmbed = new Discord.MessageEmbed() - .setTitle(supportbot.TranscriptTitle) - .setColor(supportbot.EmbedColour) - .setFooter(supportbot.EmbedFooter) - .addField("Closed By", user.username) - .addField("Reason", reason); - - interaction.channel.messages.fetch({ limit: 100 }).then((msgs) => { - let html = ""; - - msgs = msgs.sort( - (a, b) => a.createdTimestamp - b.createdTimestamp - ); - html += ``; - html += `Server Name: ${interaction.guild.name}
`; - html += `Ticket: ${ticketChannel.name}
`; - html += `Message: ${msgs.size} Messages


`; - - msgs.forEach((msg) => { - if (msg.content) { - html += `User: ${msg.author.tag}
`; - html += `Message: ${msg.content}
`; - html += `-----

`; - } - }); - - const TranscriptSavedEmbed = new Discord.MessageEmbed() - .setDescription(supportbot.TranscriptSavedMessage) - .setColor(supportbot.SuccessColour); - interaction.channel.send({ embeds: [TranscriptSavedEmbed] }); - - let file = new Discord.MessageAttachment( - Buffer.from(html), - `${name}.html` - ); - logChannel.send({ embeds: [logEmbed], files: [file] }); - - setTimeout( - () => interaction.channel.delete(), - supportbot.TicketDeleteTime - ); - }); - }); + try { + const cmd = client.commands.get(cmdconfig.CloseTicket); + if (!cmd) return; + cmd.run(interaction); + } catch (error) { + console.error(error); } } if (interaction.customId === "ticketlock") { From 1ee0d4a09e132d11ea047fda32eb30e1207142cd Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 18:09:06 -0600 Subject: [PATCH 21/53] Update close.js --- Commands/close.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Commands/close.js b/Commands/close.js index e836167..296dd8a 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -30,7 +30,7 @@ module.exports = new Command({ ).tickets.find((t) => t.id === interaction.channel.id); if ( !TicketData || - !interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`) + !interaction.channel.name.startsWith(supportbot.TicketPrefix) ) { const Exists = new Discord.MessageEmbed() .setTitle("No Ticket Found!") @@ -50,7 +50,7 @@ module.exports = new Command({ channel.id == supportbot.TicketLog ); let reason = - (await interaction.options.getString("reason")) || "No Reason Provided."; + (await interaction.options?.getString("reason")) || "No Reason Provided."; if (!transcriptChannel || !logChannel) return interaction.reply("Some Channels seem to be missing!"); @@ -132,12 +132,12 @@ module.exports = new Command({ await transcriptChannel .send({ embeds: [transcriptEmbed], files: [file] }) .catch(async (err) => { - await console.error(err); + console.error(err); }); await tUser .send({ embeds: [transcriptEmbed], files: [file] }) .catch(async (err) => { - await console.error(err); + console.error(err); }); await interaction.channel.delete().catch(async (error) => { @@ -148,10 +148,12 @@ module.exports = new Command({ }); } catch (error) { console.error(error); + /* await interaction.followUp({ content: "The request to close the ticket has timed out.", }); setTimeout(() => interaction.channel.delete(3000)); + */ } }, }); From c56e78484a5509d902528b8c806b4a73596e9637 Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 23 Nov 2021 20:29:22 -0600 Subject: [PATCH 22/53] Update dependencies --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7bc7e43..f8b4d7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "7.4.0", "license": "MIT", "dependencies": { - "discord.js": "^13.2.0", + "discord.js": "^13.3.1", "js-yaml": "^4.1.0" } }, @@ -72,9 +72,9 @@ } }, "node_modules/@types/node": { - "version": "16.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", - "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" + "version": "16.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", + "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -307,9 +307,9 @@ } }, "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", + "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", "engines": { "node": ">=10.0.0" }, @@ -366,9 +366,9 @@ "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" }, "@types/node": { - "version": "16.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", - "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" + "version": "16.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", + "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==" }, "@types/node-fetch": { "version": "2.5.12", @@ -546,9 +546,9 @@ } }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", + "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", "requires": {} } } diff --git a/package.json b/package.json index 7ae153e..277c4e8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ }, "homepage": "https://github.com/Emerald-Services/SupportBot#readme", "dependencies": { - "discord.js": "^13.2.0", + "discord.js": "^13.3.1", "js-yaml": "^4.1.0" } } From 5a467599e972b292019702f719273f799de15558 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 24 Nov 2021 00:15:16 -0600 Subject: [PATCH 23/53] Update hello.js --- Addons/hello.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Addons/hello.js b/Addons/hello.js index e87b181..692eff3 100644 --- a/Addons/hello.js +++ b/Addons/hello.js @@ -10,8 +10,8 @@ const supportbot = yaml.load( ); const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8")); -// Your Addon Config file! Saved in /Addons/Settings/YourAddonConfig.yml -// const exampleaddon = yaml.load(fs.readFileSync('./Addons/Settings/YourAddonConfig.yml', 'utf8')); +// Your Addon Config file! Saved in /Addons/Configs/YourAddonConfig.yml +// const exampleaddon = yaml.load(fs.readFileSync('./Addons/Configs/YourAddonConfig.yml', 'utf8')); const Command = require("../Structures/Command.js"); From ffe42f9777bb41d78baae00fcd1ee1e7c21233f8 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 24 Nov 2021 18:14:07 -0600 Subject: [PATCH 24/53] Update ticket.js --- Commands/ticket.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Commands/ticket.js b/Commands/ticket.js index ef98dba..db4bf7e 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -236,19 +236,19 @@ module.exports = new Command({ }); const Department1Button = new Discord.MessageButton() .setCustomId("Department1") - .setLabel(`${supportbot.DepartmentTitle_1}`) + .setLabel(supportbot.DepartmentTitle_1) .setStyle(supportbot.TicketDept1Colour) .setEmoji(supportbot.TicketDept1Emoji); const Department2Button = new Discord.MessageButton() .setCustomId("Department2") - .setLabel(`${supportbot.DepartmentTitle_2}`) + .setLabel(supportbot.DepartmentTitle_2) .setStyle(supportbot.TicketDept2Colour) .setEmoji(supportbot.TicketDept2Emoji); const Department3Button = new Discord.MessageButton() .setCustomId("Department3") - .setLabel(`${supportbot.DepartmentTitle_3}`) + .setLabel(supportbot.DepartmentTitle_3) .setStyle(supportbot.TicketDept3Colour) .setEmoji(supportbot.TicketDept3Emoji); From 0118b9e59196870072e4bbf6d374e30b46608110 Mon Sep 17 00:00:00 2001 From: SypherRed <64218204+SypherRed@users.noreply.github.com> Date: Thu, 25 Nov 2021 01:51:56 +0100 Subject: [PATCH 25/53] fixed help command --- Commands/help.js | 117 +++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 61 deletions(-) diff --git a/Commands/help.js b/Commands/help.js index bc02091..bb0db61 100644 --- a/Commands/help.js +++ b/Commands/help.js @@ -25,82 +25,77 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = - interaction.guild.roles.cache.find( - (adminRole) => adminRole.name === supportbot.Staff - ) || - interaction.guild.roles.cache.find( - (staffRole) => staffRole.id === supportbot.Staff - ); - let AdminStaff = - interaction.guild.roles.cache.find( - (adminRole) => adminRole.name === supportbot.Admin - ) || - interaction.guild.roles.cache.find( - (adminRole) => adminRole.id === supportbot.Admin + let SupportStaff = interaction.guild.roles.cache.find( + (SupportTeam) => + SupportTeam.name === supportbot.Staff || SupportTeam.id === supportbot.Staff + ); + let Admins = interaction.guild.roles.cache.find( + (AdminUser) => + AdminUser.name === supportbot.Admin || AdminUser.id === supportbot.Admin + ); + if (!SupportStaff || !Admins) + return interaction.reply( + "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); + let botCommands = ""; + botCommands += `**/${cmdconfig.HelpCommand}** ${cmdconfig.HelpCommandDesc}\n`; + botCommands += `**/${cmdconfig.InfoCommand}** ${cmdconfig.InfoCommandDesc}\n`; + botCommands += `**/${cmdconfig.PingCommand}** ${cmdconfig.PingCommandDesc}\n`; - if (supportbot.HelpMenu) { - let botCommands = ""; - botCommands += `**/${cmdconfig.HelpCommand}** ${cmdconfig.HelpCommandDesc}\n`; - botCommands += `**/${cmdconfig.InfoCommand}** ${cmdconfig.InfoCommandDesc}\n`; - botCommands += `**/${cmdconfig.PingCommand}** ${cmdconfig.PingCommandDesc}\n`; + let ticketCommands = ""; + ticketCommands += `**/${cmdconfig.OpenTicket}** ${cmdconfig.OpenTicketDesc}\n`; + ticketCommands += `**/${cmdconfig.CloseTicket}** ${cmdconfig.CloseTicketDesc}\n`; - let ticketCommands = ""; - ticketCommands += `**/${cmdconfig.OpenTicket}** ${cmdconfig.OpenTicketDesc}\n`; - ticketCommands += `**/${cmdconfig.CloseTicket}** ${cmdconfig.CloseTicketDesc}\n`; + let staffCommands = ""; + staffCommands += `**/${cmdconfig.TicketAdd}** ${cmdconfig.TicketAddDesc}\n`; + staffCommands += `**/${cmdconfig.TicketRemove}** ${cmdconfig.TicketRemoveDesc}\n`; - let staffCommands = ""; - staffCommands += `**/${cmdconfig.TicketAdd}** ${cmdconfig.TicketAddDesc}\n`; - staffCommands += `**/${cmdconfig.TicketRemove}** ${cmdconfig.TicketRemoveDesc}\n`; + const HelpEmbed1 = new Discord.MessageEmbed() + .setTitle(supportbot.Name + " Commands") + .setThumbnail(interaction.user.displayAvatarURL()) - const HelpEmbed1 = new Discord.MessageEmbed() - .setTitle(supportbot.Name + " Commands") - .setThumbnail(interaction.user.displayAvatarURL()) + .addFields( + { + name: "🖥️ General Commands\n", + value: `${botCommands}\n`, + inline: false, + }, + { + name: "🎫 Support Commands\n", + value: `${ticketCommands}\n`, + inline: false, + } + ) - .addFields( - { - name: "🖥️ General Commands\n", - value: `${botCommands}\n`, - inline: false, - }, - { - name: "🎫 Support Commands\n", - value: `${ticketCommands}\n`, - inline: false, - } - ) + .setColor(supportbot.EmbedColour) + .setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()); - .setColor(supportbot.EmbedColour) - .setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()); - - if (interaction.member.roles.cache.has(SupportStaff.id)) { + if (interaction.member.roles.cache.has(SupportStaff.id)) { + HelpEmbed1.addFields({ + name: "🔐 Staff Commands\n", + value: `${staffCommands}\n`, + inline: false, + }); + } else { + if (interaction.member.roles.cache.has(Admins.id)) { HelpEmbed1.addFields({ name: "🔐 Staff Commands\n", value: `${staffCommands}\n`, inline: false, }); - } else { - if (interaction.member.roles.cache.has(AdminStaff.id)) { - HelpEmbed1.addFields({ - name: "🔐 Staff Commands\n", - value: `${staffCommands}\n`, - inline: false, - }); - } } + } - if (supportbot.SendHelpPage === "dm") { - interaction.user.reply({ - embeds: [HelpEmbed1], - }); - } + if (supportbot.SendHelpPage === "dm") { + interaction.user.reply({ + embeds: [HelpEmbed1], + }); + } - if (supportbot.SendHelpPage === "channel") { - interaction.reply({ - embeds: [HelpEmbed1], - }); - } + if (supportbot.SendHelpPage === "channel") { + interaction.reply({ + embeds: [HelpEmbed1], + }); } }, }); From e7dcc2ab291acac1930c00e12d6efeb941adc9a7 Mon Sep 17 00:00:00 2001 From: Noah Date: Fri, 26 Nov 2021 12:56:21 -0600 Subject: [PATCH 26/53] Update help.js --- Commands/help.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Commands/help.js b/Commands/help.js index bb0db61..1b41fcf 100644 --- a/Commands/help.js +++ b/Commands/help.js @@ -70,20 +70,12 @@ module.exports = new Command({ .setColor(supportbot.EmbedColour) .setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()); - if (interaction.member.roles.cache.has(SupportStaff.id)) { + if (interaction.member.roles.cache.has(SupportStaff.id) || interaction.member.roles.cache.has(Admins.id)) { HelpEmbed1.addFields({ name: "🔐 Staff Commands\n", value: `${staffCommands}\n`, inline: false, }); - } else { - if (interaction.member.roles.cache.has(Admins.id)) { - HelpEmbed1.addFields({ - name: "🔐 Staff Commands\n", - value: `${staffCommands}\n`, - inline: false, - }); - } } if (supportbot.SendHelpPage === "dm") { From 74646a43187905d411a3d0c78fad1aa3abdf0c8c Mon Sep 17 00:00:00 2001 From: DarkerInker <89653989+DarkerInker@users.noreply.github.com> Date: Thu, 2 Dec 2021 13:52:07 -0600 Subject: [PATCH 27/53] wrong way to send embeds You are using the old way to send embeds. I'm not sure how you forgot about this one area but everyone makes mistakes :D --- Commands/close.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/close.js b/Commands/close.js index 296dd8a..73291f3 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -62,7 +62,7 @@ module.exports = new Command({ ) .setColor(supportbot.EmbedColour); - await interaction.reply(CloseTicketRequest); + await interaction.reply({embds: [CloseTicketRequest}); await interaction.channel.awaitMessages( (r) => r.content.toLowerCase() === supportbot.ClosingConfirmation_Word && From f593f6e0a84748d1122800b9afb515f85298b01b Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 20:20:55 -0600 Subject: [PATCH 28/53] Update close.js --- Commands/close.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/close.js b/Commands/close.js index 73291f3..e353148 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -62,7 +62,7 @@ module.exports = new Command({ ) .setColor(supportbot.EmbedColour); - await interaction.reply({embds: [CloseTicketRequest}); + await interaction.reply({embeds: [CloseTicketRequest}); await interaction.channel.awaitMessages( (r) => r.content.toLowerCase() === supportbot.ClosingConfirmation_Word && From a1bf7ed6bd50416788331c1e9015525bcb372afc Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 20:25:35 -0600 Subject: [PATCH 29/53] Fix syntax --- Commands/close.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/close.js b/Commands/close.js index e353148..8ada537 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -62,7 +62,7 @@ module.exports = new Command({ ) .setColor(supportbot.EmbedColour); - await interaction.reply({embeds: [CloseTicketRequest}); + await interaction.reply({ embeds: [CloseTicketRequest] }); await interaction.channel.awaitMessages( (r) => r.content.toLowerCase() === supportbot.ClosingConfirmation_Word && From d4d96f59ab84224d28fac863c1e3456892c3a53a Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 20:25:49 -0600 Subject: [PATCH 30/53] Update --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8b4d7a..013bf2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,9 +72,9 @@ } }, "node_modules/@types/node": { - "version": "16.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", - "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==" + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -86,9 +86,9 @@ } }, "node_modules/@types/ws": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.0.tgz", - "integrity": "sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.1.tgz", + "integrity": "sha512-SqQ+LhVZaJi7c7sYVkjWALDigi/Wy7h7Iu72gkQp8Y8OWw/DddEVBrTSKu86pQftV2+Gm8lYM61hadPKqyaIeg==", "dependencies": { "@types/node": "*" } @@ -366,9 +366,9 @@ "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" }, "@types/node": { - "version": "16.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", - "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==" + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==" }, "@types/node-fetch": { "version": "2.5.12", @@ -380,9 +380,9 @@ } }, "@types/ws": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.0.tgz", - "integrity": "sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.1.tgz", + "integrity": "sha512-SqQ+LhVZaJi7c7sYVkjWALDigi/Wy7h7Iu72gkQp8Y8OWw/DddEVBrTSKu86pQftV2+Gm8lYM61hadPKqyaIeg==", "requires": { "@types/node": "*" } From 6b01d0c8fee7455ac846ea52d563d6b92fc2d207 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 20:57:23 -0600 Subject: [PATCH 31/53] Possibly fix /close? --- Commands/close.js | 29 ++++--- Commands/ticket.js | 199 +++++++++++++++++++++++---------------------- 2 files changed, 118 insertions(+), 110 deletions(-) diff --git a/Commands/close.js b/Commands/close.js index 8ada537..a36378b 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -25,6 +25,7 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { + await interaction.deferReply(); let TicketData = await JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") ).tickets.find((t) => t.id === interaction.channel.id); @@ -36,7 +37,7 @@ module.exports = new Command({ .setTitle("No Ticket Found!") .setDescription(`${supportbot.NoValidTicket}`) .setColor(supportbot.WarningColour); - return interaction.reply({ embeds: [Exists] }); + return interaction.followUp({ embeds: [Exists] }); } let tUser = interaction.client.users.cache.get(TicketData.user); let transcriptChannel = await interaction.guild.channels.cache.find( @@ -53,7 +54,7 @@ module.exports = new Command({ (await interaction.options?.getString("reason")) || "No Reason Provided."; if (!transcriptChannel || !logChannel) - return interaction.reply("Some Channels seem to be missing!"); + return interaction.followUp("Some Channels seem to be missing!"); if (supportbot.CloseConfirmation) { const CloseTicketRequest = new Discord.MessageEmbed() .setTitle(`**${supportbot.ClosingTicket}**`) @@ -61,21 +62,19 @@ module.exports = new Command({ `Please confirm by repeating the following word.. \`${supportbot.ClosingConfirmation_Word}\` ` ) .setColor(supportbot.EmbedColour); - - await interaction.reply({ embeds: [CloseTicketRequest] }); - await interaction.channel.awaitMessages( - (r) => - r.content.toLowerCase() === supportbot.ClosingConfirmation_Word && - r.author.id === interaction.author.id, - { - max: 1, - time: 20000, - errors: ["time"], - } - ); + await interaction.followUp({ embeds: [CloseTicketRequest] }); + let filter = (m) => + m.content.toLowerCase() == supportbot.ClosingConfirmation_Word && + m.author.id == interaction.user.id; + await interaction.channel.awaitMessages({ + filter, + max: 1, + time: 20000, + errors: ["time"], + }); } try { - await interaction.reply(`**${supportbot.ClosingTicket}**`); + await interaction.followUp(`**${supportbot.ClosingTicket}**`); const transcriptEmbed = new Discord.MessageEmbed() .setTitle(supportbot.TranscriptTitle) .setColor(supportbot.EmbedColour) diff --git a/Commands/ticket.js b/Commands/ticket.js index db4bf7e..83de1b1 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -71,7 +71,7 @@ module.exports = new Command({ ticketChannel.name === `${supportbot.TicketPrefix}${ticketNumberID}`; }) ) { - return interaction.reply({ embeds: [TicketExists] }); + return await interaction.reply({ embeds: [TicketExists] }); } const Staff = interaction.guild.roles.cache.find( (SupportTeam) => @@ -140,7 +140,7 @@ module.exports = new Command({ .replace(/%ticketusername%/g, interaction.user.username) ) .setColor(supportbot.EmbedColour); - interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); + await interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); } else { const CreatedTicket = new Discord.MessageEmbed() .setDescription( @@ -152,16 +152,20 @@ module.exports = new Command({ .replace(/%ticketusername%/g, interaction.user.username) ) .setColor(supportbot.EmbedColour); - interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); + await interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); } let AllowArr = [Staff, Staff, Admins, Author]; - await asyncForEach(AllowArr, (index) => { - ticketChannel.permissionOverwrites.create(index, { VIEW_CHANNEL: true }); + await asyncForEach(AllowArr, async (index) => { + await ticketChannel.permissionOverwrites.create(index, { + VIEW_CHANNEL: true, + }); }); let DenyArr = [Everyone]; - await asyncForEach(DenyArr, (index) => { - ticketChannel.permissionOverwrites.create(index, { VIEW_CHANNEL: false }); + await asyncForEach(DenyArr, async (index) => { + await ticketChannel.permissionOverwrites.create(index, { + VIEW_CHANNEL: false, + }); }); let TicketCategory = interaction.guild.channels.cache.find( @@ -170,11 +174,11 @@ module.exports = new Command({ category.id === supportbot.TicketCategory ); if (TicketCategory) { - ticketChannel.setParent(TicketCategory.id); + await ticketChannel.setParent(TicketCategory.id); } if (supportbot.AllowTicketMentions) { - ticketChannel.send({ content: `${interaction.user}` }); + await ticketChannel.send({ content: `${interaction.user}` }); } const TicketMessage = new Discord.MessageEmbed() @@ -198,7 +202,7 @@ module.exports = new Command({ if (supportbot.TicketSubject === "description") { if (TicketSubject != "No Reason Provided.") { - ticketChannel.setTopic( + await ticketChannel.setTopic( `Reason: ${TicketSubject} - User ID: ${interaction.user.id} - Ticket: ${ticketChannel.name}` ); } @@ -263,104 +267,109 @@ module.exports = new Command({ components: [row], }); - const filter = (i) => { - i.deferUpdate(); - return i.user.id === interaction.user.id; - }; - const collector = m.createMessageComponentCollector({ + const filter = (i) => i.user.id === interaction.user.id; + const collector = await m.awaitMessageComponent({ filter, max: 1, componentType: "BUTTON", time: 60000, }); + await collector.deferUpdate(); - collector.on("collect", async (i) => { - if (i.customId === "Department1") { - ticketChannel.permissionOverwrites.edit(DeptRole1, { - VIEW_CHANNEL: true, - READ_MESSAGE_HISTORY: true, - SEND_MESSAGES: true, + if (collector.customId === "Department1") { + await ticketChannel.permissionOverwrites.edit(DeptRole1, { + VIEW_CHANNEL: true, + READ_MESSAGE_HISTORY: true, + SEND_MESSAGES: true, + }); + + if (!supportbot.AllowStaff) { + await ticketChannel.permissionOverwrites.edit(Staff, { + VIEW_CHANNEL: false, + READ_MESSAGE_HISTORY: false, + SEND_MESSAGES: false, }); - - if (!supportbot.AllowStaff) { - ticketChannel.permissionOverwrites.edit(Staff, { - VIEW_CHANNEL: false, - READ_MESSAGE_HISTORY: false, - SEND_MESSAGES: false, - }); - } - - const Department1 = new Discord.MessageEmbed() - .setDescription( - `> Thank for reaching out to the **${supportbot.DepartmentTitle_1} Department**. Please provide us information regarding your query.` - ) - .setColor(supportbot.EmbedColour); - ticketChannel.send({ embeds: [Department1] }); - - if (supportbot.AllowTicketMentions) { - ticketChannel.send({ content: `@here` }); - } } - i.message.edit({ embeds: [TicketMessage], components: [row2] }); - if (i.customId === "Department2") { - ticketChannel.permissionOverwrites.edit(DeptRole2, { - VIEW_CHANNEL: true, - READ_MESSAGE_HISTORY: true, - SEND_MESSAGES: true, - }); + const Department1 = new Discord.MessageEmbed() + .setDescription( + `> Thank for reaching out to the **${supportbot.DepartmentTitle_1} Department**. Please provide us information regarding your query.` + ) + .setColor(supportbot.EmbedColour); + await ticketChannel.send({ embeds: [Department1] }); - if (!supportbot.AllowStaff) { - ticketChannel.permissionOverwrites.edit(Staff, { - VIEW_CHANNEL: false, - READ_MESSAGE_HISTORY: false, - SEND_MESSAGES: false, - }); - } - - const Department2 = new Discord.MessageEmbed() - .setDescription( - `> Thank for reaching out to the **${supportbot.DepartmentTitle_2} Department**. Please provide us information regarding your query.` - ) - .setColor(supportbot.EmbedColour); - ticketChannel.send({ embeds: [Department2] }); - - if (supportbot.AllowTicketMentions) { - ticketChannel.send({ content: `@here` }); - } - - i.message.edit({ embeds: [TicketMessage], components: [row2] }); - } - if (i.customId === "Department3") { - ticketChannel.permissionOverwrites.edit(DeptRole3, { - VIEW_CHANNEL: true, - READ_MESSAGE_HISTORY: true, - SEND_MESSAGES: true, - }); - - if (!supportbot.AllowStaff) { - ticketChannel.permissionOverwrites.edit(Staff, { - VIEW_CHANNEL: false, - READ_MESSAGE_HISTORY: false, - SEND_MESSAGES: false, - }); - } - - const Department3 = new Discord.MessageEmbed() - .setDescription( - `> Thank for reaching out to the **${supportbot.DepartmentTitle_3} Department**. Please provide us information regarding your query.` - ) - .setColor(supportbot.EmbedColour); - ticketChannel.send({ embeds: [Department3] }); - - if (supportbot.AllowTicketMentions) { - ticketChannel.send({ content: `@here` }); - } - i.message.edit({ embeds: [TicketMessage], components: [row2] }); + if (supportbot.AllowTicketMentions) { + await ticketChannel.send({ content: `@here` }); } + } + await collector.message.edit({ + embeds: [TicketMessage], + components: [row2], }); + + if (collector.customId === "Department2") { + await ticketChannel.permissionOverwrites.edit(DeptRole2, { + VIEW_CHANNEL: true, + READ_MESSAGE_HISTORY: true, + SEND_MESSAGES: true, + }); + + if (!supportbot.AllowStaff) { + await ticketChannel.permissionOverwrites.edit(Staff, { + VIEW_CHANNEL: false, + READ_MESSAGE_HISTORY: false, + SEND_MESSAGES: false, + }); + } + + const Department2 = new Discord.MessageEmbed() + .setDescription( + `> Thank for reaching out to the **${supportbot.DepartmentTitle_2} Department**. Please provide us information regarding your query.` + ) + .setColor(supportbot.EmbedColour); + await ticketChannel.send({ embeds: [Department2] }); + + if (supportbot.AllowTicketMentions) { + await ticketChannel.send({ content: `@here` }); + } + + await collector.message.edit({ + embeds: [TicketMessage], + components: [row2], + }); + } + if (collector.customId === "Department3") { + await ticketChannel.permissionOverwrites.edit(DeptRole3, { + VIEW_CHANNEL: true, + READ_MESSAGE_HISTORY: true, + SEND_MESSAGES: true, + }); + + if (!supportbot.AllowStaff) { + await ticketChannel.permissionOverwrites.edit(Staff, { + VIEW_CHANNEL: false, + READ_MESSAGE_HISTORY: false, + SEND_MESSAGES: false, + }); + } + + const Department3 = new Discord.MessageEmbed() + .setDescription( + `> Thank for reaching out to the **${supportbot.DepartmentTitle_3} Department**. Please provide us information regarding your query.` + ) + .setColor(supportbot.EmbedColour); + await ticketChannel.send({ embeds: [Department3] }); + + if (supportbot.AllowTicketMentions) { + await ticketChannel.send({ content: `@here` }); + } + await collector.message.edit({ + embeds: [TicketMessage], + components: [row2], + }); + } } else { - ticketChannel.send({ embeds: [TicketMessage], components: [row2] }); + await ticketChannel.send({ embeds: [TicketMessage], components: [row2] }); } }, }); From adedfadd927d48b94992f4498bc8cf2bee2eee20 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 20:58:19 -0600 Subject: [PATCH 32/53] Prettier --- Commands/help.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Commands/help.js b/Commands/help.js index 6187134..2ed6624 100644 --- a/Commands/help.js +++ b/Commands/help.js @@ -26,20 +26,19 @@ module.exports = new Command({ async run(interaction) { let SupportStaff = interaction.guild.roles.cache.find( - (SupportTeam) => - SupportTeam.name === supportbot.Staff || SupportTeam.id === supportbot.Staff + SupportTeam.name === supportbot.Staff || + SupportTeam.id === supportbot.Staff ); let Admins = interaction.guild.roles.cache.find( (AdminUser) => AdminUser.name === supportbot.Admin || AdminUser.id === supportbot.Admin - ); if (!SupportStaff || !Admins) return interaction.reply( "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); - + let botCommands = ""; botCommands += `**/${cmdconfig.HelpCommand}** ${cmdconfig.HelpCommandDesc}\n`; botCommands += `**/${cmdconfig.InfoCommand}** ${cmdconfig.InfoCommandDesc}\n`; @@ -73,7 +72,10 @@ module.exports = new Command({ .setColor(supportbot.EmbedColour) .setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()); - if (interaction.member.roles.cache.has(SupportStaff.id) || interaction.member.roles.cache.has(Admins.id)) { + if ( + interaction.member.roles.cache.has(SupportStaff.id) || + interaction.member.roles.cache.has(Admins.id) + ) { HelpEmbed1.addFields({ name: "🔐 Staff Commands\n", value: `${staffCommands}\n`, @@ -93,4 +95,4 @@ module.exports = new Command({ }); } }, -}); \ No newline at end of file +}); From 44170caac621419977e4e2d58713f81002fd46e9 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:01:34 -0600 Subject: [PATCH 33/53] Update supportbot.yml --- Configs/supportbot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Configs/supportbot.yml b/Configs/supportbot.yml index 78732c8..855ea30 100644 --- a/Configs/supportbot.yml +++ b/Configs/supportbot.yml @@ -127,10 +127,10 @@ RemovedUser: "👍 <@%user%> has been removed from this ticket" # --- Start --- # Discord Button Colour Selection -# PRIMARY - Blurple +# PRIMARY - Blue +# SECONDARY - Grey # DANGER - Red # SUCCESS - Green -# Secondary - Grey LockTicketCategory: "Archive" From e599d48713f6ce41e5c65f4701adcbd96c075d8c Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:05:36 -0600 Subject: [PATCH 34/53] Update node.js.yml --- .github/workflows/node.js.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 15d7058..83e83b8 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x, 15.x] + node-version: [16.x, 17.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: @@ -25,7 +25,5 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm ci - - run: npm install discord.js --save - - run: npm install js-yaml - run: npm run build --if-present - run: node index.js From 72c0a2efa395e908ed5ba7402d4de02b37ce2021 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:07:27 -0600 Subject: [PATCH 35/53] Update node.js.yml --- .github/workflows/node.js.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 83e83b8..cfeb236 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -5,9 +5,9 @@ name: Node.js CI on: push: - branches: [master] + branches: [dev] pull_request: - branches: [master] + branches: [dev] jobs: build: From ed1905d8f431f3446bfac56832f5fd0eae68d967 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:19:51 -0600 Subject: [PATCH 36/53] Added test mode --- Structures/Client.js | 10 ++++++++-- package.json | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Structures/Client.js b/Structures/Client.js index f04bc30..4b70462 100644 --- a/Structures/Client.js +++ b/Structures/Client.js @@ -116,8 +116,14 @@ class Client extends Discord.Client { console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Events ▬▬▬▬▬▬▬"); console.log(" "); - - this.login(token); + if (process.title != "npm test") { + this.login(token); + } else { + console.log( + `\u001b[31;1m`, + "RUNNING IN TEST MODE, IF NOT INTENDED, PLEASE USE npm start" + ); + } } } diff --git a/package.json b/package.json index 277c4e8..28f13e3 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "SupportBot is an open-sourced support system for discord. It's completely free to use with high amounts of customization to match your own brand.", "main": "index.js", "scripts": { - "start": "npm i && node index.js" + "start": "npm i && node index.js", + "test": "node index.js" }, "repository": { "type": "git", From 14881096bb6af1fcf0ad965cf89a736ee5acaaf1 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:22:07 -0600 Subject: [PATCH 37/53] Update node.js.yml --- .github/workflows/node.js.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index cfeb236..1c38d46 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -25,5 +25,4 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm ci - - run: npm run build --if-present - - run: node index.js + - run: npm test From 038174bc7e8471b40ca6710c1eb844c6615a37b0 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:22:08 -0600 Subject: [PATCH 38/53] temp --- Structures/Client.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Structures/Client.js b/Structures/Client.js index 4b70462..24f9aa5 100644 --- a/Structures/Client.js +++ b/Structures/Client.js @@ -116,6 +116,7 @@ class Client extends Discord.Client { console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Events ▬▬▬▬▬▬▬"); console.log(" "); + console.log(process.title); if (process.title != "npm test") { this.login(token); } else { From 8096e5b882fbedbdaa4fa893aca0b7e37df96877 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:25:02 -0600 Subject: [PATCH 39/53] Add npm test --- Structures/Client.js | 3 +-- package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Structures/Client.js b/Structures/Client.js index 24f9aa5..2303374 100644 --- a/Structures/Client.js +++ b/Structures/Client.js @@ -116,8 +116,7 @@ class Client extends Discord.Client { console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Events ▬▬▬▬▬▬▬"); console.log(" "); - console.log(process.title); - if (process.title != "npm test") { + if (process.argv[0] != "test") { this.login(token); } else { console.log( diff --git a/package.json b/package.json index 28f13e3..c24ff2e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "start": "npm i && node index.js", - "test": "node index.js" + "test": "node index.js test" }, "repository": { "type": "git", From acf349c72e1fbb052313f702d750fe0b82f3eecd Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:26:55 -0600 Subject: [PATCH 40/53] Fix test mode --- Structures/Client.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Structures/Client.js b/Structures/Client.js index 2303374..fbb847e 100644 --- a/Structures/Client.js +++ b/Structures/Client.js @@ -115,8 +115,7 @@ class Client extends Discord.Client { }); console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Events ▬▬▬▬▬▬▬"); - console.log(" "); - if (process.argv[0] != "test") { + if (process.argv[2] != "test") { this.login(token); } else { console.log( From 7760699155871f7be7d16753c01d4bb9d79c58a5 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 4 Dec 2021 21:30:48 -0600 Subject: [PATCH 41/53] Update node.js.yml --- .github/workflows/node.js.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 1c38d46..cd33b64 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -5,9 +5,9 @@ name: Node.js CI on: push: - branches: [dev] + branches: [dev, release] pull_request: - branches: [dev] + branches: [dev, release] jobs: build: From 6107d268f768ab6ecd74e259abf53fca580703ff Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 14 Dec 2021 18:04:38 -0600 Subject: [PATCH 42/53] Fixed close + Send transcript to subusers --- Commands/add.js | 78 +++++++------ Commands/close.js | 17 +-- Commands/remove.js | 80 +++++++------ Commands/ticket.js | 285 +++++++++++++++++---------------------------- 4 files changed, 203 insertions(+), 257 deletions(-) diff --git a/Commands/add.js b/Commands/add.js index 6fef2da..1b5546f 100644 --- a/Commands/add.js +++ b/Commands/add.js @@ -54,41 +54,51 @@ module.exports = new Command({ .setColor(supportbot.WarningColour); if ( - interaction.member.roles.cache.has(SupportStaff.id) || - interaction.member.roles.cache.has(Admins.id) - ) { - if (!interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) { - const Exists = new Discord.MessageEmbed() - .setTitle("No Ticket Found!") - .setDescription(`${supportbot.NoValidTicket}`) - .setColor(supportbot.WarningColour); - return interaction.reply({ embeds: [Exists] }); - } - - let uMember = interaction.options.getUser("user"); - const UserNotExist = new Discord.MessageEmbed() - .setTitle("User Not Found!") - .setDescription( - `${supportbot.UserNotFound}\n\nTry Again:\`/${cmdconfig.TicketAdd} \`` - ) - .setColor(supportbot.ErrorColour); - - if (!uMember) return interaction.reply({ embeds: [UserNotExist] }); - - interaction.channel.permissionOverwrites.edit(uMember, { - VIEW_CHANNEL: true, - READ_MESSAGE_HISTORY: true, - SEND_MESSAGES: true, - }); - - const Complete = new Discord.MessageEmbed() - .setTitle("User Added!") - .setDescription(supportbot.AddedUser.replace(/%user%/g, uMember.id)) - .setTimestamp() - .setColor(supportbot.EmbedColour); - interaction.reply({ embeds: [Complete] }); - } else { + !interaction.member.roles.cache.has(SupportStaff.id) || + !interaction.member.roles.cache.has(Admins.id) + ) return interaction.reply({ embeds: [NoPerms] }); + + let TicketData = await JSON.parse( + fs.readFileSync("./Data/TicketData.json", "utf8") + ); + let ticket = await TicketData.tickets.findIndex( + (t) => t.id == interaction.channel.id + ); + if (ticket == -1) { + const Exists = new Discord.MessageEmbed() + .setTitle("No Ticket Found!") + .setDescription(`${supportbot.NoValidTicket}`) + .setColor(supportbot.WarningColour); + return interaction.reply({ embeds: [Exists] }); } + + let uMember = interaction.options.getUser("user"); + const UserNotExist = new Discord.MessageEmbed() + .setTitle("User Not Found!") + .setDescription( + `${supportbot.UserNotFound}\n\nTry Again:\`/${cmdconfig.TicketAdd} \`` + ) + .setColor(supportbot.ErrorColour); + + if (!uMember) return interaction.reply({ embeds: [UserNotExist] }); + + interaction.channel.permissionOverwrites.edit(uMember.id, { + VIEW_CHANNEL: true, + }); + const Complete = new Discord.MessageEmbed() + .setTitle("User Added!") + .setDescription(supportbot.AddedUser.replace(/%user%/g, uMember.id)) + .setTimestamp() + .setColor(supportbot.EmbedColour); + interaction.reply({ embeds: [Complete] }); + TicketData.tickets[ticket].subUsers.push(uMember.id); + fs.writeFileSync( + "./Data/TicketData.json", + JSON.stringify(TicketData, null, 4), + (err) => { + if (err) console.error(err); + } + ); }, }); diff --git a/Commands/close.js b/Commands/close.js index a36378b..2aed553 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -29,10 +29,7 @@ module.exports = new Command({ let TicketData = await JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") ).tickets.find((t) => t.id === interaction.channel.id); - if ( - !TicketData || - !interaction.channel.name.startsWith(supportbot.TicketPrefix) - ) { + if (!TicketData) { const Exists = new Discord.MessageEmbed() .setTitle("No Ticket Found!") .setDescription(`${supportbot.NoValidTicket}`) @@ -138,7 +135,11 @@ module.exports = new Command({ .catch(async (err) => { console.error(err); }); - + TicketData.subUsers.forEach(async (subUser) => { + interaction.client.users.cache + .get(subUser) + .send({ embeds: [transcriptEmbed], files: [file] }); + }); await interaction.channel.delete().catch(async (error) => { console.error(error); if (error.code !== Discord.Constants.APIErrors.UNKNOWN_CHANNEL) { @@ -147,12 +148,6 @@ module.exports = new Command({ }); } catch (error) { console.error(error); - /* - await interaction.followUp({ - content: "The request to close the ticket has timed out.", - }); - setTimeout(() => interaction.channel.delete(3000)); - */ } }, }); diff --git a/Commands/remove.js b/Commands/remove.js index c90e0a1..de144d4 100644 --- a/Commands/remove.js +++ b/Commands/remove.js @@ -54,41 +54,53 @@ module.exports = new Command({ .setColor(supportbot.WarningColour); if ( - interaction.member.roles.cache.has(SupportStaff.id) || - interaction.member.roles.cache.has(Admins.id) - ) { - if (!interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) { - const Exists = new Discord.MessageEmbed() - .setTitle("No Ticket Found!") - .setDescription(`${supportbot.NoValidTicket}`) - .setColor(supportbot.WarningColour); - return interaction.reply({ embeds: [Exists] }); - } - - let uMember = interaction.options.getUser("user"); - const UserNotExist = new Discord.MessageEmbed() - .setTitle("User Not Found!") - .setDescription( - `${supportbot.UserNotFound}\n\nTry Again:\`/${cmdconfig.TicketRemove} \`` - ) - .setColor(supportbot.ErrorColour); - - if (!uMember) return interaction.reply({ embeds: [UserNotExist] }); - - interaction.channel.permissionOverwrites.edit(uMember, { - VIEW_CHANNEL: false, - READ_MESSAGE_HISTORY: false, - SEND_MESSAGES: false, - }); - - const Complete = new Discord.MessageEmbed() - .setTitle("User Removed!") - .setDescription(supportbot.RemovedUser.replace(/%user%/g, uMember.id)) - .setTimestamp() - .setColor(supportbot.EmbedColour); - interaction.reply({ embeds: [Complete] }); - } else { + !interaction.member.roles.cache.has(SupportStaff.id) || + !interaction.member.roles.cache.has(Admins.id) + ) return interaction.reply({ embeds: [NoPerms] }); + let TicketData = await JSON.parse( + fs.readFileSync("./Data/TicketData.json", "utf8") + ); + let ticket = await TicketData.tickets.findIndex( + (t) => t.id == interaction.channel.id + ); + if (ticket == -1) { + const Exists = new Discord.MessageEmbed() + .setTitle("No Ticket Found!") + .setDescription(`${supportbot.NoValidTicket}`) + .setColor(supportbot.WarningColour); + return interaction.reply({ embeds: [Exists] }); } + + let uMember = interaction.options.getUser("user"); + const UserNotExist = new Discord.MessageEmbed() + .setTitle("User Not Found!") + .setDescription( + `${supportbot.UserNotFound}\n\nTry Again:\`/${cmdconfig.TicketRemove} \`` + ) + .setColor(supportbot.ErrorColour); + + if (!uMember) return interaction.reply({ embeds: [UserNotExist] }); + + interaction.channel.permissionOverwrites.edit(uMember.id, { + VIEW_CHANNEL: false, + }); + + const Complete = new Discord.MessageEmbed() + .setTitle("User Removed!") + .setDescription(supportbot.RemovedUser.replace(/%user%/g, uMember.id)) + .setTimestamp() + .setColor(supportbot.EmbedColour); + interaction.reply({ embeds: [Complete] }); + TicketData.tickets[ticket].subUsers = TicketData.tickets[ + ticket + ].subUsers.filter((u) => u != uMember.id); + fs.writeFileSync( + "./Data/TicketData.json", + JSON.stringify(TicketData, null, 4), + (err) => { + if (err) console.error(err); + } + ); }, }); diff --git a/Commands/ticket.js b/Commands/ticket.js index 83de1b1..636fd5a 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -3,7 +3,12 @@ const fs = require("fs"); -const Discord = require("discord.js"); +const { + MessageEmbed, + Permissions, + MessageButton, + MessageActionRow, +} = require("discord.js"); const yaml = require("js-yaml"); const supportbot = yaml.load( fs.readFileSync("./Configs/supportbot.yml", "utf8") @@ -61,7 +66,7 @@ module.exports = new Command({ const TicketSubject = interaction.options?.getString("reason") || supportbot.NoTicketSubject; - const TicketExists = new Discord.MessageEmbed() + const TicketExists = new MessageEmbed() .setTitle("Ticket Exists!") .setDescription(`${supportbot.TicketExists}`) .setColor(supportbot.WarningColour); @@ -104,19 +109,45 @@ module.exports = new Command({ ephemeral: true, }); const Author = interaction.user; - const Everyone = interaction.guild.id; + let TicketCategory = interaction.guild.channels.cache.find( + (category) => + category.name === supportbot.TicketCategory || + category.id === supportbot.TicketCategory + ); const ticketChannel = await interaction.guild.channels.create( `${supportbot.TicketPrefix}${ticketNumberID}`, { type: "GUILD_TEXT", + parent: TicketCategory.id, + permissionOverwrites: [ + { + id: Admins.id, + allow: [Permissions.FLAGS.VIEW_CHANNEL], + }, + { + id: Author.id, + allow: [Permissions.FLAGS.VIEW_CHANNEL], + deny: [Permissions.FLAGS.SEND_MESSAGES], + }, + { + id: interaction.guild.id, + deny: [Permissions.FLAGS.VIEW_CHANNEL], + }, + ], } ); + if (supportbot.AllowStaff) { + ticketChannel.permissionOverwrites.edit(Staff.id, { + VIEW_CHANNEL: true, + }); + } await TicketData.tickets.push({ id: ticketChannel.id, name: ticketChannel.name, user: Author.id, number: ticketNumberID, reason: TicketSubject, + subUsers: [], }); fs.writeFileSync( "./Data/TicketData.json", @@ -126,62 +157,23 @@ module.exports = new Command({ } ); - if ( - interaction.channel.name === supportbot.ReactionChannel || - interaction.channel.id === supportbot.ReactionChannel - ) { - const CreatedTicket = new Discord.MessageEmbed() - .setDescription( - supportbot.TicketCreatedAlert.replace( - /%ticketauthor%/g, - interaction.user.id - ) - .replace(/%ticketid%/g, ticketChannel.id) - .replace(/%ticketusername%/g, interaction.user.username) + const CreatedTicket = new MessageEmbed() + .setDescription( + supportbot.TicketCreatedAlert.replace( + /%ticketauthor%/g, + interaction.user.id ) - .setColor(supportbot.EmbedColour); - await interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); - } else { - const CreatedTicket = new Discord.MessageEmbed() - .setDescription( - supportbot.TicketCreatedAlert.replace( - /%ticketauthor%/g, - interaction.user.id - ) - .replace(/%ticketid%/g, ticketChannel.id) - .replace(/%ticketusername%/g, interaction.user.username) - ) - .setColor(supportbot.EmbedColour); - await interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); - } - let AllowArr = [Staff, Staff, Admins, Author]; - await asyncForEach(AllowArr, async (index) => { - await ticketChannel.permissionOverwrites.create(index, { - VIEW_CHANNEL: true, - }); - }); - - let DenyArr = [Everyone]; - await asyncForEach(DenyArr, async (index) => { - await ticketChannel.permissionOverwrites.create(index, { - VIEW_CHANNEL: false, - }); - }); - - let TicketCategory = interaction.guild.channels.cache.find( - (category) => - category.name === supportbot.TicketCategory || - category.id === supportbot.TicketCategory - ); - if (TicketCategory) { - await ticketChannel.setParent(TicketCategory.id); - } + .replace(/%ticketid%/g, ticketChannel.id) + .replace(/%ticketusername%/g, interaction.user.username) + ) + .setColor(supportbot.EmbedColour); + await interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); if (supportbot.AllowTicketMentions) { await ticketChannel.send({ content: `${interaction.user}` }); } - const TicketMessage = new Discord.MessageEmbed() + const TicketMessage = new MessageEmbed() .setTitle( supportbot.Ticket_Title.replace(/%ticketauthor%/g, interaction.user.id) .replace(/%ticketid%/g, ticketChannel.id) @@ -214,160 +206,97 @@ module.exports = new Command({ value: ` **${supportbot.DepartmentTitle_1}**\n **${supportbot.DepartmentTitle_2}**\n **${supportbot.DepartmentTitle_3}**`, }); } - const CloseButton = new Discord.MessageButton() + const CloseButton = new MessageButton() .setCustomId("ticketclose") .setLabel("Close") .setStyle(supportbot.TicketCloseColour) .setEmoji(supportbot.TicketCloseEmoji); - const LockButton = new Discord.MessageButton() + const LockButton = new MessageButton() .setCustomId("ticketlock") .setLabel("Lock") .setStyle(supportbot.TicketLockColour) .setEmoji(supportbot.TicketLockEmoji); - const row2 = new Discord.MessageActionRow().addComponents( - CloseButton, - LockButton - ); + const row2 = new MessageActionRow().addComponents(CloseButton, LockButton); if (supportbot.TicketDepartments) { - let DenyArr = [DeptRole1, DeptRole2, DeptRole3]; - await asyncForEach(DenyArr, (index) => { - ticketChannel.permissionOverwrites.create(index, { - VIEW_CHANNEL: false, - }); - }); - const Department1Button = new Discord.MessageButton() - .setCustomId("Department1") - .setLabel(supportbot.DepartmentTitle_1) - .setStyle(supportbot.TicketDept1Colour) - .setEmoji(supportbot.TicketDept1Emoji); + try { + const Department1Button = new MessageButton() + .setCustomId("Department1") + .setLabel(supportbot.DepartmentTitle_1) + .setStyle(supportbot.TicketDept1Colour) + .setEmoji(supportbot.TicketDept1Emoji); - const Department2Button = new Discord.MessageButton() - .setCustomId("Department2") - .setLabel(supportbot.DepartmentTitle_2) - .setStyle(supportbot.TicketDept2Colour) - .setEmoji(supportbot.TicketDept2Emoji); + const Department2Button = new MessageButton() + .setCustomId("Department2") + .setLabel(supportbot.DepartmentTitle_2) + .setStyle(supportbot.TicketDept2Colour) + .setEmoji(supportbot.TicketDept2Emoji); - const Department3Button = new Discord.MessageButton() - .setCustomId("Department3") - .setLabel(supportbot.DepartmentTitle_3) - .setStyle(supportbot.TicketDept3Colour) - .setEmoji(supportbot.TicketDept3Emoji); + const Department3Button = new MessageButton() + .setCustomId("Department3") + .setLabel(supportbot.DepartmentTitle_3) + .setStyle(supportbot.TicketDept3Colour) + .setEmoji(supportbot.TicketDept3Emoji); - const row = new Discord.MessageActionRow().addComponents( - Department1Button, - Department2Button, - Department3Button - ); + const row = new MessageActionRow().addComponents( + Department1Button, + Department2Button, + Department3Button + ); - const m = await ticketChannel.send({ - embeds: [TicketMessage], - components: [row], - }); - - const filter = (i) => i.user.id === interaction.user.id; - const collector = await m.awaitMessageComponent({ - filter, - max: 1, - componentType: "BUTTON", - time: 60000, - }); - await collector.deferUpdate(); - - if (collector.customId === "Department1") { - await ticketChannel.permissionOverwrites.edit(DeptRole1, { - VIEW_CHANNEL: true, - READ_MESSAGE_HISTORY: true, - SEND_MESSAGES: true, - }); - - if (!supportbot.AllowStaff) { - await ticketChannel.permissionOverwrites.edit(Staff, { - VIEW_CHANNEL: false, - READ_MESSAGE_HISTORY: false, - SEND_MESSAGES: false, - }); - } - - const Department1 = new Discord.MessageEmbed() - .setDescription( - `> Thank for reaching out to the **${supportbot.DepartmentTitle_1} Department**. Please provide us information regarding your query.` - ) - .setColor(supportbot.EmbedColour); - await ticketChannel.send({ embeds: [Department1] }); - - if (supportbot.AllowTicketMentions) { - await ticketChannel.send({ content: `@here` }); - } - } - await collector.message.edit({ - embeds: [TicketMessage], - components: [row2], - }); - - if (collector.customId === "Department2") { - await ticketChannel.permissionOverwrites.edit(DeptRole2, { - VIEW_CHANNEL: true, - READ_MESSAGE_HISTORY: true, - SEND_MESSAGES: true, - }); - - if (!supportbot.AllowStaff) { - await ticketChannel.permissionOverwrites.edit(Staff, { - VIEW_CHANNEL: false, - READ_MESSAGE_HISTORY: false, - SEND_MESSAGES: false, - }); - } - - const Department2 = new Discord.MessageEmbed() - .setDescription( - `> Thank for reaching out to the **${supportbot.DepartmentTitle_2} Department**. Please provide us information regarding your query.` - ) - .setColor(supportbot.EmbedColour); - await ticketChannel.send({ embeds: [Department2] }); - - if (supportbot.AllowTicketMentions) { - await ticketChannel.send({ content: `@here` }); - } - - await collector.message.edit({ + const m = await ticketChannel.send({ embeds: [TicketMessage], - components: [row2], + components: [row], }); - } - if (collector.customId === "Department3") { - await ticketChannel.permissionOverwrites.edit(DeptRole3, { + + const filter = (i) => i.user.id === interaction.user.id; + const collector = await m.awaitMessageComponent({ + filter, + max: 1, + componentType: "BUTTON", + time: 60000, + }); + let role; + let title; + if (collector.customId === "Department1") { + role = DeptRole1; + title = supportbot.DepartmentTitle_1; + } + if (collector.customId === "Department2") { + role = DeptRole2; + title = supportbot.DepartmentTitle_2; + } + if (collector.customId === "Department3") { + role = DeptRole3; + title = supportbot.DepartmentTitle_3; + } + + ticketChannel.permissionOverwrites.edit(role.id, { VIEW_CHANNEL: true, - READ_MESSAGE_HISTORY: true, + }); + ticketChannel.permissionOverwrites.edit(Author.id, { SEND_MESSAGES: true, }); - if (!supportbot.AllowStaff) { - await ticketChannel.permissionOverwrites.edit(Staff, { - VIEW_CHANNEL: false, - READ_MESSAGE_HISTORY: false, - SEND_MESSAGES: false, - }); - } - - const Department3 = new Discord.MessageEmbed() - .setDescription( - `> Thank for reaching out to the **${supportbot.DepartmentTitle_3} Department**. Please provide us information regarding your query.` - ) - .setColor(supportbot.EmbedColour); - await ticketChannel.send({ embeds: [Department3] }); + await collector.reply({ + embeds: [ + { + description: `> Thank for reaching out to the **${title} Department**. Please provide us information regarding your query.`, + color: supportbot.EmbedColour, + }, + ], + }); if (supportbot.AllowTicketMentions) { - await ticketChannel.send({ content: `@here` }); + await ticketChannel.send({ content: "@here" }); } await collector.message.edit({ embeds: [TicketMessage], components: [row2], }); - } + } catch (error) {} } else { await ticketChannel.send({ embeds: [TicketMessage], components: [row2] }); } From 2c7be5882c6ceba2ea26c3ee69b8ed5d4c65cf56 Mon Sep 17 00:00:00 2001 From: Noah Date: Wed, 15 Dec 2021 00:19:40 -0600 Subject: [PATCH 43/53] Added getRole, getChannel, getCategory functions --- Commands/add.js | 22 ++++----------- Commands/close.js | 26 +++++++++--------- Commands/embed.js | 16 ++++------- Commands/help.js | 16 ++++------- Commands/remove.js | 18 +++++-------- Commands/suggest.js | 8 +++--- Commands/ticket.js | 64 +++++++++++++++----------------------------- Events/ready.js | 27 +++++++++++++------ Structures/Client.js | 20 +++++++++++++- 9 files changed, 97 insertions(+), 120 deletions(-) diff --git a/Commands/add.js b/Commands/add.js index 1b5546f..3629b83 100644 --- a/Commands/add.js +++ b/Commands/add.js @@ -12,12 +12,6 @@ const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8")); const Command = require("../Structures/Command.js"); -async function asyncForEach(array, callback) { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index, array); - } -} - module.exports = new Command({ name: cmdconfig.TicketAdd, description: cmdconfig.TicketAddDesc, @@ -32,16 +26,10 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = interaction.guild.roles.cache.find( - (SupportTeam) => - SupportTeam.name == supportbot.Staff || - SupportTeam.id == supportbot.Staff - ); - let Admins = interaction.guild.roles.cache.find( - (AdminUser) => - AdminUser.name == supportbot.Admin || AdminUser.id == supportbot.Admin - ); - if (!SupportStaff || !Admins) + const { getRole, getChannel, getCategory } = interaction.client; + let SupportStaff = await getRole(supportbot.Staff, interaction.guild); + let Admin = await getRole(supportbot.Admin, interaction.guild); + if (!SupportStaff || !Admin) return interaction.reply( "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); @@ -55,7 +43,7 @@ module.exports = new Command({ if ( !interaction.member.roles.cache.has(SupportStaff.id) || - !interaction.member.roles.cache.has(Admins.id) + !interaction.member.roles.cache.has(Admin.id) ) return interaction.reply({ embeds: [NoPerms] }); diff --git a/Commands/close.js b/Commands/close.js index 2aed553..0c2b724 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -25,6 +25,7 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { + const { getRole, getChannel, getCategory } = interaction.client; await interaction.deferReply(); let TicketData = await JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") @@ -37,16 +38,11 @@ module.exports = new Command({ return interaction.followUp({ embeds: [Exists] }); } let tUser = interaction.client.users.cache.get(TicketData.user); - let transcriptChannel = await interaction.guild.channels.cache.find( - (channel) => - channel.name == supportbot.TranscriptLog || - channel.id == supportbot.TranscriptLog - ); - let logChannel = await interaction.guild.channels.cache.find( - (channel) => - channel.name == supportbot.TicketLog || - channel.id == supportbot.TicketLog + let transcriptChannel = await getChannel( + supportbot.TranscriptLog, + interaction.guild ); + let logChannel = await getChannel(supportbot.TicketLog, interaction.guild); let reason = (await interaction.options?.getString("reason")) || "No Reason Provided."; @@ -135,11 +131,13 @@ module.exports = new Command({ .catch(async (err) => { console.error(err); }); - TicketData.subUsers.forEach(async (subUser) => { - interaction.client.users.cache - .get(subUser) - .send({ embeds: [transcriptEmbed], files: [file] }); - }); + if (TicketData.subUsers) { + TicketData.subUsers.forEach(async (subUser) => { + interaction.client.users.cache + .get(subUser) + .send({ embeds: [transcriptEmbed], files: [file] }); + }); + } await interaction.channel.delete().catch(async (error) => { console.error(error); if (error.code !== Discord.Constants.APIErrors.UNKNOWN_CHANNEL) { diff --git a/Commands/embed.js b/Commands/embed.js index 278a777..62aeaf1 100644 --- a/Commands/embed.js +++ b/Commands/embed.js @@ -31,17 +31,11 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = interaction.guild.roles.cache.find( - (SupportTeam) => - SupportTeam.name === supportbot.Staff || - SupportTeam.id === supportbot.Staff - ); - let Admins = interaction.guild.roles.cache.find( - (AdminUser) => - AdminUser.name === supportbot.Admin || AdminUser.id === supportbot.Admin - ); + const { getRole, getChannel, getCategory } = interaction.client; + let SupportStaff = await getRole(supportbot.Staff, interaction.guild); + let Admin = await getRole(supportbot.Admin, interaction.guild); - if (!SupportStaff || !Admins) + if (!SupportStaff || !Admin) return interaction.reply( "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); @@ -54,7 +48,7 @@ module.exports = new Command({ if ( interaction.member.roles.cache.has(SupportStaff.id) || - interaction.member.roles.cache.has(Admins.id) + interaction.member.roles.cache.has(Admin.id) ) { const EmbedTitle = interaction.options.getString("title"); const EmbedSubject = interaction.options.getString("message"); diff --git a/Commands/help.js b/Commands/help.js index 2ed6624..9de6870 100644 --- a/Commands/help.js +++ b/Commands/help.js @@ -25,16 +25,10 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = interaction.guild.roles.cache.find( - (SupportTeam) => - SupportTeam.name === supportbot.Staff || - SupportTeam.id === supportbot.Staff - ); - let Admins = interaction.guild.roles.cache.find( - (AdminUser) => - AdminUser.name === supportbot.Admin || AdminUser.id === supportbot.Admin - ); - if (!SupportStaff || !Admins) + const { getRole, getChannel, getCategory } = interaction.client; + let SupportStaff = await getRole(supportbot.Staff, interaction.guild); + let Admin = await getRole(supportbot.Admin, interaction.guild); + if (!SupportStaff || !Admin) return interaction.reply( "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); @@ -74,7 +68,7 @@ module.exports = new Command({ if ( interaction.member.roles.cache.has(SupportStaff.id) || - interaction.member.roles.cache.has(Admins.id) + interaction.member.roles.cache.has(Admin.id) ) { HelpEmbed1.addFields({ name: "🔐 Staff Commands\n", diff --git a/Commands/remove.js b/Commands/remove.js index de144d4..14c17b9 100644 --- a/Commands/remove.js +++ b/Commands/remove.js @@ -32,16 +32,10 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - let SupportStaff = interaction.guild.roles.cache.find( - (SupportTeam) => - SupportTeam.name == supportbot.Staff || - SupportTeam.id == supportbot.Staff - ); - let Admins = interaction.guild.roles.cache.find( - (AdminUser) => - AdminUser.name == supportbot.Admin || AdminUser.id == supportbot.Admin - ); - if (!SupportStaff || !Admins) + const { getRole, getChannel, getCategory } = interaction.client; + let Staff = await getRole(supportbot.Staff, interaction.guild); + let Admin = await getRole(supportbot.Admin, interaction.guild); + if (!Staff || !Admin) return interaction.reply( "Some roles seem to be missing!\nPlease check for errors when starting the bot." ); @@ -54,8 +48,8 @@ module.exports = new Command({ .setColor(supportbot.WarningColour); if ( - !interaction.member.roles.cache.has(SupportStaff.id) || - !interaction.member.roles.cache.has(Admins.id) + !interaction.member.roles.cache.has(Staff.id) || + !interaction.member.roles.cache.has(Admin.id) ) return interaction.reply({ embeds: [NoPerms] }); let TicketData = await JSON.parse( diff --git a/Commands/suggest.js b/Commands/suggest.js index f06db63..5182999 100644 --- a/Commands/suggest.js +++ b/Commands/suggest.js @@ -25,10 +25,10 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { - const suggestChannel = interaction.guild.channels.cache.find( - (channel) => - channel.name === supportbot.SuggestionChannel || - channel.id === supportbot.SuggestionChannel + const { getRole, getChannel, getCategory } = interaction.client; + const suggestChannel = await getChannel( + supportbot.SuggestionChannel, + interaction.guild ); const NoChannel = new Discord.MessageEmbed() diff --git a/Commands/ticket.js b/Commands/ticket.js index 636fd5a..384fa00 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -18,12 +18,6 @@ const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8")); const Command = require("../Structures/Command.js"); const TicketNumberID = require("../Structures/TicketID.js"); -async function asyncForEach(array, callback) { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index, array); - } -} - module.exports = new Command({ name: cmdconfig.OpenTicket, description: cmdconfig.OpenTicketDesc, @@ -37,19 +31,16 @@ module.exports = new Command({ permission: "SEND_MESSAGES", async run(interaction) { + const { getRole, getChannel, getCategory } = interaction.client; let reactionUser = interaction.guild.members.cache.get(interaction.user.id); if ( - reactionUser.roles.cache.find( - (role) => - role.name == supportbot.TicketBlackListRole || - role.id == supportbot.TicketBlackListRole + reactionUser.roles.cache.has( + getRole(supportbot.TicketBlackListRole, interaction.guild).id ) ) { return interaction - .reply({ - content: `<@${interaction.user.id}> ${supportbot.TicketBlackListMessage}`, - }) + .reply(supportbot.TicketBlackListMessage) .then((msg) => { setTimeout(() => msg.delete(), 3500); }); @@ -78,41 +69,30 @@ module.exports = new Command({ ) { return await interaction.reply({ embeds: [TicketExists] }); } - const Staff = interaction.guild.roles.cache.find( - (SupportTeam) => - SupportTeam.name === supportbot.Staff || - SupportTeam.id === supportbot.Staff + const Staff = await getRole(supportbot.Staff, interaction.guild); + const Admin = await getRole(supportbot.Admin, interaction.guild); + const DeptRole1 = await getRole( + supportbot.DepartmentRole_1, + interaction.guild ); - const Admins = interaction.guild.roles.cache.find( - (AdminUser) => - AdminUser.name === supportbot.Admin || AdminUser.id === supportbot.Admin + const DeptRole2 = await getRole( + supportbot.DepartmentRole_2, + interaction.guild ); - const DeptRole1 = interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.name === supportbot.DepartmentRole_1 || - DepartmentRole.id === supportbot.DepartmentRole_1 + const DeptRole3 = await getRole( + supportbot.DepartmentRole_3, + interaction.guild ); - const DeptRole2 = interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.name === supportbot.DepartmentRole_2 || - DepartmentRole.id === supportbot.DepartmentRole_2 - ); - const DeptRole3 = interaction.guild.roles.cache.find( - (DepartmentRole) => - DepartmentRole.name === supportbot.DepartmentRole_3 || - DepartmentRole.id === supportbot.DepartmentRole_3 - ); - if (!Staff || !Admins || !DeptRole1 || !DeptRole2 || !DeptRole3) + if (!Staff || !Admin || !DeptRole1 || !DeptRole2 || !DeptRole3) return interaction.reply({ content: "Some roles seem to be missing!\nPlease check for errors when starting the bot.", ephemeral: true, }); const Author = interaction.user; - let TicketCategory = interaction.guild.channels.cache.find( - (category) => - category.name === supportbot.TicketCategory || - category.id === supportbot.TicketCategory + let TicketCategory = await getCategory( + supportbot.TicketCategory, + interaction.guild ); const ticketChannel = await interaction.guild.channels.create( `${supportbot.TicketPrefix}${ticketNumberID}`, @@ -121,7 +101,7 @@ module.exports = new Command({ parent: TicketCategory.id, permissionOverwrites: [ { - id: Admins.id, + id: Admin.id, allow: [Permissions.FLAGS.VIEW_CHANNEL], }, { @@ -170,7 +150,7 @@ module.exports = new Command({ await interaction.reply({ embeds: [CreatedTicket], ephemeral: true }); if (supportbot.AllowTicketMentions) { - await ticketChannel.send({ content: `${interaction.user}` }); + await ticketChannel.send(`${interaction.user}`); } const TicketMessage = new MessageEmbed() @@ -290,7 +270,7 @@ module.exports = new Command({ }); if (supportbot.AllowTicketMentions) { - await ticketChannel.send({ content: "@here" }); + await ticketChannel.send("@here"); } await collector.message.edit({ embeds: [TicketMessage], diff --git a/Events/ready.js b/Events/ready.js index bbf436d..9c304bc 100644 --- a/Events/ready.js +++ b/Events/ready.js @@ -15,6 +15,7 @@ const panelconfig = yaml.load( const Event = require("../Structures/Event.js"); module.exports = new Event("ready", async (client) => { + const { getRole, getChannel, getCategory } = client; client.user.setActivity(supportbot.BotActivity, { type: supportbot.ActivityType, url: supportbot.StreamingURL, @@ -92,21 +93,23 @@ module.exports = new Event("ready", async (client) => { supportbot.TranscriptLog, panelconfig.Channel, ]; - const missingR = []; - const missingC = []; + const categories = [supportbot.TicketCategory]; + const missingC = []; + const missingR = []; + const missingCat = []; for (let c of channels) { - const find = await client.channels.cache.find( - (channel) => channel.name === c || channel.id === c - ); + const find = await getChannel(c, client.guilds.cache.first()); if (!find) missingC.push(c); } for (let r of roles) { - const find = await client.guilds.cache - .first() - .roles.cache.find((role) => role.name === r || role.id === r); + const find = await getRole(r, client.guilds.cache.first()); if (!find) missingR.push(r); } + for (let cat of categories) { + const find = await getCategory(cat, client.guilds.cache.first()); + if (!find) missingCat.push(cat); + } if (missingR.length > 0) { console.log( @@ -125,6 +128,14 @@ module.exports = new Event("ready", async (client) => { )}` ); } + if (missingCat.length > 0) { + console.log( + "\u001b[33m", + `[WARN] The following Categories could not be found! Please check your configs!\n${missingCat.join( + ", " + )}` + ); + } if (panelconfig.TicketPanel) { let chan1 = client.channels.cache.find( (channel) => channel.name === panelconfig.Channel diff --git a/Structures/Client.js b/Structures/Client.js index fbb847e..f12cb87 100644 --- a/Structures/Client.js +++ b/Structures/Client.js @@ -19,6 +19,25 @@ class Client extends Discord.Client { this.commands = new Discord.Collection(); } + async getChannel(channel, guild) { + return guild.channels.cache.find( + (c) => + (c.type === "GUILD_TEXT" || c.type === "GUILD_NEWS") && + (c.id === channel || c.name.toLowerCase() === channel.toLowerCase()) + ); + } + async getRole(role, guild) { + return guild.roles.cache.find( + (r) => r.id === role || r.name.toLowerCase() === role.toLowerCase() + ); + } + async getCategory(category, guild) { + return guild.channels.cache.find( + (c) => + c.type === "GUILD_CATEGORY" && + (c.id === category || c.name.toLowerCase() === category.toLowerCase()) + ); + } start(token) { const commandFiles = fs @@ -73,7 +92,6 @@ class Client extends Discord.Client { })); this.removeAllListeners(); - this.on("ready", async () => { const allCommands = slashCommands.concat(slashCommands1); await this.application?.commands.set(allCommands, supportbot.Guild); From f7a4c7b6163e12f16e0658f7b6bd41a0215f0076 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 18:56:02 -0600 Subject: [PATCH 44/53] rename var + remove unused code --- Structures/Event.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/Structures/Event.js b/Structures/Event.js index 61e4381..d644b72 100644 --- a/Structures/Event.js +++ b/Structures/Event.js @@ -1,21 +1,9 @@ // SupportBot | Emerald Services // Event Structure - -const fs = require("fs"); - -const Discord = require("discord.js"); - -const yaml = require("js-yaml"); -const supportbot = yaml.load( - fs.readFileSync("./Configs/supportbot.yml", "utf8") -); - -function RunFunction(client, ...eventArgs) {} - class Event { - constructor(event, runFunction) { + constructor(event, run) { this.event = event; - this.run = runFunction; + this.run = run; } } From bc649caa99d667b896598afba7fb18f1cb205bf0 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 18:56:25 -0600 Subject: [PATCH 45/53] remove unused code --- Structures/TicketID.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Structures/TicketID.js b/Structures/TicketID.js index 6725b8c..4e5bb24 100644 --- a/Structures/TicketID.js +++ b/Structures/TicketID.js @@ -3,16 +3,6 @@ const fs = require("fs"); -const Discord = require("discord.js"); -const Command = require("./Command.js"); -const Client = require("./Client.js"); -const Event = require("./Event.js"); - -const yaml = require("js-yaml"); -const supportbot = yaml.load( - fs.readFileSync("./Configs/supportbot.yml", "utf8") -); - class TicketNumberID { static async pad() { let n = this.get() + ""; From 4e554b8bee83f3cb0028f614e6a1865f7623a352 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 18:57:26 -0600 Subject: [PATCH 46/53] rename slashCommandOptions to options, and permission to permissions --- Commands/add.js | 4 ++-- Commands/close.js | 4 ++-- Commands/embed.js | 4 ++-- Commands/help.js | 4 ++-- Commands/info.js | 4 ++-- Commands/ping.js | 4 ++-- Commands/remove.js | 4 ++-- Commands/suggest.js | 4 ++-- Commands/ticket.js | 4 ++-- Structures/Command.js | 12 +++--------- 10 files changed, 21 insertions(+), 27 deletions(-) diff --git a/Commands/add.js b/Commands/add.js index 3629b83..1a3d65a 100644 --- a/Commands/add.js +++ b/Commands/add.js @@ -15,7 +15,7 @@ const Command = require("../Structures/Command.js"); module.exports = new Command({ name: cmdconfig.TicketAdd, description: cmdconfig.TicketAddDesc, - slashCommandOptions: [ + options: [ { name: "user", description: "User to add", @@ -23,7 +23,7 @@ module.exports = new Command({ required: true, }, ], - permission: "SEND_MESSAGES", + permissions: ["SEND_MESSAGES"], async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; diff --git a/Commands/close.js b/Commands/close.js index 0c2b724..c7f7c67 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -15,14 +15,14 @@ const Command = require("../Structures/Command.js"); module.exports = new Command({ name: cmdconfig.CloseTicket, description: cmdconfig.CloseTicketDesc, - slashCommandOptions: [ + options: [ { name: "reason", description: "Ticket Close Reason", type: "STRING", }, ], - permission: "SEND_MESSAGES", + permissions: ["SEND_MESSAGES"], async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; diff --git a/Commands/embed.js b/Commands/embed.js index 62aeaf1..c9083ff 100644 --- a/Commands/embed.js +++ b/Commands/embed.js @@ -15,7 +15,7 @@ const Command = require("../Structures/Command.js"); module.exports = new Command({ name: cmdconfig.EmbedCommand, description: cmdconfig.EmbedCommandDesc, - slashCommandOptions: [ + options: [ { name: "title", description: "Embed Title", @@ -28,7 +28,7 @@ module.exports = new Command({ type: "STRING", }, ], - permission: "SEND_MESSAGES", + permissions: ["SEND_MESSAGES"], async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; diff --git a/Commands/help.js b/Commands/help.js index 9de6870..9b3e595 100644 --- a/Commands/help.js +++ b/Commands/help.js @@ -21,8 +21,8 @@ async function asyncForEach(array, callback) { module.exports = new Command({ name: cmdconfig.HelpCommand, description: cmdconfig.HelpCommandDesc, - slashCommandOptions: [], - permission: "SEND_MESSAGES", + options: [], + permissions: ["SEND_MESSAGES"], async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; diff --git a/Commands/info.js b/Commands/info.js index b93dcf9..51ad789 100644 --- a/Commands/info.js +++ b/Commands/info.js @@ -15,8 +15,8 @@ const Command = require("../Structures/Command.js"); module.exports = new Command({ name: cmdconfig.InfoCommand, description: cmdconfig.InfoCommandDesc, - slashCommandOptions: [], - permission: "SEND_MESSAGES", + options: [], + permissions: ["SEND_MESSAGES"], async run(interaction) { const InfoButton = new Discord.MessageButton() diff --git a/Commands/ping.js b/Commands/ping.js index edf812d..74637bb 100644 --- a/Commands/ping.js +++ b/Commands/ping.js @@ -15,8 +15,8 @@ const Command = require("../Structures/Command.js"); module.exports = new Command({ name: cmdconfig.PingCommand, description: cmdconfig.PingCommandDesc, - slashCommandOptions: [], - permission: "SEND_MESSAGES", + options: [], + permissions: ["SEND_MESSAGES"], async run(interaction) { const PingEmbed = new Discord.MessageEmbed() diff --git a/Commands/remove.js b/Commands/remove.js index 14c17b9..def341c 100644 --- a/Commands/remove.js +++ b/Commands/remove.js @@ -21,7 +21,7 @@ async function asyncForEach(array, callback) { module.exports = new Command({ name: cmdconfig.TicketRemove, description: cmdconfig.TicketRemoveDesc, - slashCommandOptions: [ + options: [ { name: "user", description: "User to remove", @@ -29,7 +29,7 @@ module.exports = new Command({ required: true, }, ], - permission: "SEND_MESSAGES", + permissions: ["SEND_MESSAGES"], async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; diff --git a/Commands/suggest.js b/Commands/suggest.js index 5182999..e29ac30 100644 --- a/Commands/suggest.js +++ b/Commands/suggest.js @@ -15,14 +15,14 @@ const Command = require("../Structures/Command.js"); module.exports = new Command({ name: cmdconfig.SuggestCommand, description: cmdconfig.SuggestCommandDesc, - slashCommandOptions: [ + options: [ { name: "suggestion", description: "Create a Suggestion", type: "STRING", }, ], - permission: "SEND_MESSAGES", + permissions: ["SEND_MESSAGES"], async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; diff --git a/Commands/ticket.js b/Commands/ticket.js index 384fa00..03a9289 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -21,14 +21,14 @@ const TicketNumberID = require("../Structures/TicketID.js"); module.exports = new Command({ name: cmdconfig.OpenTicket, description: cmdconfig.OpenTicketDesc, - slashCommandOptions: [ + options: [ { name: "reason", description: "Ticket Reason", type: "STRING", }, ], - permission: "SEND_MESSAGES", + permissions: ["SEND_MESSAGES"], async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; diff --git a/Structures/Command.js b/Structures/Command.js index ba663b5..1dfaffe 100644 --- a/Structures/Command.js +++ b/Structures/Command.js @@ -3,22 +3,16 @@ const fs = require("fs"); -const Discord = require("discord.js"); - const yaml = require("js-yaml"); -const supportbot = yaml.load( - fs.readFileSync("./Configs/supportbot.yml", "utf8") -); - -function RunFunction(interaction) {} class Command { constructor(options) { this.name = options.name; this.description = options.description; - this.permission = options.permission; - this.slashCommandOptions = options.slashCommandOptions || []; + this.permissions = options.permissions; + this.options = options.options || []; this.run = options.run; + this.defaultPermission = true; } } From e507176d394a7a36b046d151babae8d75a736c5f Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 18:57:45 -0600 Subject: [PATCH 47/53] New addon handler --- Addons/hello.js | 46 +++++++++++++++++----------- Structures/Addon.js | 21 +++++++++++++ Structures/Addons.js | 25 --------------- Structures/Client.js | 73 +++++++++++++++----------------------------- 4 files changed, 74 insertions(+), 91 deletions(-) create mode 100644 Structures/Addon.js delete mode 100644 Structures/Addons.js diff --git a/Addons/hello.js b/Addons/hello.js index 692eff3..3d696f5 100644 --- a/Addons/hello.js +++ b/Addons/hello.js @@ -11,23 +11,35 @@ const supportbot = yaml.load( const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8")); // Your Addon Config file! Saved in /Addons/Configs/YourAddonConfig.yml -// const exampleaddon = yaml.load(fs.readFileSync('./Addons/Configs/YourAddonConfig.yml', 'utf8')); +// const config = yaml.load(fs.readFileSync('./Addons/Configs/YourAddonConfig.yml', 'utf8')); -const Command = require("../Structures/Command.js"); +const { Command, Event } = require("../Structures/Addon"); -module.exports = new Command({ - name: "hello", - description: "hello", - slashCommandOptions: [], - permission: "SEND_MESSAGES", +module.exports.commands = [ + /* + // EXAMPLE COMMAND + new Command({ + name: "hello", + description: "hello", + options: [], + permissions: ["SEND_MESSAGES"], + async run(interaction) { + const Embed = new Discord.MessageEmbed() + .setDescription("Hello World!") + .setColor(supportbot.InfoColour); - async run(interaction) { - const Embed = new Discord.MessageEmbed() - .setDescription("Hello World!") - .setColor(supportbot.InfoColour); - - interaction.reply({ - embeds: [Embed], - }); - }, -}); + interaction.reply({ + embeds: [Embed], + }); + }, + }), + */ +]; +module.exports.events = [ + /* + // EXAMPLE EVENT + new Event("ready", async (client) => { + console.log("Bot started!"); + }), + */ +]; diff --git a/Structures/Addon.js b/Structures/Addon.js new file mode 100644 index 0000000..a64b4ae --- /dev/null +++ b/Structures/Addon.js @@ -0,0 +1,21 @@ +// SupportBot | Emerald Services +// Addon Structure + +class Command { + constructor(options) { + this.name = options.name; + this.description = options.description; + this.permissions = options.permissions; + this.options = options.options || []; + this.run = options.run; + this.defaultPermission = true; + } +} +class Event { + constructor(event, run) { + this.event = event; + this.run = run; + } +} + +module.exports = { Command, Event }; diff --git a/Structures/Addons.js b/Structures/Addons.js deleted file mode 100644 index 95b24f7..0000000 --- a/Structures/Addons.js +++ /dev/null @@ -1,25 +0,0 @@ -// SupportBot | Emerald Services -// Addon Structure - -const fs = require("fs"); - -const Discord = require("discord.js"); - -const yaml = require("js-yaml"); -const supportbot = yaml.load( - fs.readFileSync("./Configs/supportbot.yml", "utf8") -); - -function RunFunction(interaction) {} - -class Addon { - constructor(options) { - this.name = options.name; - this.description = options.description; - this.permission = options.permission; - this.slashCommandOptions = options.slashCommandOptions || []; - this.run = options.run; - } -} - -module.exports = Addon; diff --git a/Structures/Client.js b/Structures/Client.js index f12cb87..a0db27f 100644 --- a/Structures/Client.js +++ b/Structures/Client.js @@ -4,8 +4,6 @@ const fs = require("fs"); const Discord = require("discord.js"); -const Command = require("./Command.js"); -const Event = require("./Event.js"); const intents = new Discord.Intents(32767); const yaml = require("js-yaml"); @@ -48,10 +46,15 @@ class Client extends Discord.Client { .readdirSync("./Addons") .filter((file) => file.endsWith(".js")); - const addons = addonFiles.map((file) => require(`../Addons/${file}`)); + const addons = addonFiles.map((file) => { + let addon = require(`../Addons/${file}`); + addon.name = file.split(".")[0]; + return addon; + }); const commands = commandFiles.map((file) => require(`../Commands/${file}`)); + // Commands console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Commands ▬▬▬▬▬▬▬"); commands.forEach((cmd) => { @@ -59,6 +62,11 @@ class Client extends Discord.Client { this.commands.set(cmd.name, cmd); }); + console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Commands ▬▬▬▬▬▬▬"); + // Addons + console.log(" "); + console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Addons ▬▬▬▬▬▬▬"); + addons.forEach((addon) => { console.log( `\u001b[33m`, @@ -68,55 +76,23 @@ class Client extends Discord.Client { `\u001b[32;1m`, "Loaded" ); - this.commands.set(addon.name, addon); + addon.commands.forEach((command) => { + this.commands.set(command.name, command); + }); + addon.events.forEach((event) => { + this.on(event.event, (...args) => event.run(this, ...args)); + }); }); - console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Commands ▬▬▬▬▬▬▬"); + console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Addons ▬▬▬▬▬▬▬"); // Slash Commands - const slashCommands = commands.map((cmd) => ({ - name: cmd.name.toLowerCase(), - description: cmd.description, - permissions: [], - options: cmd.slashCommandOptions, - defaultPermission: true, - })); - - const slashCommands1 = addons.map((addon) => ({ - name: addon.name.toLowerCase(), - description: addon.description, - permissions: [], - options: addon.slashCommandOptions, - defaultPermission: true, - })); - - this.removeAllListeners(); - this.on("ready", async () => { - const allCommands = slashCommands.concat(slashCommands1); - await this.application?.commands.set(allCommands, supportbot.Guild); - console.log(" "); - console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Slash Commands ▬▬▬▬▬▬▬"), - console.log(" "); - - slashCommands.forEach((cmd) => - console.log( - `\u001b[31;1m`, - `${cmd.name}`, - `\u001b[32;1m`, - `| Slash Command Registered` - ) - ); - - slashCommands1.forEach((addon) => - console.log( - `\u001b[33m`, - `[ADDON]`, - `\u001b[31;1m`, - `${addon.name}`, - `\u001b[32;1m`, - `| Slash Command Registered` - ) + this.once("ready", async () => { + await this.application?.commands.set(this.commands, supportbot.Guild); + console.log( + `\u001b[32;1m`, + `Slash Commands Registered for ${this.guilds.cache.first().name}` ); }); @@ -128,8 +104,7 @@ class Client extends Discord.Client { .forEach((file) => { const event = require(`../Events/${file}`); console.log(`\u001b[31;1m`, `${event.event}`, `\u001b[32;1m`, "Loaded"); - - this.on(event.event, event.run.bind(null, this)); + this.on(event.event, (...args) => event.run(this, ...args)); }); console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Events ▬▬▬▬▬▬▬"); From e83ca8cb2b5882c333957eb49a92267ff41cb074 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 18:58:02 -0600 Subject: [PATCH 48/53] add guild --- Events/guildCreate.js | 2 +- Events/guildDelete.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Events/guildCreate.js b/Events/guildCreate.js index 16bd038..fb1f1b3 100644 --- a/Events/guildCreate.js +++ b/Events/guildCreate.js @@ -1,5 +1,5 @@ const Event = require("../Structures/Event.js"); -module.exports = new Event("guildCreate", async (client) => { +module.exports = new Event("guildCreate", async (client, guild) => { console.log( `\u001b[31m`, `${client.user.username} is not in the correct server set in your config. Please leave all other servers and restart the bot.` diff --git a/Events/guildDelete.js b/Events/guildDelete.js index d3cfbd2..f1b5ca1 100644 --- a/Events/guildDelete.js +++ b/Events/guildDelete.js @@ -1,6 +1,6 @@ const Event = require("../Structures/Event.js"); -module.exports = new Event("guildDelete", async (client) => { +module.exports = new Event("guildDelete", async (client, guild) => { console.log( `\u001b[31m`, `${client.user.username} is not in the correct server set in your config. Please join the server and restart the bot.` From 96ded77becd4f83615311202ece1fa7fb3e54c57 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 19:24:39 -0600 Subject: [PATCH 49/53] Fixed perms bug --- Commands/add.js | 2 +- Commands/remove.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/add.js b/Commands/add.js index 1a3d65a..b011048 100644 --- a/Commands/add.js +++ b/Commands/add.js @@ -42,7 +42,7 @@ module.exports = new Command({ .setColor(supportbot.WarningColour); if ( - !interaction.member.roles.cache.has(SupportStaff.id) || + !interaction.member.roles.cache.has(SupportStaff.id) && !interaction.member.roles.cache.has(Admin.id) ) return interaction.reply({ embeds: [NoPerms] }); diff --git a/Commands/remove.js b/Commands/remove.js index def341c..5084835 100644 --- a/Commands/remove.js +++ b/Commands/remove.js @@ -48,7 +48,7 @@ module.exports = new Command({ .setColor(supportbot.WarningColour); if ( - !interaction.member.roles.cache.has(Staff.id) || + !interaction.member.roles.cache.has(Staff.id) && !interaction.member.roles.cache.has(Admin.id) ) return interaction.reply({ embeds: [NoPerms] }); From 1178a0a611d04338c3d710d6d573e8c88201e11f Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 19:39:59 -0600 Subject: [PATCH 50/53] Add StaffOnly close option --- Commands/close.js | 20 ++++++++++++++++++++ Configs/supportbot.yml | 1 + 2 files changed, 21 insertions(+) diff --git a/Commands/close.js b/Commands/close.js index c7f7c67..22a5718 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -26,6 +26,26 @@ module.exports = new Command({ async run(interaction) { const { getRole, getChannel, getCategory } = interaction.client; + if (supportbot.StaffOnly) { + let SupportStaff = await getRole(supportbot.Staff, interaction.guild); + let Admin = await getRole(supportbot.Admin, interaction.guild); + if (!SupportStaff || !Admin) + return interaction.reply( + "Some roles seem to be missing!\nPlease check for errors when starting the bot." + ); + const NoPerms = new Discord.MessageEmbed() + .setTitle("Invalid Permissions!") + .setDescription( + `${supportbot.IncorrectPerms}\n\nRole Required: \`${supportbot.Staff}\` or \`${supportbot.Admin}\`` + ) + .setColor(supportbot.WarningColour); + + if ( + !interaction.member.roles.cache.has(SupportStaff.id) && + !interaction.member.roles.cache.has(Admin.id) + ) + return interaction.reply({ embeds: [NoPerms] }); + } await interaction.deferReply(); let TicketData = await JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") diff --git a/Configs/supportbot.yml b/Configs/supportbot.yml index 855ea30..bbe5b06 100644 --- a/Configs/supportbot.yml +++ b/Configs/supportbot.yml @@ -179,6 +179,7 @@ DepartmentRole_3: "Admin" # --- Closing Config --- # --- Start --- +StaffOnly: true ClosingTicket: ":warning: You have requested to close your support ticket." ClosingConfirmation_Word: "confirm" CloseConfirmation: false From 33f7675aacbf5262e232865bc7acbb2436ffd6da Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 20:54:01 -0600 Subject: [PATCH 51/53] Added Max Ticket Count + Timeout --- Commands/close.js | 13 ++++++++- Commands/ticket.js | 61 +++++++++++++++++++++++++++++++++--------- Configs/supportbot.yml | 7 ++--- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/Commands/close.js b/Commands/close.js index 22a5718..22a251d 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -47,9 +47,12 @@ module.exports = new Command({ return interaction.reply({ embeds: [NoPerms] }); } await interaction.deferReply(); - let TicketData = await JSON.parse( + let tickets = await JSON.parse( fs.readFileSync("./Data/TicketData.json", "utf8") ).tickets.find((t) => t.id === interaction.channel.id); + let TicketData = await tickets.tickets.findIndex( + (t) => t.id == ticketChannel.id + ); if (!TicketData) { const Exists = new Discord.MessageEmbed() .setTitle("No Ticket Found!") @@ -87,6 +90,14 @@ module.exports = new Command({ }); } try { + tickets.tickets[TicketData].open = false; + fs.writeFileSync( + "./Data/TicketData.json", + JSON.stringify(tickets, null, 4), + (err) => { + if (err) console.error(err); + } + ); await interaction.followUp(`**${supportbot.ClosingTicket}**`); const transcriptEmbed = new Discord.MessageEmbed() .setTitle(supportbot.TranscriptTitle) diff --git a/Commands/ticket.js b/Commands/ticket.js index 03a9289..c7904a4 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -31,11 +31,29 @@ module.exports = new Command({ permissions: ["SEND_MESSAGES"], async run(interaction) { + let TicketData = await JSON.parse( + fs.readFileSync("./Data/TicketData.json", "utf8") + ); const { getRole, getChannel, getCategory } = interaction.client; - let reactionUser = interaction.guild.members.cache.get(interaction.user.id); + let User = interaction.guild.members.cache.get(interaction.user.id); if ( - reactionUser.roles.cache.has( + supportbot.MaxAllowedTickets && + TicketData.tickets.filter((t) => t.user == interaction.user.id && t.open) + .length >= supportbot.MaxAllowedTickets + ) { + return interaction.reply({ + embeds: [ + { + title: "Too Many Tickets!", + description: `You can't have more than ${supportbot.MaxAllowedTickets} open tickets!`, + color: supportbot.WarningColour, + }, + ], + }); + } + if ( + User.roles.cache.has( getRole(supportbot.TicketBlackListRole, interaction.guild).id ) ) { @@ -49,10 +67,6 @@ module.exports = new Command({ // Ticket ID let ticketNumberID = await TicketNumberID.pad(); - let TicketData = await JSON.parse( - fs.readFileSync("./Data/TicketData.json", "utf8") - ); - // Ticket Subject const TicketSubject = interaction.options?.getString("reason") || supportbot.NoTicketSubject; @@ -127,6 +141,7 @@ module.exports = new Command({ user: Author.id, number: ticketNumberID, reason: TicketSubject, + open: true, subUsers: [], }); fs.writeFileSync( @@ -232,12 +247,34 @@ module.exports = new Command({ }); const filter = (i) => i.user.id === interaction.user.id; - const collector = await m.awaitMessageComponent({ - filter, - max: 1, - componentType: "BUTTON", - time: 60000, - }); + let collector; + try { + collector = await m.awaitMessageComponent({ + filter, + max: 1, + componentType: "BUTTON", + time: supportbot.Timeout * 60000, + }); + } catch (e) { + if (e.code == "INTERACTION_COLLECTOR_ERROR") + try { + let ticket = await TicketData.tickets.findIndex( + (t) => t.id == ticketChannel.id + ); + TicketData.tickets[ticket].open = false; + fs.writeFileSync( + "./Data/TicketData.json", + JSON.stringify(TicketData, null, 4), + (err) => { + if (err) console.error(err); + } + ); + interaction.user.send( + "Your ticket has timed out. Please open a new one, and select a department." + ); + } catch (e) {} + return await ticketChannel.delete(); + } let role; let title; if (collector.customId === "Department1") { diff --git a/Configs/supportbot.yml b/Configs/supportbot.yml index bbe5b06..762c84b 100644 --- a/Configs/supportbot.yml +++ b/Configs/supportbot.yml @@ -17,7 +17,6 @@ SupportBot_Version: "7.4.0" # ------------------------- Name: "SupportBot" -# No Prefix, as everything uses the new Slash (/) Commands feature! Token: "BOT_TOKEN" # Guild ID Ex: 123456789123456789 Guild: "" @@ -95,6 +94,8 @@ TranscriptTitle: "Ticket Transcript" TicketLog_Title: "Ticket Closed" TicketBlackListMessage: "You are not allowed to open a ticket" +MaxAllowedTickets: 2 + TicketSubject: "description" # "description" will displays the ticket reason within the channel description # "embed" will displays the ticket reason within the ticket embed @@ -153,13 +154,13 @@ TicketDept3Emoji: "3️⃣" TranscriptSavedMessage: "📝 **Transcript Saved!**" TicketLockMessage: "❌ **Ticket Locked!**" TicketDeleteMessage: "⚠ **Ticket Deleting!**" # Tickets deleting after 5 seconds by default. -TicketDeleteTime: 5000 # Time must be set in milliseconds. # --- Departments Config --- # --- Start --- TicketDepartments: true - +# Delete the ticket if no department selected. TIME IN MINUTES +Timeout: 5 AllowStaff: true # If set to false users with the "Staff" role will not be able to view tickets # without a valid department role set below. From 08a6d279035e0251b3894e01216bc02d650011de Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 20:56:30 -0600 Subject: [PATCH 52/53] Change to ephemeral --- Commands/ticket.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Commands/ticket.js b/Commands/ticket.js index c7904a4..99fbd54 100644 --- a/Commands/ticket.js +++ b/Commands/ticket.js @@ -50,6 +50,7 @@ module.exports = new Command({ color: supportbot.WarningColour, }, ], + ephemeral: true, }); } if ( @@ -57,11 +58,10 @@ module.exports = new Command({ getRole(supportbot.TicketBlackListRole, interaction.guild).id ) ) { - return interaction - .reply(supportbot.TicketBlackListMessage) - .then((msg) => { - setTimeout(() => msg.delete(), 3500); - }); + return interaction.reply({ + content: supportbot.TicketBlackListMessage, + ephemeral: true, + }); } // Ticket ID From 3a3ee357fc78230a49d181e058e3113c7b5951e8 Mon Sep 17 00:00:00 2001 From: Noah Date: Sat, 18 Dec 2021 21:17:06 -0600 Subject: [PATCH 53/53] Update packages --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 013bf2b..ae72152 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,9 +72,9 @@ } }, "node_modules/@types/node": { - "version": "16.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==" + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -86,9 +86,9 @@ } }, "node_modules/@types/ws": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.1.tgz", - "integrity": "sha512-SqQ+LhVZaJi7c7sYVkjWALDigi/Wy7h7Iu72gkQp8Y8OWw/DddEVBrTSKu86pQftV2+Gm8lYM61hadPKqyaIeg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dependencies": { "@types/node": "*" } @@ -366,9 +366,9 @@ "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" }, "@types/node": { - "version": "16.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", - "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==" + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==" }, "@types/node-fetch": { "version": "2.5.12", @@ -380,9 +380,9 @@ } }, "@types/ws": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.1.tgz", - "integrity": "sha512-SqQ+LhVZaJi7c7sYVkjWALDigi/Wy7h7Iu72gkQp8Y8OWw/DddEVBrTSKu86pQftV2+Gm8lYM61hadPKqyaIeg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "requires": { "@types/node": "*" }