@@ -19,149 +19,152 @@ class CloseTicket extends Command {
1919 const reason = args . join ( ' ' ) || 'No reason specified' ;
2020
2121 const connection = await this . client . db . getConnection ( ) ;
22- const [ rows ] = await connection . execute (
23- /* sql */ `
24- SELECT
25- *
26- FROM
27- ticket_settings
28- WHERE
29- server_id = ?
30- ` ,
31- [ msg . guild . id ] ,
32- ) ;
33-
34- if ( rows . length === 0 ) {
35- connection . release ( ) ;
36- return msg . channel . send ( 'The ticket system has not been setup in this server.' ) ;
37- }
38-
39- if ( ! msg . guild . members . me . permissions . has ( 'ManageChannels' ) ) {
40- connection . release ( ) ;
41- return msg . channel . send ( 'Please let a server administrator know the bot is missing Manage Channels permission.' ) ;
42- }
43-
44- const logID = rows [ 0 ] . logging_id ;
45- const roleID = rows [ 0 ] . role_id ;
4622
47- if ( ! msg . channel . name . startsWith ( 'ticket' ) ) {
48- connection . release ( ) ;
49- return msg . channel . send ( 'You need to be inside the ticket you want to close.' ) ;
50- }
51-
52- const tName = msg . channel . name ;
53- const role = msg . guild . roles . cache . get ( roleID ) ;
54- const [ ownerRows ] = await connection . execute (
55- /* sql */
56- `
57- SELECT
58- user_id
59- FROM
60- user_tickets
61- WHERE
62- server_id = ?
63- AND channel_id = ?
64- ` ,
65- [ msg . guild . id , msg . channel . id ] ,
66- ) ;
67- const owner = ownerRows [ 0 ] ?. user_id ;
68-
69- if ( ! owner ) {
70- connection . release ( ) ;
71- return msg . channel . send ( 'This ticket does not have an owner.' ) ;
72- }
23+ try {
24+ const [ rows ] = await connection . execute (
25+ /* sql */ `
26+ SELECT
27+ *
28+ FROM
29+ ticket_settings
30+ WHERE
31+ server_id = ?
32+ ` ,
33+ [ msg . guild . id ] ,
34+ ) ;
7335
74- if ( owner !== msg . author . id ) {
75- if ( ! msg . member . roles . cache . some ( ( r ) => r . id === roleID ) ) {
76- connection . release ( ) ;
77- return msg . channel . send ( `You need to be the ticket owner or a member of ${ role . name } to use this command.` ) ;
36+ if ( rows . length === 0 ) {
37+ return msg . channel . send ( 'The ticket system has not been setup in this server.' ) ;
7838 }
79- }
80-
81- const em = new EmbedBuilder ( )
82- . setAuthor ( { name : msg . member . displayName , iconURL : msg . member . displayAvatarURL ( ) } )
83- . setTitle ( 'Ticket Closed' )
84- . setColor ( '#E65DF4' ) . setDescription ( stripIndents `${ msg . author } has requested to close this ticket.
85- The ticket will close in 5 minutes if no further activity occurs.
86-
87- Reason: ${ reason }
88- ` ) ;
89- await msg . channel . send ( { embeds : [ em ] } ) ;
90-
91- const filter = ( m ) => m . content ?. length > 0 ;
92-
93- const collected = await msg . channel
94- . awaitMessages ( {
95- filter,
96- max : 1 ,
97- time : 300000 ,
98- errors : [ 'time' ] ,
99- } )
100- . catch ( ( ) => null ) ;
101-
102- if ( ! collected ) {
103- const attachment = await discordTranscripts . createTranscript ( msg . channel ) ;
104- let received ;
10539
106- const userEmbed = new EmbedBuilder ( )
107- . setTitle ( 'Ticket Closed' )
108- . setColor ( '#E65DF4' )
109- . addFields ( [
110- { name : 'Reason' , value : reason , inline : false } ,
111- { name : 'Server' , value : msg . guild . name , inline : false } ,
112- ] )
113- . setTimestamp ( ) ;
114- const user = await this . client . users . fetch ( owner ) ;
115- await user . send ( { embeds : [ userEmbed ] , files : [ attachment ] } ) . catch ( ( ) => {
116- received = 'no' ;
117- } ) ;
40+ if ( ! msg . guild . members . me . permissions . has ( 'ManageChannels' ) ) {
41+ return msg . channel . send (
42+ 'Please let a server administrator know the bot is missing Manage Channels permission.' ,
43+ ) ;
44+ }
11845
119- const logEmbed = new EmbedBuilder ( )
120- . setAuthor ( { name : user . displayName , iconURL : user . displayAvatarURL ( ) } )
121- . setTitle ( 'Ticket Closed' )
122- . addFields ( [
123- { name : 'Author' , value : `<@${ owner } > (${ owner } )` , inline : false } ,
124- { name : 'Channel' , value : `${ tName } : ${ msg . channel . id } ` , inline : false } ,
125- { name : 'Reason' , value : reason , inline : false } ,
126- ] )
127- . setColor ( '#E65DF4' )
128- . setTimestamp ( ) ;
129- if ( received === 'no' ) logEmbed . setFooter ( { text : 'Could not message author' } ) ;
46+ const logID = rows [ 0 ] . logging_id ;
47+ const roleID = rows [ 0 ] . role_id ;
13048
131- await msg . guild . channels . cache
132- . get ( logID )
133- . send ( { embeds : [ logEmbed ] , files : [ attachment ] } )
134- . catch ( ( e ) => this . client . logger . error ( e ) ) ;
49+ if ( ! msg . channel . name . startsWith ( 'ticket' ) ) {
50+ return msg . channel . send ( 'You need to be inside the ticket you want to close.' ) ;
51+ }
13552
136- await connection . execute (
53+ const tName = msg . channel . name ;
54+ const role = msg . guild . roles . cache . get ( roleID ) ;
55+ const [ ownerRows ] = await connection . execute (
13756 /* sql */
13857 `
139- DELETE FROM user_tickets
58+ SELECT
59+ user_id
60+ FROM
61+ user_tickets
14062 WHERE
14163 server_id = ?
14264 AND channel_id = ?
14365 ` ,
14466 [ msg . guild . id , msg . channel . id ] ,
14567 ) ;
146- connection . release ( ) ;
68+ const owner = ownerRows [ 0 ] ?. user_id ;
14769
148- return msg . channel . delete ( ) ;
149- }
70+ if ( ! owner ) {
71+ return msg . channel . send ( 'This ticket does not have an owner.' ) ;
72+ }
73+
74+ if ( owner !== msg . author . id ) {
75+ if ( ! msg . member . roles . cache . some ( ( r ) => r . id === roleID ) ) {
76+ return msg . channel . send ( `You need to be the ticket owner or a member of ${ role . name } to use this command.` ) ;
77+ }
78+ }
79+
80+ const em = new EmbedBuilder ( )
81+ . setAuthor ( { name : msg . member . displayName , iconURL : msg . member . displayAvatarURL ( ) } )
82+ . setTitle ( 'Ticket Closed' )
83+ . setColor ( '#E65DF4' ) . setDescription ( stripIndents `${ msg . author } has requested to close this ticket.
84+ The ticket will close in 5 minutes if no further activity occurs.
85+
86+ Reason: ${ reason }
87+ ` ) ;
88+ await msg . channel . send ( { embeds : [ em ] } ) ;
89+
90+ const filter = ( m ) => m . content ?. length > 0 ;
91+
92+ const collected = await msg . channel
93+ . awaitMessages ( {
94+ filter,
95+ max : 1 ,
96+ time : 300000 ,
97+ errors : [ 'time' ] ,
98+ } )
99+ . catch ( ( ) => null ) ;
100+
101+ if ( ! collected ) {
102+ const attachment = await discordTranscripts . createTranscript ( msg . channel ) ;
103+ let received ;
104+
105+ const userEmbed = new EmbedBuilder ( )
106+ . setTitle ( 'Ticket Closed' )
107+ . setColor ( '#E65DF4' )
108+ . addFields ( [
109+ { name : 'Reason' , value : reason , inline : false } ,
110+ { name : 'Server' , value : msg . guild . name , inline : false } ,
111+ ] )
112+ . setTimestamp ( ) ;
113+ const user = await this . client . users . fetch ( owner ) ;
114+ await user . send ( { embeds : [ userEmbed ] , files : [ attachment ] } ) . catch ( ( ) => {
115+ received = 'no' ;
116+ } ) ;
117+
118+ const logEmbed = new EmbedBuilder ( )
119+ . setAuthor ( { name : user . displayName , iconURL : user . displayAvatarURL ( ) } )
120+ . setTitle ( 'Ticket Closed' )
121+ . addFields ( [
122+ { name : 'Author' , value : `<@${ owner } > (${ owner } )` , inline : false } ,
123+ { name : 'Channel' , value : `${ tName } : ${ msg . channel . id } ` , inline : false } ,
124+ { name : 'Reason' , value : reason , inline : false } ,
125+ ] )
126+ . setColor ( '#E65DF4' )
127+ . setTimestamp ( ) ;
128+ if ( received === 'no' ) logEmbed . setFooter ( { text : 'Could not message author' } ) ;
129+
130+ await msg . guild . channels . cache
131+ . get ( logID )
132+ . send ( { embeds : [ logEmbed ] , files : [ attachment ] } )
133+ . catch ( ( e ) => this . client . logger . error ( e ) ) ;
134+
135+ await connection . execute (
136+ /* sql */
137+ `
138+ DELETE FROM user_tickets
139+ WHERE
140+ server_id = ?
141+ AND channel_id = ?
142+ ` ,
143+ [ msg . guild . id , msg . channel . id ] ,
144+ ) ;
145+
146+ return msg . channel . delete ( ) ;
147+ }
150148
151- const response = collected . first ( ) . content ;
152- const embed = new EmbedBuilder ( )
153- . setTitle ( 'Ticket Re-Opened' )
154- . setDescription (
155- stripIndents `
149+ const response = collected . first ( ) . content ;
150+ const embed = new EmbedBuilder ( )
151+ . setTitle ( 'Ticket Re-Opened' )
152+ . setDescription (
153+ stripIndents `
156154 Closing of the ticket has been cancelled with the following reason:
157155
158156 ${ response } ` ,
159- )
160- . setColor ( '#E65DF4' )
161- . setTimestamp ( ) ;
157+ )
158+ . setColor ( '#E65DF4' )
159+ . setTimestamp ( ) ;
162160
163- connection . release ( ) ;
164- return msg . channel . send ( { embeds : [ embed ] } ) ;
161+ return msg . channel . send ( { embeds : [ embed ] } ) ;
162+ } catch ( err ) {
163+ this . client . logger . error ( err ) ;
164+ this . client . util . errorEmbed ( msg , 'An error occurred while trying to close the ticket. Please try again later.' ) ;
165+ } finally {
166+ connection . release ( ) ;
167+ }
165168 }
166169}
167170
0 commit comments