Rezension: Fügen Sie Ihrer Community Discord-ähnliche Video- und Sprachräume hinzu 🎙

Auf dem Handy scheint man nur Räume erstellen zu können, aber wenn man direkt auf einen bereits erstellten Raum klickt, kann man nicht hineingelangen. Wenn man direkt auf /resenha/r/topic zugreift, kann man es öffnen. Ist das ein Fehler?

Funktioniert bei mir auf meinem Handy einwandfrei. Hast du diese Woche deine Discourse-Instanz aktualisiert?

Experimentelle Plugins erfordern häufige Updates.

5 „Gefällt mir“

Es gab diesen Monat viele Updates, aber das wichtigste ist die optionale und pro Raum unterstützte SFU-Funktionalität über LiveKit.

Vollständiges P2P-WebRTC bleibt weiterhin die primäre und standardmäßig unterstützte Übertragungsmethode, aber SFU wird jetzt auch für Personen unterstützt, die hunderte Teilnehmer in einem einzelnen Raum unterstützen müssen.

Wir haben auch viele Verbesserungen vorgenommen, wie z. B. Audio- und Video-Geräteauswähler in den Raum- und Widget-Steuerungen, Resenha-Räume, die über die #-Autovervollständigung in Chat und Posts erwähnbar sind, Raumlayout-Optionen und mehr.

15 „Gefällt mir“

Danke dafür, die SFU war das eigentlich fehlende Puzzleteil. Genau das hat mich ursprünglich dazu gebracht, einen eigenen Fork zu pflegen; jetzt, da sie im Hauptprojekt unterstützt wird, kann ich den Fork einstellen und direkt die Änderungen von resenha nachziehen.

Ich habe es bisher vermieden, nach LiveKit zu fragen, weil ich nicht wusste, ob du in diese Richtung gehen möchtest. Da du das jetzt tust: Bist du offen für PRs für neue Funktionen und kleine Verbesserungen?

4 „Gefällt mir“

@Falco Hey, beim Testen des aktualisierten Resenha bin ich auf ein paar reproduzierbare Probleme gestoßen. Ich teile meine Erkenntnisse und die Patches, die ich lokal einsetze, falls sie für den Upstream nützlich sind.

1. Admin-UI verwirft room_type stillschweigend; Räume bleiben nie im Stage-Modus
app/controllers/resenha/admin_rooms_controller.rb:65 (room_params) lässt :room_type aus der Erlaubnisliste weg, und admin_room_serializer.rb serialisiert es nie.

Jede Stage-Zuweisung, die über die Admin-UI vorgenommen wird, wird verworfen. Räume werden als „offen“ erstellt und „kehren“ bei jeder späteren Admin-Bearbeitung in den offenen Zustand zurück. Bestätigt über Produktionslogs; der nutzerseitige Controller erlaubt es, nur der Admin-Pfad hat es verloren.

# admin_rooms_controller.rb — füge :room_type zur Erlaubnisliste hinzu, dann:
if permitted.key?(:room_type)
  value = Resenha::Room::ROOM_TYPES[permitted[:room_type].to_s]
  raise Discourse::InvalidParameters.new(:room_type) if value.nil?
  permitted[:room_type] = value
end
# admin_room_serializer.rb — serialisiere room_type, damit das Formular korrekt initialisiert wird

2. Ungültiges room_type fällt stillschweigend auf „offen“ zurück
app/controllers/resenha/rooms_controller.rb:575ROOM_TYPES[...] || ROOM_TYPE_OPEN.

Jeglicher fehlerhafter/veralteter room_type in ansonsten gültigen Raum-Änderungen setzt einen Stage-Raum stillschweigend auf „offen“. Ein 400er-Fehler macht den fehlerhaften Aufrufer sichtbar, statt den Raum zu korruptieren.

value = Resenha::Room::ROOM_TYPES[permitted[:room_type].to_s]
raise Discourse::InvalidParameters.new(:room_type) if value.nil?
permitted[:room_type] = value

