├── .github └── dependabot.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── TODO.md ├── cdtickets.png ├── package-lock.json ├── package.json └── src └── index.js /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | open-pull-requests-limit: 10 8 | ignore: 9 | - dependency-name: discord.js 10 | versions: 11 | - 12.5.2 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | test/ 3 | .env -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | TODO.md 2 | cdtickets.png 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Exxon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 |

14 | 15 | # Contents 16 | - [Installation](#installation) 17 | - [Setup](#setup) 18 | - [Creating a new ticket](#create-a-ticket) 19 | - [Deleting a ticket](#delete-a-ticket) 20 | - [Unclaim a ticket](#unclaim-a-ticket) 21 | - [Rename a ticket](#rename-a-ticket) 22 | - [Add a member](#add-a-member-to-a-ticket) 23 | - [Remove a member](#remove-a-member-from-a-ticket) 24 | - [Other](#other) 25 | 26 |

27 | 28 | # Installation 29 | ``` 30 | npm i cdtickets --save 31 | ``` 32 | 33 | # Setup 34 | ```js 35 | // Top of the Command File 36 | const CDTickets = require('cdtickets') 37 | const ticket = new CDTickets() 38 | ``` 39 | 40 | ## Create a ticket 41 | ```js 42 | ticket.create({ 43 | msg: message, 44 | name: 'Ticket Name', // Defaults to the ticket owners username 45 | supportRole: 'Role', // Role Name or ID 46 | category: 'Category ID', // If no category is set it will just make a channel at the top of the server 47 | response: 'Response', // This message is sent when they open the ticket - Defaults to "Your ticket has successfully been created in #channel 48 | reason: 'Reason for opening the ticket', // Defaults to "No reason provided" 49 | message: 'Message', // This message is sent when the ticket is opened, will also ping the user and the support role 50 | }) 51 | ``` 52 | 53 | ## Delete a ticket 54 | ```js 55 | ticket.delete({ 56 | msg: message 57 | }) 58 | ``` 59 | 60 | ## Claim a ticket 61 | ```js 62 | ticket.claim({ 63 | msg: message, 64 | supportRole: 'Role' // Role Name or ID 65 | }) 66 | ``` 67 | 68 | ## Unclaim a ticket 69 | ```js 70 | ticket.unclaim({ 71 | msg: message, 72 | supportRole: 'Role', // Role Name or ID 73 | }) 74 | ``` 75 | 76 | ## Rename a ticket 77 | ```js 78 | ticket.rename({ 79 | msg: message, 80 | name: 'New Name' 81 | }) 82 | ``` 83 | 84 | ## Add a member to a ticket 85 | ```js 86 | ticket.add({ 87 | msg: message, 88 | user: 'User' // message.mentions.members.first() || message.guild.members.cache.get(args[argNumber]) 89 | }) 90 | ``` 91 | 92 | ## Remove a member from a ticket 93 | ```js 94 | ticket.remove({ 95 | msg: message, 96 | user: 'User' // message.mentions.members.first() || message.guild.members.cache.get(args[argNumber]) 97 | }) 98 | ``` 99 |

