simplify: prune dead code, dedup gmail send, drop neutered log stubs
- Remove no-op log stubs (logGmail, logAutomation, logSecurity, logSystem) and ~17 callsites; dead counters in tickets.js and gmail-poll.js go too - Dedup three near-identical Gmail send paths into sendThreadedEmail helper - Drop dead Mongoose fields: broccoliniTicketId, lastSyncedBroccoliniArticleId, renameCount, renameWindowStart, reminderSent, staffChannelId, unclaimedRemindersSent, lastMessageAuthorIsStaff - Drop dead config fields and their .env.example entries - Inline api/botClient.js (3-line wrapper, 2 callers) - Trim unused exports across utils.js, tickets.js, configSchema.js, debugLog.js - Fix handlers/messages.js to use isStaff() — old partial check ignored ADDITIONAL_STAFF_ROLES, so those members were treated as customers - Drop unused deps p-queue + dotenv-expand; move mongodb to devDependencies Net: -583 LOC source + -57 LOC lockfile. All 23 modules load clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
68
config.js
68
config.js
@@ -1,25 +1,9 @@
|
||||
/**
|
||||
* Broccolini Bot configuration and game lists.
|
||||
* Load dotenv so env is available when this module is required first.
|
||||
* dotenv-expand resolves ${NGROK_URL} etc. in .env.
|
||||
*
|
||||
* Never commit .env; agents must not modify .env without explicit user confirmation.
|
||||
*/
|
||||
const path = require('path');
|
||||
const dotenv = require('dotenv');
|
||||
const dotenvExpand = require('dotenv-expand');
|
||||
|
||||
const parsed = dotenv.config({ debug: process.env.NODE_ENV === 'development' });
|
||||
dotenvExpand.expand(parsed);
|
||||
// Also load repo-root .env; only non-empty values override (so empty DISCORD_BOT_TOKEN= in root does not wipe app .env)
|
||||
const rootEnv = path.resolve(process.cwd(), '..', '.env');
|
||||
const rootParsed = dotenv.config({ path: rootEnv });
|
||||
if (!rootParsed.error && rootParsed.parsed) {
|
||||
for (const [k, v] of Object.entries(rootParsed.parsed)) {
|
||||
if (v != null && String(v).trim() !== '') process.env[k] = v;
|
||||
}
|
||||
dotenvExpand.expand(rootParsed);
|
||||
}
|
||||
require('dotenv').config({ debug: process.env.NODE_ENV === 'development' });
|
||||
|
||||
function toInt(v, fallback) {
|
||||
const n = parseInt(v, 10);
|
||||
@@ -31,23 +15,12 @@ const CONFIG = {
|
||||
DISCORD_GUILD_ID: process.env.DISCORD_GUILD_ID || null,
|
||||
TICKET_CATEGORY_ID: process.env.TICKET_CATEGORY_ID,
|
||||
TICKET_CATEGORY_NAME: process.env.TICKET_CATEGORY_NAME || 'Open Tickets',
|
||||
TICKET_T2_CATEGORY_NAME: process.env.TICKET_T2_CATEGORY_NAME || 'Tier 2 Escalated Tickets',
|
||||
TICKET_T3_CATEGORY_NAME: process.env.TICKET_T3_CATEGORY_NAME || 'Tier 3 Escalated Tickets',
|
||||
EMAIL_TICKET_OVERFLOW_CATEGORY_IDS: (process.env.EMAIL_TICKET_OVERFLOW_CATEGORY_IDS || '')
|
||||
.split(',')
|
||||
.map(s => s.trim())
|
||||
.filter(Boolean),
|
||||
DISCORD_TICKET_CATEGORY_ID: process.env.DISCORD_TICKET_CATEGORY_ID || process.env.TICKET_CATEGORY_ID,
|
||||
DISCORD_TICKET_OVERFLOW_CATEGORY_IDS: (process.env.DISCORD_TICKET_OVERFLOW_CATEGORY_IDS || '')
|
||||
.split(',')
|
||||
.map(s => s.trim())
|
||||
.filter(Boolean),
|
||||
ROLE_ID_TO_PING: process.env.ROLE_ID_TO_PING,
|
||||
ROLE_TO_PING_ID: process.env.ROLE_ID_TO_PING || process.env.ROLE_TO_PING_ID,
|
||||
TRANSCRIPT_CHAN: process.env.TRANSCRIPT_CHANNEL_ID,
|
||||
LOG_CHAN: process.env.LOGGING_CHANNEL_ID,
|
||||
DEBUGGING_CHANNEL_ID: process.env.DEBUGGING_CHANNEL_ID || null,
|
||||
DISCORD_CHANNEL_ID: process.env.DISCORD_CHANNEL_ID || null,
|
||||
CLIENT_ID: process.env.DISCORD_APPLICATION_ID,
|
||||
REFRESH_TOKEN: process.env.REFRESH_TOKEN,
|
||||
MY_EMAIL: (process.env.MY_EMAIL || '').toLowerCase(),
|
||||
@@ -75,9 +48,7 @@ const CONFIG = {
|
||||
DISCORD_AUTO_CLOSE_MESSAGE: process.env.DISCORD_AUTO_CLOSE_MESSAGE || 'This ticket was closed due to inactivity. If you still need assistance, please open a new ticket.',
|
||||
AUTO_CLOSE_ENABLED: process.env.AUTO_CLOSE_ENABLED === 'true',
|
||||
AUTO_CLOSE_AFTER_HOURS: toInt(process.env.AUTO_CLOSE_AFTER_HOURS, 72),
|
||||
AUTO_CLOSE_MESSAGE: process.env.AUTO_CLOSE_MESSAGE || 'This ticket has been automatically closed due to inactivity.',
|
||||
GLOBAL_TICKET_LIMIT: toInt(process.env.GLOBAL_TICKET_LIMIT, 5),
|
||||
TICKET_LIMIT_PER_CATEGORY: toInt(process.env.TICKET_LIMIT_PER_CATEGORY, 3),
|
||||
RATE_LIMIT_TICKETS_PER_USER: toInt(process.env.RATE_LIMIT_TICKETS_PER_USER, 0),
|
||||
RATE_LIMIT_WINDOW_MINUTES: toInt(process.env.RATE_LIMIT_WINDOW_MINUTES, 60),
|
||||
BLACKLISTED_ROLES: (process.env.BLACKLISTED_ROLES || '').split(',').map(r => r.trim()).filter(Boolean),
|
||||
@@ -103,7 +74,6 @@ const CONFIG = {
|
||||
BUTTON_EMOJI_CLAIM: process.env.BUTTON_EMOJI_CLAIM || '📌',
|
||||
BUTTON_EMOJI_UNCLAIM: process.env.BUTTON_EMOJI_UNCLAIM || '🔓',
|
||||
EMBED_COLOR_OPEN: toInt(process.env.EMBED_COLOR_OPEN, 0x00FF00),
|
||||
EMBED_COLOR_CLOSED: toInt(process.env.EMBED_COLOR_CLOSED, 0xFF0000),
|
||||
EMBED_COLOR_CLAIMED: toInt(process.env.EMBED_COLOR_CLAIMED, 0xFFFF00),
|
||||
EMBED_COLOR_ESCALATED: toInt(process.env.EMBED_COLOR_ESCALATED, 0xFF6600),
|
||||
EMBED_COLOR_INFO: toInt(process.env.EMBED_COLOR_INFO, 0x1e2124),
|
||||
@@ -142,42 +112,8 @@ const GAME_ALIASES = {
|
||||
CS2: 'Counter-Strike 2'
|
||||
};
|
||||
|
||||
const GAME_NAME_TO_KEY = {
|
||||
'Project Zomboid': 'project_zomboid',
|
||||
'Satisfactory': 'satisfactory',
|
||||
'Palworld': 'palworld',
|
||||
'Minecraft': 'minecraft',
|
||||
'Valheim': 'valheim',
|
||||
'Enshrouded': 'enshrouded',
|
||||
'7 Days to Die': '7_days_to_die',
|
||||
'Hytale': 'hytale',
|
||||
'ICARUS': 'icarus',
|
||||
'Abiotic Factor': 'abiotic_factor',
|
||||
'ARK: Survival Evolved': 'ark_survival_evolved',
|
||||
'Conan Exiles': 'conan_exiles',
|
||||
'Core Keeper': 'core_keeper',
|
||||
'Counter-Strike 2': 'counter_strike_2',
|
||||
'DayZ': 'dayz',
|
||||
'ECO': 'eco',
|
||||
'Factorio': 'factorio',
|
||||
'FiveM': 'fivem',
|
||||
'The Front': 'the_front',
|
||||
"Garry's Mod": 'garrys_mod',
|
||||
'Necesse': 'necesse',
|
||||
'Rust': 'rust',
|
||||
'Sons of the Forest': 'sons_of_the_forest',
|
||||
'Soulmask': 'soulmask',
|
||||
'Star Rupture': 'star_rupture',
|
||||
'Terraria': 'terraria',
|
||||
'VEIN': 'vein',
|
||||
'Vintage Story': 'vintage_story',
|
||||
'Voyagers of Nera': 'voyagers_of_nera',
|
||||
'V Rising': 'v_rising'
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
CONFIG,
|
||||
GAME_NAMES,
|
||||
GAME_ALIASES,
|
||||
GAME_NAME_TO_KEY
|
||||
GAME_ALIASES
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user