From 5b6d53266196ec47ecd1ac9644672b83a4cdc101 Mon Sep 17 00:00:00 2001 From: samkintop Date: Sat, 4 Apr 2026 03:19:52 +0000 Subject: [PATCH 1/6] fix: wrap escalation email in try/catch --- handlers/commands.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/handlers/commands.js b/handlers/commands.js index e2de7f8..719e819 100644 --- a/handlers/commands.js +++ b/handlers/commands.js @@ -149,13 +149,17 @@ async function runEscalation(interaction, ticket, nextTier, reason) { }); if (!isDiscordTicket && ticket.gmailThreadId) { - const emailBody = CONFIG.ESCALATION_MESSAGE.replace(/\{support_name\}/g, CONFIG.SUPPORT_NAME) + (reason ? `\n\nReason: ${reason}` : ''); - await sendTicketNotificationEmail( - ticket, - `Ticket escalated to ${nextTier === 1 ? 'tier 2' : 'tier 3'}`, - emailBody, - interaction.member?.displayName || interaction.user.username - ); + try { + const emailBody = CONFIG.ESCALATION_MESSAGE.replace(/\{support_name\}/g, CONFIG.SUPPORT_NAME) + (reason ? `\n\nReason: ${reason}` : ''); + await sendTicketNotificationEmail( + ticket, + `Ticket escalated to ${nextTier === 1 ? 'tier 2' : 'tier 3'}`, + emailBody, + interaction.member?.displayName || interaction.user.username + ); + } catch (emailErr) { + console.error('Escalation email failed (non-fatal):', emailErr.message); + } } if (nextTier === 2 && ticket.welcomeMessageId) { @@ -1204,4 +1208,4 @@ async function handleAutocomplete(interaction) { } } -module.exports = { handleCommand, handleContextMenu, handleAutocomplete, runEscalation, runDeescalation }; +module.exports = { handleCommand, handleContextMenu, handleAutocomplete, runEscalation, runDeescalation }; \ No newline at end of file From 59202e02492faced1935b0edf6fc10dded4b4d82 Mon Sep 17 00:00:00 2001 From: indifferentketchup Date: Sat, 4 Apr 2026 04:08:50 +0000 Subject: [PATCH 2/6] auto: README.md 2026-04-04T04:08:50Z --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3759f0..900a0e7 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Built for game-server hosting support (Indifferent Broccoli), with game detectio --- ## Features - +#### ### Email → Discord - Polls Gmail about every **30 seconds** for new mail. From 9a39844b9561501624e7f604b10032ae5fef3aa5 Mon Sep 17 00:00:00 2001 From: indifferentketchup Date: Sat, 4 Apr 2026 04:09:37 +0000 Subject: [PATCH 3/6] auto: README.md 2026-04-04T04:09:37Z --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 900a0e7..cd1ea61 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Built for game-server hosting support (Indifferent Broccoli), with game detectio --- ## Features -#### +######## ### Email → Discord - Polls Gmail about every **30 seconds** for new mail. From ce3546e1915cf40ba4ad4d91ec78a1639c5e5692 Mon Sep 17 00:00:00 2001 From: indifferentketchup Date: Sat, 4 Apr 2026 05:20:06 +0000 Subject: [PATCH 4/6] auto: README.md 2026-04-04T05:20:06Z --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd1ea61..4741c3d 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Built for game-server hosting support (Indifferent Broccoli), with game detectio --- ## Features -######## +########### ### Email → Discord - Polls Gmail about every **30 seconds** for new mail. From d187f4573219444e2eedf8f6d375f8756ad35027 Mon Sep 17 00:00:00 2001 From: indifferentketchup Date: Sun, 5 Apr 2026 03:40:03 +0000 Subject: [PATCH 5/6] test --- handlers/buttons.js | 4 ++-- services/tickets.js | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/handlers/buttons.js b/handlers/buttons.js index 6bb4939..77ea5c8 100644 --- a/handlers/buttons.js +++ b/handlers/buttons.js @@ -304,7 +304,7 @@ async function handleClaim(interaction, ticket) { const renameInfo = await canRename(freshTicket); if (renameInfo.ok) { const newName = makeTicketName( - { escalated: !!freshTicket.escalated, claimed: true }, + { escalated: !!freshTicket.escalated, claimed: true, claimedBy: claimerLabel }, freshTicket, guild ); @@ -328,7 +328,7 @@ async function handleClaim(interaction, ticket) { interaction.guild, freshTicket, interaction.user.id, - interaction.channel.name + claimerLabel ); if (staffChan) { await Ticket.updateOne( diff --git a/services/tickets.js b/services/tickets.js index f7a6d20..95703be 100644 --- a/services/tickets.js +++ b/services/tickets.js @@ -33,7 +33,7 @@ function getSenderLocal(senderEmail) { return (senderEmail || 'unknown').split('@')[0].toLowerCase(); } -function makeTicketName({ escalated, claimed }, ticket, guild) { +function makeTicketName({ escalated, claimed, claimedBy }, ticket, guild) { const senderLocal = getSenderLocal(ticket.senderEmail); const num = ticket.ticketNumber || 1; if (escalated) { @@ -41,7 +41,10 @@ function makeTicketName({ escalated, claimed }, ticket, guild) { ? `e-ticket-${senderLocal}-${num}` : `escalated-ticket-${senderLocal}-${num}`; } - return `ticket-${senderLocal}-${num}`; + if (claimed) { + return `${senderLocal}-${num}`; + } + return `ticket-${num}`; } async function canRename(ticket) { From 840923bd4a0732d9ad25ac6b131526f8f531e372 Mon Sep 17 00:00:00 2001 From: indifferentketchup Date: Sun, 5 Apr 2026 03:43:34 +0000 Subject: [PATCH 6/6] chore: sync package-lock --- package-lock.json | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 7fb4285..359381c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "express": "^5.2.1", "googleapis": "^171.4.0", "mongodb": "^7.1.0", - "mongoose": "^6.12.0" + "mongoose": "^6.12.0", + "p-queue": "^6.6.2" } }, "node_modules/@aws-crypto/sha256-browser": { @@ -2464,6 +2465,11 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -3366,6 +3372,40 @@ "wrappy": "1" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",