3. Heartbeat belebt einen Nutzer wieder, der gerade verlassen hat (Geist-Präsenz)
rooms_controller.rb:234 (heartbeat) fügt die Präsenz bedingungslos wieder hinzu, sodass ein Heartbeat, das unterwegs ist, wenn leave (:220) verarbeitet wird, als Zweites ankommt und den abgereisten Nutzer wiederherstellt.
Der Geist bleibt bis zur TTL-Bereinigung bestehen, die nicht ausgestrahlt wird — Clients zeigen ihn bis zu einer Minute lang als „im Raum“ an.

Auf dem Gerät reproduziert; Kick hat die gleiche Exposition.

# ParticipantTracker: 15s Grabstein
def mark_left(room_id, user_id)  = redis.setex(left_key(room_id, user_id), 15, "1")
def recently_left?(room_id, user_id) = redis.exists?(left_key(room_id, user_id))
# leave/kick → mark_left; join/livekit_token → clear_left; heartbeat:
return head :no_content if Resenha::ParticipantTracker.recently_left?(@room.id, current_user.id)

4. Veralteter participant_left Webhook phantom-kickt eine frische Sitzung
livekit_webhooks_controller.rb:37/57 — Abgänge werden nur nach Nutzeridentität abgeglichen.
Bei einem schnellen Disconnect/Rejoin trifft der participant_left der abgelösten Sitzung zu spät ein und löscht die Präsenz der neuen Sitzung (Nutzer wird „gekickt“ ~3s nach dem Rejoin, zurück ~15s später).
Auf dem Gerät reproduziert; die gone_at-Heuristik kann die Sitzungen nicht unterscheiden, wenn der Rejoin vor dem Disconnect der alten Sitzung liegt.

# participant_joined → zeichne die aktive SID auf
Resenha::ParticipantTracker.set_livekit_sid(room.id, user_id, event.dig("participant", "sid"))
# expire_participant → überspringe den Abgang einer abgelösten Sitzung
known = Resenha::ParticipantTracker.livekit_sid(room.id, user_id)
return if sid.present? && known.present? && sid != known

5. DeleteRoom 404 nach dem letzten Verlassen flutet die Logs
lib/resenha/livekit/room_service_client.rb:84 warnt bei jedem Nicht-200.
Das SFU schließt einen Raum automatisch, sobald er leer ist, sodass das DeleteRoom des letzten Verlassens routinemäßig damit konkurriert — „angeforderter Raum existiert nicht“ ist der gewünschte Endzustand, kein Fehler.
Es landet bei jedem letzten Verlassen in Logster.

elsif method == "DeleteRoom" && response.status == 404
  Rails.logger.debug("[resenha-livekit] DeleteRoom no-op for room #{room.id}: already gone")
  true

Ich kann einen Pull-Request senden, wenn du möchtest.

Wie ich bereits in früheren Beiträgen sagte, kenne ich eure Richtung nicht vollständig, aber du kannst dir meine ansehen, da ich hier einen Beitrag geschrieben habe → Discourse Desktop Mac App - #10 by nicolsdennis

2 „Gefällt mir“

Das wäre absolut brillant – es würde Sinn machen, es in den Livestream-Mechanismus einzuhaken, der den zugehörigen Chat-Kanal als Teil eines schönen integrierten Erlebnisses bereitstellen würde.

4 „Gefällt mir“

Hi, beim Ändern des Raumnamens wird der Slug nicht aktualisiert. Außerdem kann ich keine Räume löschen – ich erhalte einen Serverfehler.

Es wäre auch schön, wenn man die Reihenfolge der Räume und deren Darstellung visuell ändern könnte.

Danke für den detaillierten Bericht, ich habe gerade einen PR dafür gemerged:

6 „Gefällt mir“

Ich habe ein paar kleinere UI/UX-Anmerkungen zu privaten Sprachräumen:

1. Das private/Verschlüsselungs-Mini-Symbol ist zu klein.

Es ist toll, dass wir ein Symbol haben, das den Privatsphäre-Status eines Raums anzeigt; leider ist es zu klein und überlappt das Symbol stark. Außerdem ist es nicht konsistent mit dem Rest der Seitenleiste:

image   image

