Split the original 309-line poll() into single-responsibility helpers and a thin orchestrator. No behavior change — every Gmail API call, Discord call, DB write, and log line stays in the same order with the same arguments. Helpers extracted (module-private): - locateGuild(client) — DISCORD_GUILD_ID lookup with fallback warning. - parseGmailMessage(email) — header parsing, body decode, dual cleanup (firstBody for new-ticket message, followupBody for thread append). - findOrCreateTicketChannel(guild, parsed, number) — category resolution + channel.create with the existing two-stage error handling. - linkPreviousTranscripts(ticketChan, threadId, client) — best-effort prior-transcript link on reopen. - markGmailMessageRead(gmail, msgRef) — wraps the batchModify call used in five places across the original. - oauthSuspendIfPermanent(err, client) — invalid_grant/invalid_client classify, suspend polling, clear interval, DM admin once. Returns bool. poll() is now the orchestrator: list → locate guild → for each message, parse → look up existing ticket → branch (append-followup vs new-ticket flow) → mark read. The new-ticket branch stays inline in poll() per the "keep poll() as orchestration" intent.
14 KiB
14 KiB