Skip to content

Commit 32ce548

Browse files
committed
Add ticket close button, open blacklist, limits
1 parent 488eb2b commit 32ce548

File tree

6 files changed

+272
-62
lines changed

6 files changed

+272
-62
lines changed

commands/Administrator/setup.js

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class Setup extends Command {
1717
super(client, {
1818
name: 'setup',
1919
description: 'Setup the different systems of the bot',
20-
usage: 'setup <logs | tickets | warns>',
20+
usage: 'setup <logging | tickets | warns>',
2121
category: 'Administrator',
2222
permLevel: 'Administrator',
2323
aliases: ['setlogchannel', 'setupticket', 'logsetup', 'ticketsetup', 'setupwarns'],
@@ -58,8 +58,9 @@ class Setup extends Command {
5858
The ticket system is already set up in this server. Would you like to:
5959
1️⃣ Reuse existing ticket channels and just update the menu.
6060
2️⃣ Select new ticket creation and log channels.
61-
3️⃣ Disable the ticket system.
62-
(Reply with 1, 2, 3, or cancel)
61+
3️⃣ Disable and delete the tickets data.
62+
4️⃣ Update the max number of tickets a user can open.
63+
(Reply a number or cancel)
6364
`);
6465

6566
const collected = await msg.channel.awaitMessages({ filter, max: 1, time: 60000, errors: ['time'] });
@@ -68,6 +69,41 @@ class Setup extends Command {
6869
const choice = collected.first().content.toLowerCase();
6970
if (choice === 'cancel') return msg.channel.send('Got it! Setup cancelled.');
7071

72+
// Update the max number of tickets
73+
if (choice === '4') {
74+
// code goes here
75+
await msg.channel.send(
76+
'How many tickets should a user be able to open? Please respond in number form, the default is 3.',
77+
);
78+
79+
const collectedMaxTicketsQuestion = await msg.channel.awaitMessages({
80+
filter2,
81+
max: 1,
82+
time: 60000,
83+
errors: ['time'],
84+
});
85+
if (!collectedMaxTicketsQuestion) {
86+
errorEmbed.setDescription('You did not reply in time, the command has been cancelled.');
87+
return msg.channel.send({ embeds: [errorEmbed] });
88+
}
89+
let ticketLimit = parseInt(collectedMaxTicketsQuestion.first().content.toLowerCase());
90+
91+
while (isNaN(ticketLimit)) {
92+
ticketLimit = await this.client.util.awaitReply(
93+
msg,
94+
'How many tickets should a user be able to open? Please respond in number form, the default is 3.',
95+
);
96+
if (!ticketLimit) {
97+
errorEmbed.setDescription('You did not reply in time, the command has been cancelled.');
98+
return msg.channel.send({ embeds: [errorEmbed] });
99+
}
100+
ticketLimit = parseInt(ticketLimit);
101+
}
102+
await db.set(`servers.${msg.guild.id}.tickets.limit`, ticketLimit);
103+
return msg.channel.send(`The ticket limit has been updated to ${ticketLimit}.`);
104+
}
105+
// End of updating max number of tickets
106+
71107
// Disable the ticket system
72108
if (choice === '3') {
73109
await db.delete(`servers.${msg.guild.id}.tickets`);
@@ -399,7 +435,7 @@ class Setup extends Command {
399435
errorEmbed.setDescription('You did not reply in time, the command has been cancelled.');
400436
return msg.channel.send({ embeds: [errorEmbed] });
401437
}
402-
const response = collected.first().content.toLowerCase();
438+
const response = collected.first().content;
403439
let role = this.client.util.getRole(msg, response);
404440

405441
if (response.toLowerCase() === 'cancel')
@@ -545,6 +581,7 @@ class Setup extends Command {
545581
await db.set(`servers.${msg.guild.id}.tickets.logID`, tixLog.id);
546582

547583
return msg.channel.send(stripIndents`The ticket system is now fully functional.
584+
To change settings or disable the system re-run the setup.
548585
549586
Log Channel: ${tixLog}
550587
Ticket Creation Channel: ${ticketCreationMenu === 'yes' ? ticketCreationChannel : 'Skipped'}`);
@@ -710,7 +747,7 @@ class Setup extends Command {
710747
name: 'Tickets',
711748
value: stripIndents`
712749
To setup the ticket system please use:
713-
\`${msg.settings.prefix}Setup Ticket\``,
750+
\`${msg.settings.prefix}Setup Tickets\``,
714751
},
715752
{
716753
name: 'Logging',

commands/Tickets/close.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,21 @@ class CloseTicket extends Command {
2020
async run(msg, args) {
2121
const reason = args.join(' ') || 'No reason specified';
2222

23-
if (!(await db.get(`servers.${msg.guild.id}.tickets`)))
23+
if (!(await db.get(`servers.${msg.guild.id}.tickets`))) {
2424
return msg.channel.send('The ticket system has not been setup in this server.');
25+
}
2526
const { logID, roleID } = await db.get(`servers.${msg.guild.id}.tickets`);
2627

27-
if (!msg.channel.name.startsWith('ticket'))
28+
if (!msg.channel.name.startsWith('ticket')) {
2829
return msg.channel.send('You need to be inside the ticket you want to close.');
30+
}
2931

3032
const tName = msg.channel.name;
3133
const role = msg.guild.roles.cache.get(roleID);
3234
const owner = await db.get(`servers.${msg.guild.id}.tickets.${msg.channel.id}.owner`);
3335
if (owner !== msg.author.id) {
3436
if (!msg.member.roles.cache.some((r) => r.id === roleID)) {
35-
return msg.channel.send(`You need to be the ticket owner or a member of ${role.name} to use force-close.`);
37+
return msg.channel.send(`You need to be the ticket owner or a member of ${role.name} to use this command.`);
3638
}
3739
}
3840

@@ -52,7 +54,7 @@ class CloseTicket extends Command {
5254
})
5355
.catch(() => null);
5456

55-
if (!collected || collected.first().content.toLowerCase() === '-close') {
57+
if (!collected) {
5658
const attachment = await discordTranscripts.createTranscript(msg.channel);
5759
let received;
5860

@@ -78,7 +80,7 @@ class CloseTicket extends Command {
7880
])
7981
.setColor('#E65DF4')
8082
.setTimestamp();
81-
if (received === 'no') logEmbed.setFooter({ text: 'Could not message author.' });
83+
if (received === 'no') logEmbed.setFooter({ text: 'Could not message author' });
8284

8385
await msg.guild.channels.cache
8486
.get(logID)

commands/Tickets/force-close.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class forceClose extends Command {
5151

5252
if (!msg.channel.name.startsWith('ticket')) {
5353
if (owner !== msg.author.id || !msg.member.roles.cache.some((r) => r.id === roleID))
54-
return msg.channel.send(`You need to be a member of ${role.name} to use force-close.`);
54+
return msg.channel.send(`You need to be a member of ${role.name} to use this command.`);
5555

5656
if (!tID && !msg.channel.name.startsWith('ticket'))
5757
return msg.channel.send('You need to supply the ticket channel ID.');
@@ -60,7 +60,7 @@ class forceClose extends Command {
6060
} else {
6161
if (owner !== msg.author.id) {
6262
if (!msg.member.roles.cache.some((r) => r.id === roleID)) {
63-
return msg.channel.send(`You need to be the ticket owner or a member of ${role.name} to use force-close.`);
63+
return msg.channel.send(`You need to be the ticket owner or a member of ${role.name} to use this command.`);
6464
}
6565
}
6666
if (!owner) return msg.channel.send('That is not a valid ticket. Please try again.');
@@ -99,7 +99,7 @@ class forceClose extends Command {
9999
])
100100
.setColor('#E65DF4')
101101
.setTimestamp();
102-
if (received === 'no') logEmbed.setFooter({ text: 'Could not message author.' });
102+
if (received === 'no') logEmbed.setFooter({ text: 'Could not message author' });
103103

104104
await msg.guild.channels.cache
105105
.get(logID)

commands/Tickets/new-ticket.js

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,35 @@ class NewTicket extends Command {
1616
}
1717

1818
async run(msg, args) {
19-
if (!(await db.get(`servers.${msg.guild.id}.tickets`)))
19+
if (!(await db.get(`servers.${msg.guild.id}.tickets`))) {
2020
return msg.channel.send('The ticket system has not been setup in this server.');
21+
}
2122
const { catID, logID, roleID } = await db.get(`servers.${msg.guild.id}.tickets`);
2223

2324
if (!msg.guild.channels.cache.get(catID)) {
2425
return msg.channel.send('Please re-run `setup`, the ticket category is missing.');
2526
}
2627

2728
if (!msg.guild.members.me.permissions.has('ManageChannels')) {
28-
return msg.channel.send('The bot is missing Manage Channels permission.');
29+
return msg.channel.send('Please let a server administrator know the bot is missing Manage Channels permission.');
2930
}
3031
if (!msg.guild.members.me.permissions.has('ManageRoles')) {
31-
return msg.channel.send('The bot is missing Manage Roles permission');
32+
return msg.channel.send('Please let a server administrator know the bot is missing Manage Roles permission');
3233
}
3334
if (!msg.guild.members.me.permissions.has('ManageMessages')) {
34-
return msg.channel.send('The bot is missing Manage Messages permission');
35+
return msg.channel.send('Please let a server administrator know the bot is missing Manage Messages permission');
3536
}
3637

3738
if (msg.channel.name.startsWith('ticket')) return msg.channel.send("You're already in a ticket, silly.");
3839
if (!args || args.length < 1) {
3940
return msg.channel.send(`Please provide a reason. Usage: ${msg.settings.prefix}new-ticket <reason>`);
4041
}
4142

42-
const tix = await this.client.util.getTickets(msg.author.id, msg);
43-
if (tix.length > 2) {
44-
return msg.channel.send(
45-
`Sorry ${msg.author}, you already have three or more tickets open. Please close one before making a new one.`,
43+
const userTickets = await this.client.util.getTickets(msg.author.id, msg);
44+
const ticketLimit = (await db.get(`servers.${msg.guild.id}.tickets.limit`)) || 3;
45+
if (userTickets.length >= ticketLimit) {
46+
return msg.reply(
47+
`Sorry ${msg.member.displayName}, you already have ${userTickets.length} of ${ticketLimit} tickets open. Please close one before making a new one.`,
4648
);
4749
}
4850

@@ -68,20 +70,16 @@ class NewTicket extends Command {
6870
},
6971
];
7072

71-
const count = (await db.get(`servers.${msg.guild.id}.tickets.count`)) || 0;
72-
await db.set(`servers.${msg.guild.id}.tickets.count`, count + 1);
73-
74-
let str = msg.member.displayName;
75-
str = str.replace(/[^a-zA-Z\d:]/g, '');
76-
if (str.length === 0) {
77-
str = msg.member.user.username.replace(/[^a-zA-Z\d:]/g, '');
78-
if (str.length === 0) {
79-
str = (Math.random().toString(36) + '00000000000000000').slice(2, 5);
73+
let channelName = msg.member.displayName;
74+
channelName = channelName.replace(/[^a-zA-Z\d:]/g, '');
75+
if (channelName.length === 0) {
76+
channelName = msg.member.user.username.replace(/[^a-zA-Z\d:]/g, '');
77+
if (channelName.length === 0) {
78+
channelName = (Math.random().toString(36) + '00000000000000000').slice(2, 5);
8079
}
8180
}
8281

83-
str = str.toLowerCase();
84-
const tName = `ticket-${str}-${count}`;
82+
const tName = `ticket-${channelName}`;
8583
const tixChan = await msg.guild.channels.create({
8684
name: tName,
8785
type: ChannelType.GuildText,
@@ -132,13 +130,11 @@ class NewTicket extends Command {
132130
if (!tixChan.permissionsFor(this.client.user.id).has('MentionEveryone')) {
133131
role.setMentionable(true);
134132
tixChan.send({ content: role.toString(), embeds: [chanEmbed] });
135-
role.setMentionable(false);
136-
} else {
137-
tixChan.send({ content: role.toString(), embeds: [chanEmbed] });
133+
return role.setMentionable(false);
138134
}
139-
} else {
140-
tixChan.send({ content: role.toString(), embeds: [chanEmbed] });
141135
}
136+
137+
return tixChan.send({ content: role.toString(), embeds: [chanEmbed] });
142138
}
143139
}
144140

0 commit comments

Comments
 (0)