Commit graph

20 commits

Author SHA1 Message Date
Daniel
2c0cb7a67a fix: volume slider disappearing + theme overlapping favorites
- SSE handler now distinguishes per-guild events (single NowPlaying)
  from snapshots (Record<string, NowPlaying>) to prevent state corruption
- Theme selector moved left (right: 72px) to not overlap favorites button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:39:27 +01:00
Daniel
bac2e3b17f fix: scale radio globe points with zoom level
Points now shrink proportionally when zooming in, preventing
overlap in dense areas and making individual stations clickable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:35:48 +01:00
Daniel
90ef17932c feat: Radio themes + globe rotation pause on interaction
- 5 themes: Sunset (default), Midnight, Forest, Ocean, Cherry
- Theme selector dots in top-right corner, persisted to localStorage
- Globe accent colors (points, atmosphere) update with theme
- Globe pauses auto-rotation for 5s on any interaction (click, drag, scroll)
- All radio CSS vars scoped to .radio-container[data-theme]

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 02:15:06 +01:00
Daniel
d1ae2db00b feat: Radio volume control - server-wide slider synced via SSE
- Server: inlineVolume on AudioResource, POST /api/radio/volume endpoint
- Volume persisted per guild, broadcast via SSE to all clients
- Frontend: volume slider in bottom bar with debounced API calls
- Volume icon changes based on level (muted/low/normal)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 02:10:02 +01:00
Daniel
971fd2c3fc fix: add missing @snazzah/davey (DAVE) and ws dependencies
Jukebox has @snazzah/davey (Discord Audio Video Encryption) and ws
(WebSocket) as dependencies which were missing from the Gaming Hub.
Without davey, voice connections get stuck at 'signalling' because
Discord's voice servers require DAVE negotiation in @discordjs/voice 0.19.
Also removed unused prism-media (covered by @discordjs/opus).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:57:56 +01:00
Daniel
20ea13d71f debug: add connection stateChange + error listeners from creation
Listen for state transitions and errors immediately after joinVoiceChannel,
not just after ensureConnectionReady succeeds. This will show if the
connection transitions at all internally or stays stuck at signalling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:49:17 +01:00
Daniel
a13765d5b6 fix: correct voice adapter debug wrapper method direction
Previous wrapper intercepted wrong methods (library→adapter vs adapter→library).
Now correctly wraps:
- sendPayload (adapter→gateway): logs op code and return value
- onVoiceServerUpdate/onVoiceStateUpdate (gateway→library): logs incoming events

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:41:34 +01:00
Daniel
cc5e21fe1c debug: add voice adapter wrapper to trace gateway communication
Logs sendPayload calls (op code, result), onVoiceServerUpdate
and onVoiceStateUpdate to identify why connection stays at signalling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:27:50 +01:00
Daniel
5faf5139ef feat: add comprehensive logging to soundboard voice/play pipeline
- Log voice state transitions (Signalling → Connecting → Ready etc.)
- Log play requests with sound name, guild, channel, file path
- Log connection creation, rejoin attempts, and failures
- Log AudioPlayer state changes and errors
- All prefixed with [Soundboard] for easy filtering

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:22:28 +01:00
Daniel
c41138f62a fix: stop globe auto-rotation on point click
Rotation continued while browsing stations, making selection impossible.
Now stops immediately when clicking any radio point.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:18:35 +01:00
Daniel
9ac1034e5e fix: initialize voice encryption libs before first connection
- await sodium.ready + nacl preload (same as original jukebox)
- Add generateDependencyReport() for debugging
- Add type declarations for libsodium-wrappers and tweetnacl

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:13:46 +01:00
Daniel
1d4a48cf74 fix: useRef requires initial value in strict TS mode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 01:00:37 +01:00
Daniel
901dfe54be feat: Soundboard Plugin + Radio Globe Fixes
- Add Soundboard plugin (full Jukebox port): server + frontend + CSS
- Fix Radio Globe: swap geo coords (API returns [lng,lat] not [lat,lng])
- Fix Radio stations showing "Unbekannt": use item.page.title + fix channel ID regex
- Add DirectMessages + MessageContent intents for DM commands
- Register SoundboardTab in App.tsx with scoped theme/card-size CSS vars

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 00:51:07 +01:00
Daniel
6696fed9d7 fix: remove privileged intents not needed for radio plugin
Only request Guilds + GuildVoiceStates. GuildMembers, GuildPresences
and MessageContent are privileged and require manual portal activation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 23:56:49 +01:00
Daniel
1df780fe60 feat: add ADMIN_PWD and ALLOWED_GUILD_IDS support
- Add ADMIN_PWD and ALLOWED_GUILD_IDS env vars to config
- Extend PluginContext with adminPwd and allowedGuildIds
- Add adminAuth and guildFilter middleware for plugins
- Add /api/admin/login endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 23:48:23 +01:00
Daniel
1669af1e91 fix: use Express 5 compatible catch-all route syntax
Change SPA fallback from app.get('*') to app.get('/{*splat}')
as Express 5 uses path-to-regexp v8+ which requires named splat.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 23:39:35 +01:00
Daniel
db55d41eee fix: TypeScript-Fehler in RadioTab (useRef + Globe Konstruktor)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 23:27:14 +01:00
Daniel
847c963d86 feat: Radio Plugin – 3D Globe mit weltweiten Radiosendern
- Radio Garden API Client (30K+ Orte, Sender-Suche, Stream-URL Auflösung)
- Discord Voice Streaming via ffmpeg (PCM Pipeline)
- Interactive 3D Globe (globe.gl) mit allen Radiosender-Standorten
- Sender-Panel mit Play/Stop/Favoriten
- Live-Suche nach Sendern und Städten
- Now-Playing Bar mit Equalizer-Animation
- Guild/Voice-Channel Auswahl
- SSE Broadcasting für Live-Updates
- Favoriten-System mit Persistenz
- Responsive Design (Mobile/Tablet/Desktop)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 23:23:52 +01:00
Claude Code
ae1c41f0ae Initial commit: Gaming Hub foundation
Plugin-based Discord bot framework with web frontend:
- Core: Discord.js client, SSE broadcast, JSON persistence
- Plugin system: lifecycle hooks (init, onReady, routes, snapshot, destroy)
- Web: React 19 + Vite 6 + TypeScript, tab-based navigation
- Docker: multi-stage build (Node 24, static ffmpeg, yt-dlp)
- GitLab CI: Kaniko with LAN registry caching

Ready for plugin development.
2026-03-05 22:52:13 +01:00
Administrator
1ae431dd2f Initial commit 2026-03-05 21:46:11 +00:00