2. Die Teilnehmerliste ist schwer zu finden

Die Teilnehmerliste in einem privaten Sprachraum ist nur während des Anrufs selbst zugänglich.

Das ist nicht besonders intuitiv. Ich gehe davon aus, dass ich die Teilnehmer/Eingeladenen auch über die Einstellungen ändern kann, die verfügbar sind, wenn der Sprachraum inaktiv ist. Es gibt ausreichend Einstellungen, wenn er inaktiv ist (einschließlich öffentlich vs. privat, maximale Teilnehmerzahl usw.), nur nicht die eigentliche Teilnehmerliste.

3 „Gefällt mir“

Ich habe beide Probleme behoben, danke für den Bericht, @nathank!

2 „Gefällt mir“

Ich frage mich, ob es möglich ist, einen bestimmten Raum über href-Links zu verknüpfen. Ich möchte eine Verknüpfung zu einem einzelnen Testraum hinzufügen, um unsere UX zu vereinfachen.

Ja, das ist in diesem Format jetzt möglich

https://discourse-on-a-pi5.falco.dev/resenha/r/watercooler

4 „Gefällt mir“

Ebenfalls hervorzuheben sind die jüngsten Verbesserungen:

Unterstützung für private STUN/TURN-Verbindungen über coturn-Authentifizierung

Damit kannst du deine coturn-Instanz für dich allein einschränken, und die Konfiguration mit einem gemeinsamen Geheimnis zwischen Discourse und Coturn ist sehr einfach.

Unterstützung für die Aufzeichnung von Sitzungen bei Verwendung von LiveKit

Alles über die Anruf-UI: Ein Klick zum Starten der Aufzeichnung, ein Klick zum Stoppen.

Flaggen-Unterstützung für Anrufteilnehmer

Obwohl die Flagge keinen Kontext bietet, können Benutzer diesen über das Textfeld angeben.

Rechtsklick-Menü auf den Video-Kacheln

Einfache Anpassung der Lautstärke eines Teilnehmers, Ausschließen usw.

Opt-in für höhere Qualität bei Sprache, Video und Bildschirmfreigabe

Mein Lieblingsfeature der Woche: Damit können Benutzer höhere Bitraten-Grenzen aktivieren und deutlich bessere Audio-/Videoqualität erhalten.

6 „Gefällt mir“

Viel besser!!! Danke, dass du zuhörst (und handelst)!!

image

2 „Gefällt mir“

Liegt es an meiner Instanz oder sollte man das vielleicht genauer untersuchen? Ich erhalte einen 500er-Fehler, wenn ich versuche, Sprachräume im Admin-Panel zu entfernen:

ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR:  update or delete on table "resenha_rooms" violates foreign key constraint "fk_rails_ID" on table "resenha_sessions" DETAIL:  Key (id)=(1) is still referenced from table "resenha_sessions".
1 „Gefällt mir“

Danke für den Bericht, der Fix wurde gemerged

2 „Gefällt mir“

Danke für diese ultraschnelle Reparatur; sie hat wie erwartet funktioniert.

Nur ein kleiner Hinweis zur Nachfolge: Das Ändern des Standard-Raumnamens hat den Pfad /resenha/r/watercooler nicht aktualisiert, aber ich konnte nun den vorherigen Standard-Raum entfernen und einen neuen hinzufügen.

1 „Gefällt mir“

Ich habe den Slug jetzt explizit bearbeitbar gemacht, sodass er wie Kategorien funktioniert

6 „Gefällt mir“

Du kannst auch einige URL-Parameter hinzufügen, um auf eine bestimmte Weise zu öffnen:

https://discourse-on-a-pi5.falco.dev/resenha/r/watercooler?join, betritt einfach den Raum, kein Klick auf den „Beitreten“-Button

https://discourse-on-a-pi5.falco.dev/resenha/r/watercooler?join&widget (früher diese Woche hinzugefügt), öffnet und wechselt in den Widget-Modus

https://discourse-on-a-pi5.falco.dev/resenha/r/watercooler?join&chat öffnet im Chat-Modus

2 „Gefällt mir“