├── .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;
--------------------------------------------------------------------------------