The bots needed some talking to. Three related items knocked out in one session: a personality bug in spam replies, inline schedule editing, and a full dashboard overhaul with spam management UI.
Reply Tracking Fix
Spam messages sent by the bot were silently discarding the returned Discord message object — await channel.send(content) with no capture. When users replied to those messages, replyTrackingService.checkReplyToBot() found no stored mode and defaulted to 'please'. One-line fix: capture the sent message and call storeBotMessageMode(sentMessage.id, personality). Replies now continue in whatever personality the spam was sent as.
Spam Schedule Editing
Previously, changing a spam schedule's personality or interval meant !spam remove then !spam add with all the original settings re-typed. Added updateSchedule(id, updates) to the service layer with an allowlist of editable keys and automatic timer restart when interval properties change. Both !spam edit and !twitchspam edit support all relevant properties: personality, interval, topic, channel, hours, timezone, and liveonly (Twitch-only). Each command validates inputs and shows platform-appropriate errors.
Dashboard Overhaul
The web dashboard had three problems: port 3000 conflicted with FreeChat, the log path pointed at a nonexistent logs/bot.log, and there was no visibility into spam schedules. Fixed the port to 3002, corrected the log path to bot_debug.log, and added a full spam CRUD API (GET/PUT/PATCH/DELETE /api/spam). The new Spam tab shows summary stats, a filter bar (All/Discord/Twitch/Active), and schedule cards with live toggle and remove buttons via Socket.IO. The Services tab now shows Twitch Chat transport type, EventSub subscription count, and spam timer status.
What's Next
- Restart bot with
DASHBOARD_ENABLED=trueand verify dashboard end-to-end - Test
!spam editon live schedules - Confirm reply personality tracking works on actual spam messages