rooms: a destroyed room's row stays as if nothing happened #95
Labels
No labels
android
bug
duplicate
feature request
linux
macos
needsinfo
severity: high
severity: low
severity: medium
telegram_gw
ui/ux
windows
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
another-im/anotherim-js#95
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
When a room is destroyed, by us as its owner or by another owner, its row stays in the room list as if nothing had happened. The room is gone, we are no longer in it, and nothing on the row says so. Found by hand with anotherim-js
develop(009c9884,XML_LOG=1).Steps
<presence type='unavailable'>with<destroy/>), and libtacky emitsmuc <Destroyed>.Why
ui/src/state/muc-room.ts:204reacts toDestroyedonly withthis.#clear(), which empties the room's state. The row itself comes from the XEP-0402 bookmark, which nothing removes. Today libtacky also keeps the bookmark withautojoin='true'and recreates the room on the next sign-in. That part is libtacky's to fix: another-im/libtacky#26, with a fix in another-im/libtacky#27, where the bookmark is taken back on destroy and autojoin skips a room that does not exist.Suggestion
On
muc <Destroyed>({acc, jid, altRoom?, reason?}):reasonwhen one is given. Keep the history readable.bookmarks remove; after it, the bookmark is already gone, so close the chat (chatlist closefor the?joinchat).altRoomis set (XEP-0045 §10.9,<destroy jid='…'/>), offer Join the new room with that address. Never join it automatically.room_stateerror"Room does not exist" (what libtacky reports with the fix when autojoin finds the room gone) gets the same mark and actions, plus Create again for an owner who means it (an explicitmuc joinstill creates).Related
Fixed in anotherim-js 0.8.0-rc8, built on libtacky 1.2.2: https://dev.another.im/another-im/anotherim-js/releases/tag/v0.8.0-rc8
A destroyed room's row now shows "This room was destroyed" in the header and in the row menu, the name struck through in the list, and Remove over the composer (plus "Go to the new room" when the owner named one) in place of Join. A room found gone at sign-in says so too and is not made again.
Still seen in 0.8.0-rc9 (
142ee094, libtacky v1.2.3), which containsb50f1ae3and rc8: after the owner destroys a room from the room menu, nothing in the UI says it was destroyed. Recorded on all three test servers in the interop GUI VM runs (2026-11-09).Expected (
b50f1ae3,state/destroyed-rooms.ts): onmuc <Destroyed>the header says "This room was destroyed", the composer is disabled with Remove over it, the row's name is struck through.Seen right after the destroy: the chat shows "Not joined", the composer is enabled, the name is not struck through, there is no Remove. After a restart the row is gone, as designed (session-only state).
Noted in 5 runs' EVIDENCE.md (Prosody with Gajim, Dino and anotherim-web; anotherim-server with anotherim-web and Gajim); in run 225948 the harness also OCRs aim's room after the restart for Remove / "Go to the new room" / Join: none found (steps.log:150). On Prosody libtacky's autojoin-off republish is at client.log:289.
libtacky did its part. In the anotherim-server run (client.log:625-633):
<destroy/>iq, L631 the room's unavailable presence with<x xmlns='http://jabber.org/protocol/muc#user'><destroy/>;autojoin='false'. That publish comes frombookmarks.tclOnMucDestroyed, which is subscribed tomuc:<Destroyed>(v1.2.3bookmarks.tcl:129,:1465), so the<Destroyed>event was emitted.So the break is between libtacky's
muc <Destroyed>and the view: the event not reachingDestroyedRooms(store.backend.on('muc', 'Destroyed', …)) in the Tauri build, or the chat view/row not redrawing on it. Not traced further; the runs do not log host-side events.Re-run:
vms/tools/vmrun.zsh explore vms/examples/xep0045admin.py NAME gajimin the interop repo (each EVIDENCE.md has the exact command).