Sync broccolini-bot: rename from zammad, docs in docs/, security gitignore, remove zammad deps

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
samkintop
2026-02-12 02:56:00 -06:00
parent 08a16b4a75
commit 29a13768f7
37 changed files with 1093 additions and 3229 deletions

View File

@@ -9,7 +9,7 @@ const {
EmbedBuilder
} = require('discord.js');
const { mongoose } = require('./db-connection');
const { CONFIG, ZAMMAD, GAME_NAME_TO_KEY } = require('./config');
const { CONFIG, GAME_NAME_TO_KEY } = require('./config');
const {
getCleanBody,
extractRawEmail,
@@ -19,14 +19,12 @@ const {
getFormattedDate
} = require('./utils');
const { getGmailClient } = require('./services/gmail');
const { createZammadTicket, updateZammadUserDiscordId } = require('./services/zammad');
const { getNextTicketNumber, saveZammadId, checkTicketLimits, pickTicketCategoryId, createEmailTicketAsThread } = require('./services/tickets');
const { getNextTicketNumber, checkTicketLimits, pickTicketCategoryId, createEmailTicketAsThread } = require('./services/tickets');
const { getEmailRouting } = require('./services/guildSettings');
const { logError } = require('./services/debugLog');
const Ticket = mongoose.model('Ticket');
const Transcript = mongoose.model('Transcript');
const User = mongoose.model('User');
/**
* Poll Gmail for unread primary-inbox messages and route them to Discord.
@@ -216,66 +214,27 @@ async function poll(client) {
.setStyle(ButtonStyle.Secondary)
);
const embed = new EmbedBuilder().setColor(CONFIG.EMBED_COLOR_OPEN).addFields({
name: 'Ticket Info',
value:
`**Name:** ${sName}\n` +
`**Email:** ${sEmail}\n` +
`**Date:** ${getFormattedDate()}\n` +
`**Game:** ${detectedGame}\n` +
`**Subject:** ${subject || 'No subject'}`
});
const welcomeEmbed = new EmbedBuilder()
.setDescription(CONFIG.TICKET_WELCOME_MESSAGE)
.setColor(CONFIG.EMBED_COLOR_INFO);
const ticketInfoEmbed = new EmbedBuilder()
.setColor(CONFIG.EMBED_COLOR_INFO)
.addFields({
name: 'Ticket Info',
value:
`**Name:** ${sName}\n` +
`**Email:** ${sEmail}\n` +
`**Date:** ${getFormattedDate()}\n` +
`**Game:** ${detectedGame}\n` +
`**Subject:** ${subject || 'No subject'}`
});
await ticketChan.send({
content: `<@&${CONFIG.ROLE_ID_TO_PING}>`,
embeds: [embed],
embeds: [welcomeEmbed, ticketInfoEmbed],
components: [buttons]
});
// Look up website User by email for discordID
let discordIdFromUser = null;
try {
const websiteUser = await User.findOne({ email: sEmail.toLowerCase() }).select('discordID').lean();
if (websiteUser?.discordID) discordIdFromUser = websiteUser.discordID;
} catch (_) { /* ignore */ }
// Create Zammad ticket
try {
const zammadTicket = await createZammadTicket({
subject,
body: firstBody,
email: sEmail,
name: sName,
gameName: detectedGame,
gameKey: gameKey,
group: ZAMMAD.EMAIL_GROUP
});
if (zammadTicket?.id) {
await saveZammadId(email.data.threadId, zammadTicket.id);
}
if (zammadTicket?.customer_id && discordIdFromUser) {
try {
await updateZammadUserDiscordId(zammadTicket.customer_id, discordIdFromUser);
} catch (zErr) {
console.error('Zammad user discord_id update failed (add discord_id on User in Object Manager?):', zErr.response?.data || zErr.message);
}
}
} catch (e) {
console.error('--- ZAMMAD API ERROR DETAILS ---');
if (e.response) {
console.error(`Status: ${e.response.status}`);
console.error('Response Data:', JSON.stringify(e.response.data, null, 2));
console.error('Headers:', e.response.headers);
} else if (e.request) {
console.error('No response received. Request details:', e.request);
} else {
console.error('Error setting up request:', e.message);
}
console.error('--------------------------------');
}
// On reopen, link previous transcripts
if (isReopened) {
try {