Add other checks

This commit is contained in:
Isaac 2022-08-09 01:19:03 +01:00
parent 913465a165
commit 1992072493
No known key found for this signature in database
GPG Key ID: F4EAABEB0FFCC06A
2 changed files with 87 additions and 33 deletions

View File

@ -178,6 +178,21 @@ misc:
blocked: blocked:
description: You are not allowed to create tickets. description: You are not allowed to create tickets.
title: ❌ Blocked title: ❌ Blocked
category_full:
description: |
The category has reached its maximum capacity.
Please try again later.
title: ❌ Category full
cooldown:
description: Please wait {time} before creating another ticket in this category.
title: ❌ Please wait
member_limit:
description:
- Please use your existing ticket or close it before creating another.
- Please close a ticket before creating another.
title:
- ❌ You already have a ticket
- ❌ You already have %d open tickets
missing_roles: missing_roles:
description: You do not have the roles required to be able to create a ticket in this category. description: You do not have the roles required to be able to create a ticket in this category.
title: ❌ Insufficient roles title: ❌ Insufficient roles

View File

@ -89,56 +89,95 @@ module.exports = class TicketManager {
ephemeral: true, ephemeral: true,
}); });
} else { } else {
this.client.keyv.set(rlKey, true, ms('10s')); this.client.keyv.set(rlKey, true, ms('5s'));
} }
const sendError = name => interaction.reply({
embeds: [
new ExtendedEmbedBuilder({
iconURL: interaction.guild.iconURL(),
text: category.guild.footer,
})
.setColor(category.guild.errorColour)
.setTitle(getMessage(`misc.${name}.title`))
.setDescription(getMessage(`misc.${name}.description`)),
],
ephemeral: true,
});
/** @type {import("discord.js").Guild} */ /** @type {import("discord.js").Guild} */
const guild = this.client.guilds.cache.get(category.guild.id); const guild = this.client.guilds.cache.get(category.guild.id);
const member = interaction.member ?? await guild.members.fetch(interaction.user.id); const member = interaction.member ?? await guild.members.fetch(interaction.user.id);
if (category.guild.blocklist.length !== 0) { if (category.guild.blocklist.length !== 0) {
const blocked = category.guild.blocklist.some(r => member.roles.cache.has(r)); const blocked = category.guild.blocklist.some(r => member.roles.cache.has(r));
if (blocked) { if (blocked) return await sendError('blocked');
return await interaction.reply({
embeds: [
new ExtendedEmbedBuilder({
iconURL: interaction.guild.iconURL(),
text: category.guild.footer,
})
.setColor(category.guild.errorColour)
.setTitle(getMessage('misc.blocked.title'))
.setDescription(getMessage('misc.blocked.description')),
],
ephemeral: true,
});
}
} }
if (category.requiredRoles.length !== 0) { if (category.requiredRoles.length !== 0) {
const missing = category.requiredRoles.some(r => !member.roles.cache.has(r)); const missing = category.requiredRoles.some(r => !member.roles.cache.has(r));
if (missing) { if (missing) return await sendError('missing_roles');
return await interaction.reply({
embeds: [
new ExtendedEmbedBuilder({
iconURL: interaction.guild.iconURL(),
text: category.guild.footer,
})
.setColor(category.guild.errorColour)
.setTitle(getMessage('misc.missing_roles.title'))
.setDescription(getMessage('misc.missing_roles.description')),
],
ephemeral: true,
});
}
} }
// TODO: if discordCategory has 50 channels -> stop const discordCategory = guild.channels.cache.get(category.discordCategory);
if (discordCategory.children.cache.size === 50) return await sendError('category_full');
// TODO: if category has max channels -> stop // TODO: store locally and sync regularly so this isn't done during an interaction?
const totalCount = await this.client.prisma.ticket.count({
where: {
categoryId: category.id,
open: true,
},
});
if (totalCount >= category.totalLimit) return await sendError('category_full');
// TODO: if member has max -> stop const memberCount = await this.client.prisma.ticket.count({
where: {
categoryId: category.id,
createdById: interaction.user.id,
open: true,
},
});
// TODO: if cooldown -> stop if (memberCount >= category.memberLimit) {
return await interaction.reply({
embeds: [
new ExtendedEmbedBuilder({
iconURL: interaction.guild.iconURL(),
text: category.guild.footer,
})
.setColor(category.guild.errorColour)
.setTitle(getMessage('misc.member_limit.title', memberCount, memberCount))
.setDescription(getMessage('misc.member_limit.description', memberCount)),
],
ephemeral: true,
});
}
const lastTicket = await this.client.prisma.ticket.findFirst({
orderBy: [{ closedAt: 'desc' }],
select: { closedAt: true },
where: {
categoryId: category.id,
createdById: interaction.user.id,
open: false,
},
});
if (Date.now() - lastTicket.closedAt < category.cooldown) {
return await interaction.reply({
embeds: [
new ExtendedEmbedBuilder({
iconURL: interaction.guild.iconURL(),
text: category.guild.footer,
})
.setColor(category.guild.errorColour)
.setTitle(getMessage('misc.cooldown.title'))
.setDescription(getMessage('misc.cooldown.description', { time: ms(category.cooldown - (Date.now() - lastTicket.closedAt)) })),
],
ephemeral: true,
});
}
if (category.questions.length >= 1) { if (category.questions.length >= 1) {
await interaction.showModal( await interaction.showModal(