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.
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.
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?
@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:575 — ROOM_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 → https://meta.discourse.org/t/discourse-desktop-mac-app/406912/10?u=nicolsdennis
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.
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:
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:
![]()
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.
Ich habe beide Probleme behoben, danke für den Bericht, @nathank!
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
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.
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".
Danke für den Bericht, der Fix wurde gemerged
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.
Ich habe den Slug jetzt explizit bearbeitbar gemacht, sodass er wie Kategorien funktioniert
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
Wir setzen dieses Plugin intern für Meetings ein, was hervorragend war, um Feedback zu sammeln und es anhand von realen Anwendungsfällen weiterzuentwickeln. In den letzten zwei Wochen waren die Highlights:
KI-basierte Geräuschunterdrückung
Die Geräuschunterdrückung wurde vollständig überarbeitet und umfasst mehrere Änderungen. Wir bieten nun Steuerelemente an, um die Standard-WebRTC-Funktionen zu verwalten:
- Geräuschunterdrückung
- Automatische Verstärkungsregelung
- Echoabschaltung
Außerdem liefert das Plugin jetzt drei verschiedene KI-Modelle für alle, die eine bessere Geräuschunterdrückung benötigen, von niedrig bis hoch:
- RNNoise
- DTLN
- DeepFilter3
Direkte Anrufe
Nutzer können nun über einen Button auf der Benutzerkarte 1-zu-1- oder 1-zu-viele-Direktanrufe initiieren. Dies nutzt unsere Infrastruktur für ephemere Räume, die in Zukunft auch zur Handhabung von Integrationen verwendet werden wird, z. B. mit dem Events-Plugin.
Einladungen
Ein Rechtsklick auf einen Raum ermöglicht es dir, Einladungen zu generieren. Dabei werden deine Konversationsverläufe in diesem Raum verwendet, um Benutzer vorzuschlagen.
Klangpakete
Resenha-Töne folgen nun deinem bevorzugten Klangpaket aus Neue Chat-Benachrichtigungsklangpakete.
Raum-UX
Rechtsklick zum Kopieren des Raum-Links, automatische Größenanpassung und Zusammenklappbarkeit von Widget-Kacheln, Widget-Positionierung über der Site-Header, Unterstützung für Shift+Klick auf Räume, Genauigkeit und bessere Leistung des Sprachaktivitätsindikators.
Android-Kamerawechsel
Du kannst nun während eines Anrufs nahtlos zwischen der Front- und der Rückkamera deines Android-Handys wechseln.
Warnung bei Mesh-Verbindung
Wenn ein Benutzer zum ersten Mal versucht, sich mit einem Raum zu verbinden, der WebRTC-Mesh verwendet, wird eine Warnung angezeigt, die eine potenzielle IP-Exposition erklärt.
Und zu guter Letzt zwei experimentelle Funktionen ![]()
Live-Untertitel
Wir haben Live-Untertitel hinzugefügt, die auf Wunsch aktiviert werden können und von modernen KI-Modellen angetrieben werden, die auf dem Gerät ausgeführt werden.
Wenn aktiviert, wird ein 2,5-GB-KI-Modell heruntergeladen, der über WebGPU ausgeführt wird. Daher ist die Kompatibilität auf schnelle und moderne Geräte beschränkt.
Bei dieser Funktion gibt es noch viel zu verfeinern und anzupassen, also lass mich wissen, wie es dir gefällt.
Transkription
Benutzer mit aktivierten Live-Untertiteln können nun Transkriptionen aus diesen starten, die in einem neuen Themenentwurf gespeichert werden. Nach dem Abschluss der Aufnahme erhältst du einen Composer mit allen gespeicherten Transkriptionen, der dasselbe Format verwendet wie Chat-Zitate.












