v3.15.7
[3.15.7] - 2026-05-10
Critical hotfix for voice (#5347). The voice presence work in 3.15.4 added a getUserAllRoles call inside broadcastVoiceUsers but the helper was never destructured from createPermissions(db), so every voice user broadcast (join, leave, mute, deafen, ghost-prune) was throwing ReferenceError: getUserAllRoles is not defined. The error was swallowed by the async handler, so the server stayed up but broadcasts never completed. Clients kept showing whoever was last successfully broadcast, leavers stuck around as ghosts, rejoiners didn't appear. This is the actual root cause of the "voice list disagrees with reality" symptom.
Fixed
ReferenceError: getUserAllRoles is not definedon every voice broadcast (#5347). Added the missing destructure insetupSocketHandlersand forwarded it on the shared ctx.PUT /api/auth/user-serversreturned 500 PayloadTooLargeError once the saved server list exceeded ~50 entries. The global 16kb body parser in server.js was preempting the per-route 96kb limit in auth.js. Bumped the global limit to 128kb.
[3.15.6] - 2026-05-09
Follow-up fixes for personas (#5353).
Fixed
- Persona
::autocomplete appeared in fullscreen DM view. The PiP input already suppressed it but the main#message-input(used when a DM is opened as a full channel view) still ran_checkPersonaTrigger. Added a guard that bails out when the active channel is a DM. - Nickname set for a user overrode the persona name on their messages. Message rendering called
_getNickname(msg.user_id, ...)unconditionally, so any local nickname for the real account replaced the persona display name. Persona messages now usemsg.username(the persona name) directly.