RexSystem1 voteoriginally by @mgabor3141 on GitHub OP
3: Voice states missing from READY payload (likely upstream bug)
Symptom: After connecting (or refreshing the page), the channel sidebar shows 0 users in voice channels. You only see who's in a voice channel after you join it yourself. The client logs confirm: Initialized voice states from connection open {guildCount: 2, totalVoiceStates: 0}.
Root cause:guild_voice_server.erl is a separate process that holds the authoritative voice state. It's always started for every guild (guild.erl:76). All voice mutations (join, leave, confirm) go through resolve_voice_pid() which routes to this process.
But guild_data:get_guild_state/2 — which builds the READY payload — runs inside the guild process and reads voice states from its own state:
The guild process's voice_states map is always empty because all mutations go to the voice server process. The fallback handler in guild_voice_handler.erl is effectively dead code since resolve_voice_pid always finds the voice server via ETS.
This is likely an upstream bug too — the voice server process was presumably split out from the guild process to reduce contention, but get_guild_state was never updated to fetch from the new location.
Fix in fluxer_gateway/src/guild/guild_data.erl:
Thread
Comment by @mgabor3141
3: Voice states missing from READY payload (likely upstream bug)
Symptom: After connecting (or refreshing the page), the channel sidebar shows 0 users in voice channels. You only see who's in a voice channel after you join it yourself. The client logs confirm:Initialized voice states from connection open {guildCount: 2, totalVoiceStates: 0}. Root cause:guild_voice_server.erlis a separate process that holds the authoritative voice state. It's always started for every guild (guild.erl:76). All voice mutations (join, leave, confirm) go throughresolve_voice_pid()which routes to this process. Butguild_data:get_guild_state/2— which builds the READY payload — runs inside the guild process and reads voice states from its own state:voice_statesmap is always empty because all mutations go to the voice server process. The fallback handler inguild_voice_handler.erlis effectively dead code sinceresolve_voice_pidalways finds the voice server via ETS. This is likely an upstream bug too — the voice server process was presumably split out from the guild process to reduce contention, butget_guild_statewas never updated to fetch from the new location. Fix influxer_gateway/src/guild/guild_data.erl:{get_voice_states_list}handler (guild_voice_server.erl:203), so this just wires it up.