From 63871ccd178ac444cb4f24356f23424fd742e83f Mon Sep 17 00:00:00 2001 From: legop3 Date: Thu, 27 Nov 2025 02:01:31 -0500 Subject: [PATCH] fix discord bot pings and some of the session spam --- server/src/services/discordBotService.js | 13 +++++++--- server/src/services/sessionService.js | 31 +++++++++++++++++++++++- server/src/services/turnService.js | 2 +- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/server/src/services/discordBotService.js b/server/src/services/discordBotService.js index 0fc5abf7..b7804461 100644 --- a/server/src/services/discordBotService.js +++ b/server/src/services/discordBotService.js @@ -91,11 +91,12 @@ async function fetchChannel(id) { return null; } -async function sendToChannel(id, content, options = {}, allowedMentions = { parse: [] }) { +async function sendToChannel(id, content, options = {}, allowedMentions = { parse: [] }, sanitizeContent = true) { const channel = await fetchChannel(id); if (!channel) return; try { - await channel.send({ content: sanitizeMentions(content), allowedMentions, ...options }); + const messageContent = sanitizeContent ? sanitizeMentions(content) : content; + await channel.send({ content: messageContent, allowedMentions, ...options }); } catch (err) { logger.warn('Failed to send Discord message', { id, error: err.message }); } @@ -260,7 +261,13 @@ async function announce({ channelId, content, pingRoleId, color, title, descript const prefix = pingRoleId ? `<@&${pingRoleId}> ` : ''; const embed = buildEmbed({ title, description, color }); const allowedMentions = pingRoleId ? { roles: [pingRoleId], parse: [] } : { parse: [] }; - await sendToChannel(channelId, `${prefix}${content || ''}`.trim(), { embeds: [embed] }, allowedMentions); + await sendToChannel( + channelId, + `${prefix}${content || ''}`.trim(), + { embeds: [embed] }, + allowedMentions, + !pingRoleId, // keep role mention intact when pinging + ); } function handleBusEvent(event) { diff --git a/server/src/services/sessionService.js b/server/src/services/sessionService.js index 47fa4528..b695d274 100644 --- a/server/src/services/sessionService.js +++ b/server/src/services/sessionService.js @@ -14,6 +14,10 @@ const { loadConfig } = require('../helpers/configLoader'); const discordInvite = loadConfig().discord?.invite || null; logger.info('Discord invite loaded:', discordInvite ? 'present' : 'not configured'); +const ACTIVITY_SYNC_COOLDOWN_MS = 3000; +let lastActivitySync = 0; +let pendingActivitySync = null; + function buildUserEntry(socket) { if (!socket) return null; const role = getRole(socket); @@ -107,7 +111,32 @@ turnEvents.on('activeDriver', () => { logger.info('Active driver change; syncing all clients'); syncAll(); }); -turnEvents.on('queue', () => { +turnEvents.on('queue', (event = {}) => { + const { reason } = event; + if (reason === 'activity') { + const now = Date.now(); + const elapsed = now - lastActivitySync; + if (elapsed >= ACTIVITY_SYNC_COOLDOWN_MS) { + lastActivitySync = now; + logger.info('Turn activity; syncing all clients (immediate)'); + syncAll(); + return; + } + if (!pendingActivitySync) { + const delay = ACTIVITY_SYNC_COOLDOWN_MS - elapsed; + pendingActivitySync = setTimeout(() => { + lastActivitySync = Date.now(); + pendingActivitySync = null; + logger.info('Turn activity; syncing all clients (delayed)'); + syncAll(); + }, delay); + } + return; + } + if (pendingActivitySync) { + clearTimeout(pendingActivitySync); + pendingActivitySync = null; + } logger.info('Turn queue change; syncing all clients'); syncAll(); }); diff --git a/server/src/services/turnService.js b/server/src/services/turnService.js index e5bb234d..10a98c15 100644 --- a/server/src/services/turnService.js +++ b/server/src/services/turnService.js @@ -268,7 +268,7 @@ function recordActivity(roverId, socketId) { idleDisarmed.set(roverId, true); clearTimeout(idleTimers.get(roverId)); idleDeadlines.delete(roverId); - turnEvents.emit('queue', { roverId }); + turnEvents.emit('queue', { roverId, reason: 'activity' }); } modeEvents.on('change', (mode) => {