Join and start voice calls in ordinary (text) rooms #8

Open
opened 2026-10-04 20:19:43 +00:00 by robocub · 0 comments
Owner

Why

On Discord, voice lives in channels and you just click in. In Commet you can only join a group call in a room that was created as a voice room. Element users routinely start calls in ordinary rooms, so Commet users see the room but cannot join the call happening in it.

What exists

  • MatrixVoipRoomComponent.isVoipRoom() returns true only when the room's m.room.create content has type: org.matrix.msc3417.call. That type is fixed at creation and can never be added to an existing room.
  • The component is registered only for those rooms (component_registry.dart, around line 87). room_primary_view.dart then swaps the whole timeline for the call view.
  • Every other room only gets the legacy 1:1 m.call button, and only in DMs (room_quick_access_menu.dart: canCall requires a direct message).
  • The MatrixRTC join machinery (memberships, LiveKit, E2EE keys, multi-SFU) is the same for any room; the gate is purely in the client.

Plan

  1. Detect calls anywhere: treat a room as call-capable when it has live org.matrix.msc3401.call.member state, or when the user is allowed to send that state event.
  2. Join an ongoing call: a "Join call (3)" bar above the timeline when other members are in the call, showing who is in it.
  3. Start a call: a "Start voice call" quick-access entry in group rooms, not just DMs.
  4. Layout: keep the timeline in text rooms. Show the call as a collapsible panel or bar instead of replacing the room view, the way Discord's text-channel calls feel. Dedicated voice rooms keep today's full call view.
  5. Permissions: in a normal room org.matrix.msc3401.call.member defaults to power level 50, so ordinary members can't join. Detect that and show "Calls aren't enabled in this room" with a one-tap fix for admins (set that event's power level to 0). Without this, joins fail with an unhelpful 403.
  6. Widgets: the code hides widgets in voice rooms because MatrixRTC widgets interfere with an ongoing call. Keep that rule while a call is active in a text room.

Acceptance

  • An Element user starts a call in an ordinary room; a fork user sees "Join call", joins, and both hear each other, encrypted and unencrypted.
  • A fork user starts a call in an ordinary group room and an Element user can join it.
  • In a room where members lack the power level, the button explains why instead of failing.

Filed with LLM assistance. This is a fork-only issue; never refile it on Commet's tracker.

## Why On Discord, voice lives in channels and you just click in. In Commet you can only join a group call in a room that was *created* as a voice room. Element users routinely start calls in ordinary rooms, so Commet users see the room but cannot join the call happening in it. ## What exists - `MatrixVoipRoomComponent.isVoipRoom()` returns true only when the room's `m.room.create` content has `type: org.matrix.msc3417.call`. That type is fixed at creation and can never be added to an existing room. - The component is registered only for those rooms (`component_registry.dart`, around line 87). `room_primary_view.dart` then swaps the whole timeline for the call view. - Every other room only gets the legacy 1:1 `m.call` button, and only in DMs (`room_quick_access_menu.dart`: `canCall` requires a direct message). - The MatrixRTC join machinery (memberships, LiveKit, E2EE keys, multi-SFU) is the same for any room; the gate is purely in the client. ## Plan 1. **Detect calls anywhere:** treat a room as call-capable when it has live `org.matrix.msc3401.call.member` state, or when the user is allowed to send that state event. 2. **Join an ongoing call:** a "Join call (3)" bar above the timeline when other members are in the call, showing who is in it. 3. **Start a call:** a "Start voice call" quick-access entry in group rooms, not just DMs. 4. **Layout:** keep the timeline in text rooms. Show the call as a collapsible panel or bar instead of replacing the room view, the way Discord's text-channel calls feel. Dedicated voice rooms keep today's full call view. 5. **Permissions:** in a normal room `org.matrix.msc3401.call.member` defaults to power level 50, so ordinary members can't join. Detect that and show "Calls aren't enabled in this room" with a one-tap fix for admins (set that event's power level to 0). Without this, joins fail with an unhelpful 403. 6. **Widgets:** the code hides widgets in voice rooms because MatrixRTC widgets interfere with an ongoing call. Keep that rule while a call is active in a text room. ## Acceptance - An Element user starts a call in an ordinary room; a fork user sees "Join call", joins, and both hear each other, encrypted and unencrypted. - A fork user starts a call in an ordinary group room and an Element user can join it. - In a room where members lack the power level, the button explains why instead of failing. --- _Filed with LLM assistance. This is a fork-only issue; never refile it on Commet's tracker._
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
robocub/vommet#8
No description provided.