Skip to content

Commit

Permalink
fix: ticket closing
Browse files Browse the repository at this point in the history
  • Loading branch information
eartharoid committed Jan 30, 2023
1 parent a60c998 commit d1c3620
Show file tree
Hide file tree
Showing 15 changed files with 213 additions and 100 deletions.
3 changes: 1 addition & 2 deletions .gitignore
Expand Up @@ -6,8 +6,7 @@ prisma/

# files
*.env*
*.db
*.db-journal
*.db*
*.log
*-lock.*
user/config.yml
Expand Down
4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -43,7 +43,7 @@
"@fastify/http-proxy": "^8.4.0",
"@fastify/jwt": "^5.0.1",
"@fastify/oauth2": "^5.1.0",
"@prisma/client": "^4.8.1",
"@prisma/client": "^4.9.0",
"cryptr": "^6.1.0",
"discord.js": "^14.7.1",
"dotenv": "^16.0.3",
Expand All @@ -60,7 +60,7 @@
"node-emoji": "^1.11.0",
"object-diffy": "^1.0.4",
"pad": "^3.2.0",
"prisma": "^4.8.1",
"prisma": "^4.9.0",
"semver": "^7.3.8",
"terminal-link": "^2.1.1",
"yaml": "^1.10.2"
Expand Down
67 changes: 40 additions & 27 deletions src/buttons/close.js
Expand Up @@ -18,25 +18,32 @@ module.exports = class CloseButton extends Button {
/** @type {import("client")} */
const client = this.client;

// the close button on th opening message, the same as using /close
if (id.accepted === undefined) {
// the close button on the opening message, the same as using /close
await client.tickets.beforeRequestClose(interaction);
} else {
await interaction.deferReply();
const ticket = await client.prisma.ticket.findUnique({
include: {
category: true,
guild: true,
},
where: { id: interaction.channel.id },
});
const ticket = await client.tickets.getTicket(interaction.channel.id);
const getMessage = client.i18n.getLocale(ticket.guild.locale);
const staff = await isStaff(interaction.guild, interaction.user.id);

if (id.expect === 'staff' && !staff) {
return; // TODO: please wait for staff to close the ticket
} else if (id.expect === 'user' && staff) {
return; // TODO: please wait for the user to respond
return await interaction.reply({
embeds: [
new ExtendedEmbedBuilder()
.setColor(ticket.guild.errorColour)
.setDescription(getMessage('ticket.close.wait_for_staff')),
],
ephemeral: true,
});
} else if (id.expect === 'user' && interaction.user.id !== ticket.createdById) {
return await interaction.reply({
embeds: [
new ExtendedEmbedBuilder()
.setColor(ticket.guild.errorColour)
.setDescription(getMessage('ticket.close.wait_for_user')),
],
ephemeral: true,
});
} else {
if (id.accepted) {
if (
Expand All @@ -46,25 +53,31 @@ module.exports = class CloseButton extends Button {
) {
return await interaction.showModal(client.tickets.buildFeedbackModal(ticket.guild.locale, { next: 'acceptClose' }));
} else {
await interaction.deferReply();
await client.tickets.acceptClose(interaction);
}
} else {
// TODO: reply
if (client.tickets.$stale.has(ticket.id)) {
await interaction.channel.messages.edit(
client.tickets.$stale.get(ticket.id).message.id,
{
components: [],
embeds: [
new ExtendedEmbedBuilder({
iconURL: interaction.guild.iconURL(),
text: ticket.guild.footer,
})
.setColor(ticket.guild.errorColour)
.setDescription(getMessage('ticket.close.rejected', { user: interaction.user.toString() })),
],
},
);
client.tickets.$stale.delete(ticket.id);
try {
await interaction.channel.messages.edit(
client.tickets.$stale.get(ticket.id).message.id,
{
components: [],
embeds: [
new ExtendedEmbedBuilder({
iconURL: interaction.guild.iconURL(),
text: ticket.guild.footer,
})
.setColor(ticket.guild.errorColour)
.setDescription(getMessage('ticket.close.rejected', { user: interaction.user.toString() }))
.setFooter({ text: null }),
],
},
);
} finally { // this should run regardless of whatever happens above
client.tickets.$stale.delete(ticket.id);
}
}
}
}
Expand Down
7 changes: 6 additions & 1 deletion src/client.js
Expand Up @@ -52,7 +52,12 @@ module.exports = class Client extends FrameworkClient {
async login(token) {
/** @type {PrismaClient} */
this.prisma = new PrismaClient();
if (process.env.DB_PROVIDER === 'sqlite') this.prisma.$use(sqliteMiddleware);
if (process.env.DB_PROVIDER === 'sqlite') {
this.prisma.$use(sqliteMiddleware);
// make sqlite faster (https://www.sqlite.org/wal.html),
// and the missing parentheses are not a mistake, `$queryRaw` is a tagged template literal
this.log.debug(await this.prisma.$queryRaw`PRAGMA journal_mode=WAL;`);
}
this.keyv = new Keyv();
return super.login(token);
}
Expand Down
4 changes: 2 additions & 2 deletions src/commands/slash/move.js
Expand Up @@ -91,10 +91,10 @@ module.exports = class MoveSlashCommand extends SlashCommand {
$oldCategory.total--;
$oldCategory[ticket.createdById]--;

if (!$newCategory.total) $newCategory.total = 0;
$newCategory.total ||= 0;
$newCategory.total++;

if (!$newCategory[ticket.createdById]) $newCategory[ticket.createdById] = 0;
$newCategory[ticket.createdById] ||= 0;
$newCategory[ticket.createdById]++;

await interaction.channel.setParent(discordCategory, {
Expand Down
5 changes: 5 additions & 0 deletions src/i18n/en-GB.yml
Expand Up @@ -349,6 +349,9 @@ ticket:
no_value: "*No response*"
claimed: 🙌 {user} has claimed this ticket.
close:
closed:
description: This channel will be deleted in a few seconds...
title: ✅ Ticket closed
forbidden:
description: You don't have permission to close this ticket.
title: ❌ Error
Expand All @@ -363,6 +366,8 @@ ticket:
title: ❓ Can this ticket be closed?
user_request:
title: ❓ {requestedBy} wants to close this ticket
wait_for_staff: ✋ Please wait for staff to close this ticket.
wait_for_user: ✋ Please wait for the user to respond.
created:
description: "Your ticket channel has been created: {channel}."
title: ✅ Ticket created
Expand Down
4 changes: 2 additions & 2 deletions src/lib/tickets/archiver.js
Expand Up @@ -2,7 +2,7 @@ const Cryptr = require('cryptr');
const { encrypt } = new Cryptr(process.env.ENCRYPTION_KEY);

/**
* Returns highest (roles.highest) hoisted role , or everyone
* Returns highest (roles.highest) hoisted role, or everyone
* @param {import("discord.js").GuildMember} member
* @returns {import("discord.js").Role}
*/
Expand Down Expand Up @@ -121,7 +121,7 @@ module.exports = class TicketArchiver {
id: message.id,
};

await this.client.prisma.ticket.update({
return await this.client.prisma.ticket.update({
data: {
archivedChannels: {
upsert: channels.map(channel => {
Expand Down

0 comments on commit d1c3620

Please sign in to comment.