Email ticketing fixes, comms polish, and .env cleanup

Inbound:
- Gmail poll query is:unread in:inbox (was category:primary, which matched
  nothing on a no-tabs Workspace inbox)

Outbound email:
- Closed/escalation auto-emails editable via TICKET_CLOSE_MESSAGE and new
  TICKET_ESCALATION_EMAIL_MESSAGE; drop the staff signature from closing emails
- Replies quote the customer's latest message (gmail_quote markup so clients
  collapse it), embed custom emoji inline via CID attachment, and strip Discord
  role mentions
- Tagline spacing fix in the company signature

Discord side:
- Suppress all mentions in log + transcript posts (no more pinging on close)
- Drop the staff-role ping from new-ticket and follow-up notifications
- Ticket channels inherit category permissions instead of setting per-channel
  overwrites (removes the Manage Roles requirement)

Gmail folders:
- Folder/label routing (gmailLabels.js) with /folder; close files to Complete

Config:
- Remove ~56 stale .env keys for long-removed features; refresh stale copy

Docs:
- Design specs for folder routing, email-flow toggle, and per-staff metrics
This commit is contained in:
2026-06-04 22:05:20 +00:00
parent 3e20f9cf86
commit 2ccdbf72aa
19 changed files with 1224 additions and 83 deletions

View File

@@ -368,6 +368,41 @@ async function registerCommands() {
)
),
new SlashCommandBuilder()
.setName('email')
.setDescription('Turn the inbound email flow (Gmail polling) on or off, or check its status')
.setContexts([InteractionContextType.Guild])
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
.setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild)
.addSubcommand(sub =>
sub.setName('on').setDescription('Start polling the inbox and creating tickets from email')
)
.addSubcommand(sub =>
sub.setName('off').setDescription('Stop polling the inbox (outbound emails still send)')
)
.addSubcommand(sub =>
sub.setName('status').setDescription('Show whether the inbound email flow is on or off')
),
new SlashCommandBuilder()
.setName('folder')
.setDescription("Move this ticket's email thread into a Gmail folder")
.setContexts([InteractionContextType.Guild])
.setIntegrationTypes([ApplicationIntegrationType.GuildInstall])
.setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages)
.addStringOption(opt =>
opt
.setName('destination')
.setDescription('Target folder')
.setRequired(true)
.addChoices(
{ name: 'For Jake', value: 'FOR_JAKE' },
{ name: 'Spam', value: 'SPAM' },
{ name: 'Dashboard Errors', value: 'DASHBOARD_ERRORS' },
{ name: 'Partnership Offers', value: 'PARTNERSHIP_OFFERS' }
)
),
new SlashCommandBuilder()
.setName('cancel-close')
.setDescription('Cancel a pending force-close countdown')