100 | 101 | # Other 102 | If you have any questions, suggestions or need helping setting it up join our [Support Server](https://discord.gg/jUNbV5u). 103 | 104 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | ### Stuff that is coming soon 2 | 3 | - Option to have multiple support roles :x: 4 | - Support for MongoDB :x: 5 | - Transcripts that either save as a .txt file or go to creativedevelopments.org domain :x: 6 | -------------------------------------------------------------------------------- /cdtickets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CreativeDevelopments/CDTickets/ceffb50a03896984c162d36d0565cd1b93f065be/cdtickets.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cdtickets", 3 | "version": "1.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "1.1.0", 9 | "license": "MIT", 10 | "dependencies": { 11 | "colors": "^1.4.0", 12 | "discord.js": "^12.5.1" 13 | } 14 | }, 15 | "node_modules/@discordjs/collection": { 16 | "version": "0.1.6", 17 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 18 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 19 | }, 20 | "node_modules/@discordjs/form-data": { 21 | "version": "3.0.1", 22 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 23 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 24 | "dependencies": { 25 | "asynckit": "^0.4.0", 26 | "combined-stream": "^1.0.8", 27 | "mime-types": "^2.1.12" 28 | }, 29 | "engines": { 30 | "node": ">= 6" 31 | } 32 | }, 33 | "node_modules/abort-controller": { 34 | "version": "3.0.0", 35 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 36 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 37 | "dependencies": { 38 | "event-target-shim": "^5.0.0" 39 | }, 40 | "engines": { 41 | "node": ">=6.5" 42 | } 43 | }, 44 | "node_modules/asynckit": { 45 | "version": "0.4.0", 46 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 47 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 48 | }, 49 | "node_modules/colors": { 50 | "version": "1.4.0", 51 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 52 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 53 | "engines": { 54 | "node": ">=0.1.90" 55 | } 56 | }, 57 | "node_modules/combined-stream": { 58 | "version": "1.0.8", 59 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 60 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 61 | "dependencies": { 62 | "delayed-stream": "~1.0.0" 63 | }, 64 | "engines": { 65 | "node": ">= 0.8" 66 | } 67 | }, 68 | "node_modules/delayed-stream": { 69 | "version": "1.0.0", 70 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 71 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 72 | "engines": { 73 | "node": ">=0.4.0" 74 | } 75 | }, 76 | "node_modules/discord.js": { 77 | "version": "12.5.3", 78 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", 79 | "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", 80 | "dependencies": { 81 | "@discordjs/collection": "^0.1.6", 82 | "@discordjs/form-data": "^3.0.1", 83 | "abort-controller": "^3.0.0", 84 | "node-fetch": "^2.6.1", 85 | "prism-media": "^1.2.9", 86 | "setimmediate": "^1.0.5", 87 | "tweetnacl": "^1.0.3", 88 | "ws": "^7.4.4" 89 | }, 90 | "engines": { 91 | "node": ">=12.0.0" 92 | } 93 | }, 94 | "node_modules/event-target-shim": { 95 | "version": "5.0.1", 96 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 97 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 98 | "engines": { 99 | "node": ">=6" 100 | } 101 | }, 102 | "node_modules/mime-db": { 103 | "version": "1.46.0", 104 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", 105 | "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", 106 | "engines": { 107 | "node": ">= 0.6" 108 | } 109 | }, 110 | "node_modules/mime-types": { 111 | "version": "2.1.29", 112 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", 113 | "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", 114 | "dependencies": { 115 | "mime-db": "1.46.0" 116 | }, 117 | "engines": { 118 | "node": ">= 0.6" 119 | } 120 | }, 121 | "node_modules/node-fetch": { 122 | "version": "2.6.1", 123 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 124 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", 125 | "engines": { 126 | "node": "4.x || >=6.0.0" 127 | } 128 | }, 129 | "node_modules/prism-media": { 130 | "version": "1.2.9", 131 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.9.tgz", 132 | "integrity": "sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q==", 133 | "peerDependencies": { 134 | "@discordjs/opus": "^0.5.0", 135 | "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", 136 | "node-opus": "^0.3.3", 137 | "opusscript": "^0.0.8" 138 | }, 139 | "peerDependenciesMeta": { 140 | "@discordjs/opus": { 141 | "optional": true 142 | }, 143 | "ffmpeg-static": { 144 | "optional": true 145 | }, 146 | "node-opus": { 147 | "optional": true 148 | }, 149 | "opusscript": { 150 | "optional": true 151 | } 152 | } 153 | }, 154 | "node_modules/setimmediate": { 155 | "version": "1.0.5", 156 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 157 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 158 | }, 159 | "node_modules/tweetnacl": { 160 | "version": "1.0.3", 161 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 162 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 163 | }, 164 | "node_modules/ws": { 165 | "version": "7.4.4", 166 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", 167 | "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", 168 | "engines": { 169 | "node": ">=8.3.0" 170 | }, 171 | "peerDependencies": { 172 | "bufferutil": "^4.0.1", 173 | "utf-8-validate": "^5.0.2" 174 | }, 175 | "peerDependenciesMeta": { 176 | "bufferutil": { 177 | "optional": true 178 | }, 179 | "utf-8-validate": { 180 | "optional": true 181 | } 182 | } 183 | } 184 | }, 185 | "dependencies": { 186 | "@discordjs/collection": { 187 | "version": "0.1.6", 188 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 189 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 190 | }, 191 | "@discordjs/form-data": { 192 | "version": "3.0.1", 193 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 194 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 195 | "requires": { 196 | "asynckit": "^0.4.0", 197 | "combined-stream": "^1.0.8", 198 | "mime-types": "^2.1.12" 199 | } 200 | }, 201 | "abort-controller": { 202 | "version": "3.0.0", 203 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 204 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 205 | "requires": { 206 | "event-target-shim": "^5.0.0" 207 | } 208 | }, 209 | "asynckit": { 210 | "version": "0.4.0", 211 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 212 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 213 | }, 214 | "colors": { 215 | "version": "1.4.0", 216 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 217 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 218 | }, 219 | "combined-stream": { 220 | "version": "1.0.8", 221 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 222 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 223 | "requires": { 224 | "delayed-stream": "~1.0.0" 225 | } 226 | }, 227 | "delayed-stream": { 228 | "version": "1.0.0", 229 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 230 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 231 | }, 232 | "discord.js": { 233 | "version": "12.5.3", 234 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", 235 | "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", 236 | "requires": { 237 | "@discordjs/collection": "^0.1.6", 238 | "@discordjs/form-data": "^3.0.1", 239 | "abort-controller": "^3.0.0", 240 | "node-fetch": "^2.6.1", 241 | "prism-media": "^1.2.9", 242 | "setimmediate": "^1.0.5", 243 | "tweetnacl": "^1.0.3", 244 | "ws": "^7.4.4" 245 | } 246 | }, 247 | "event-target-shim": { 248 | "version": "5.0.1", 249 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 250 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 251 | }, 252 | "mime-db": { 253 | "version": "1.46.0", 254 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", 255 | "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" 256 | }, 257 | "mime-types": { 258 | "version": "2.1.29", 259 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", 260 | "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", 261 | "requires": { 262 | "mime-db": "1.46.0" 263 | } 264 | }, 265 | "node-fetch": { 266 | "version": "2.6.1", 267 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 268 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 269 | }, 270 | "prism-media": { 271 | "version": "1.2.9", 272 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.9.tgz", 273 | "integrity": "sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q==", 274 | "requires": {} 275 | }, 276 | "setimmediate": { 277 | "version": "1.0.5", 278 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 279 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 280 | }, 281 | "tweetnacl": { 282 | "version": "1.0.3", 283 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 284 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 285 | }, 286 | "ws": { 287 | "version": "7.4.4", 288 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", 289 | "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", 290 | "requires": {} 291 | } 292 | } 293 | } 294 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cdtickets", 3 | "version": "1.1.0", 4 | "description": "Easy to use ticket package for Discord.js bots", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/CreativeDevelopments/CDTickets.git" 12 | }, 13 | "keywords": [ 14 | "discord.js", 15 | "tickets" 16 | ], 17 | "author": "Exxon#0293", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/CreativeDevelopments/CDTickets/issues" 21 | }, 22 | "homepage": "https://github.com/CreativeDevelopments/CDTickets#readme", 23 | "dependencies": { 24 | "colors": "^1.4.0", 25 | "discord.js": "^12.5.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const colors = require('colors'); 2 | const { MessageEmbed } = require('discord.js'); 3 | 4 | class CDTickets { 5 | 6 | /** 7 | * 8 | * @param {Object} param0 9 | * @param {Message} param0.msg 10 | * @param {string} param0.name 11 | * @param {string} param0.supportRole 12 | * @param {string} param0.category 13 | * @param {string} param0.response 14 | * @param {string} param0.reason 15 | * @param {string} param0.message 16 | * @returns 17 | */ 18 | async create({ msg, name, supportRole, category, response, reason, message }) { 19 | if (!msg || !msg.author) 20 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "msg" was provided!')); 21 | 22 | if (!supportRole) 23 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "supportRole" was provided!')); 24 | 25 | let role = msg.guild.roles.cache.find(r => r.name === supportRole) || msg.guild.roles.cache.get(supportRole) || msg.mentions.roles.first(); 26 | if (!role) 27 | return msg.channel.send('An invalid role was provided, please try again!'); 28 | 29 | if (!name) 30 | name = `${msg.author.username}`; 31 | 32 | if (!reason) 33 | reason = 'No reason provided'; 34 | 35 | if (!message) 36 | message = `${msg.author} Welcome to your ticket!`; 37 | 38 | let chan; 39 | try { 40 | chan = await msg.guild.channels.create(name, { 41 | type: 'text', 42 | reason: `Opening ticket for ${msg.author.tag}`, 43 | topic: `Ticket owner --> ${msg.author.tag} | Reason --> ${reason}`, 44 | permissionOverwrites: [ 45 | { 46 | id: msg.author.id, 47 | allow: 117760 48 | }, { 49 | id: role.id, 50 | allow: 117760 51 | }, { 52 | id: msg.guild.id, 53 | deny: 1024 54 | } 55 | ] 56 | }); 57 | } catch (err) { 58 | console.log(err); 59 | return msg.channel.send('There was an error creating your ticket, please try again!'); 60 | } 61 | 62 | if (category) { 63 | let cat = msg.guild.channels.cache.find(ch => ch.name === category) || msg.guild.channels.cache.get(category); 64 | 65 | if (!cat) 66 | console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' An invalid category was provided!')); 67 | if (cat.type !== 'category') 68 | console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' The category given is not a category!')); 69 | 70 | chan.setParent(cat.id, { lockPermissions: false, reason: `Opening ticket for ${msg.author.tag}` }).catch((err) => console.log(err)); 71 | }; 72 | 73 | if (!response) 74 | response = `${msg.author}, Your ticket has successfully been created in ${chan}`; 75 | 76 | msg.delete().catch((err) => console.log(err)); 77 | 78 | const chanEmbed = new MessageEmbed() 79 | .setColor('#00DCFF') 80 | .setDescription(`${message}\n\nReason: ${reason}`) 81 | 82 | chan.send(`${role} ${msg.author}`, chanEmbed) 83 | .catch((_) => chan.send(`${role} ${msg.author}`, `${message}\n\nReason: ${reason}`)); 84 | 85 | const embed = new MessageEmbed() 86 | .setColor('#2FDD2C') 87 | .setDescription(`${response}`) 88 | 89 | msg.channel.send(embed) 90 | .catch((_) => msg.channel.send(`${response}`)); 91 | } 92 | 93 | /** 94 | * 95 | * @param {Object} param0 96 | * @param {Message} param0.msg 97 | * @returns 98 | */ 99 | delete({ msg }) { 100 | if (!msg) 101 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "msg" was provided!')); 102 | 103 | const embed = new MessageEmbed() 104 | .setColor('#C93131') 105 | .setDescription('Deleting the ticket...') 106 | 107 | msg.delete().catch((err) => console.log(err)); 108 | msg.channel.send(embed) 109 | .catch((_) => msg.channel.send(`Deleting the ticket...`)); 110 | 111 | try { 112 | setTimeout(() => msg.channel.delete({ 113 | reason: `Deleting ticket for ${msg.author.tag} | ${msg.channel.name}`, 114 | }), 115 | 5000, 116 | ); 117 | } catch (err) { 118 | console.log(err); 119 | return msg.channel.send('Failed to delete the ticket, please try again!'); 120 | }; 121 | } 122 | 123 | /** 124 | * 125 | * @param {Object} param0 126 | * @param {Message} param0.msg 127 | * @param {string} param0.supportRole 128 | * @returns 129 | */ 130 | async claim({ msg, supportRole }) { 131 | if (!msg) 132 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "msg" was provided!')); 133 | 134 | if (!supportRole) 135 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "supportRole" was provided!')); 136 | 137 | let role = msg.guild.roles.cache.find(r => r.name === supportRole) || msg.guild.roles.cache.get(supportRole) || msg.mentions.roles.first(); 138 | if (!role) 139 | return msg.channel.send('An invalid role was provided, please try again!'); 140 | 141 | try { 142 | await msg.channel.overwritePermissions([ 143 | { 144 | id: msg.author, 145 | allow: 117760 146 | }, { 147 | id: role, 148 | deny: 1024 149 | }, { 150 | id: msg.guild.id, 151 | deny: 1024 152 | } 153 | ], `Claiming ticket for ${msg.author.tag}`); 154 | } catch (err) { 155 | console.log(err); 156 | return msg.channel.send('Failed to claim the ticket, please try again!'); 157 | }; 158 | 159 | const embed = new MessageEmbed() 160 | .setColor('#2FDD2C') 161 | .setDescription(`You have successfully claimed the ticket ${msg.channel}!`) 162 | 163 | msg.delete().catch((err) => console.log(err)); 164 | msg.channel.send(embed) 165 | .catch((_) => msg.channel.send(`Successfully claimed the ticket!`)); 166 | } 167 | 168 | /** 169 | * 170 | * @param {Object} param0 171 | * @param {Message} param0.msg 172 | * @param {string} param0.supportRole 173 | * @returns 174 | */ 175 | async unclaim({ msg, supportRole }) { 176 | if (!msg) 177 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "msg" was provided!')); 178 | 179 | if (!supportRole) 180 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "supportRole" was provided!')); 181 | 182 | let role = msg.guild.roles.cache.find(r => r.name === supportRole) || msg.guild.roles.cache.get(supportRole) || msg.mentions.roles.first(); 183 | if (!role) 184 | return msg.channel.send('An invalid role was provided, please try again!'); 185 | 186 | try { 187 | await msg.channel.overwritePermissions([ 188 | { 189 | id: msg.author 190 | }, { 191 | id: role, 192 | allow: 11760, 193 | }, { 194 | id: msg.guild.id, 195 | deny: 1024 196 | } 197 | ], `Unclaiming ticket for ${msg.author.tag}`); 198 | } catch(err) { 199 | console.log(err); 200 | return msg.channel.send('Failed to unclaim the ticket, please try again!'); 201 | }; 202 | 203 | const embed = new MessageEmbed() 204 | .setColor('#2FDD2C') 205 | .setDescription(`You have successfully unclaimed the ticket ${msg.channel}!`) 206 | 207 | msg.delete().catch((err) => console.log(err)); 208 | msg.channel.send(embed) 209 | .catch((_) => message.channel.send(`Successfully unclaimed the ticket!`)); 210 | } 211 | 212 | /** 213 | * 214 | * @param {Object} param0 215 | * @param {Message} param0.msg 216 | * @param {string} param0.name 217 | * @returns 218 | */ 219 | async rename({ msg, name }) { 220 | if (!msg) 221 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "msg" was provided!')); 222 | if (!name) 223 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "name" was provided!')); 224 | 225 | try { 226 | await msg.channel.setName(name, `Renaming ticket ${msg.channel.name} for ${msg.author.tag}`); 227 | } catch (err) { 228 | console.log(err); 229 | return msg.channel.send('Failed to rename the ticket, please try again!'); 230 | }; 231 | 232 | const embed = new MessageEmbed() 233 | .setColor('#2FDD2C') 234 | .setDescription(`Successfully renamed the ticket to ${name}!`) 235 | 236 | msg.delete().catch((err) => console.log(err)); 237 | msg.channel.send(embed) 238 | .catch((_) => message.channel.send(`Successfully renamed the ticket to ${name}!`)); 239 | } 240 | 241 | /** 242 | * 243 | * @param {Object} param0 244 | * @param {Message} param0.msg 245 | * @param {string} param0.user 246 | * @returns 247 | */ 248 | async add({ msg, user}) { 249 | if (!msg) 250 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "msg" was provided!')); 251 | if (!user) 252 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "user" was provided!')); 253 | 254 | const targetMember = msg.guild.members.cache.get(user) || msg.mentions.members.first(); 255 | if (!targetMember) 256 | return msg.channel.send('An invalid user was provided, please try again!'); 257 | 258 | try { 259 | await msg.channel.updateOverwrite(targetMember.id, { 260 | VIEW_CHANNEL: true, 261 | SEND_MESSAGES: true, 262 | READ_MESSAGES: true, 263 | ATTACH_FILE: true, 264 | EMBED_LINKS: true, 265 | READ_MESSAGE_HISTORY: true, 266 | }, `Adding ${targetMember.user.tag} to ticket ${msg.channel.name}`); 267 | } catch (err) { 268 | console.error(err); 269 | return msg.channel.send(`Failed to add ${targetMember} to the ticket, please try again!`); 270 | }; 271 | 272 | const embed = new MessageEmbed() 273 | .setColor('#2FDD2C') 274 | .setDescription(`Successfully added ${targetMember} to ticket ${msg.channel.name}!`) 275 | 276 | msg.delete().catch((err) => console.log(err)); 277 | msg.channel.send(embed) 278 | .catch((_) => message.channel.send(`Successfully added ${targetMember} to ticket ${msg.channel.name}!`)); 279 | } 280 | 281 | /** 282 | * 283 | * @param {Object} param0 284 | * @param {Message} param0.msg 285 | * @param {string} param0.user 286 | * @returns 287 | */ 288 | async remove({ msg, user }) { 289 | if (!msg) 290 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "msg" was provided!')); 291 | if (!user) 292 | return console.log(`${colors.brightRed('[ERROR]')}`.white + colors.white(' No "user" was provided!')); 293 | 294 | const targetMember = msg.guild.members.cache.get(user) || msg.mentions.members.first(); 295 | if (!targetMember) 296 | return msg.channel.send('An invalid user was provided, please try again!'); 297 | 298 | try { 299 | await msg.channel.updateOverwrite(targetMember.id, { 300 | VIEW_CHANNEL: false, 301 | READ_MESSAGES: false, 302 | }, `Removing ${targetMember.user.tag} from ticket ${msg.channel.name}`); 303 | } catch(err) { 304 | console.log(err); 305 | return msg.channel.send(`Failed to remove ${targetMember} from the ticket, please try again!`); 306 | }; 307 | 308 | const embed = new MessageEmbed() 309 | .setColor('#2FDD2C') 310 | .setDescription(`Successfully removed ${targetMember} from ticket ${msg.channel.name}!`) 311 | 312 | msg.delete().catch((err) => console.log(err)); 313 | msg.channel.send(embed) 314 | .catch((_) => message.channel.send(`Successfully removed ${user} from ticket ${msg.channel.name}!`)); 315 | } 316 | } 317 | 318 | module.exports = CDTickets; --------------------------------------------------------------------------------