import 'package:matrix/matrix.dart'; /// Raumtyp der Pyramid-Sprachkanäle (creation_content.type). const voiceChannelRoomType = 'io.pyramid.voice_channel'; /// Ist [room] ein Sprachkanal (statt eines Text-Chats)? bool isVoiceChannelRoom(Room room) => room.getState(EventTypes.RoomCreate)?.content['type'] == voiceChannelRoomType; /// IDs aller Räume, die Kanal eines beigetretenen Servers (Space) sind – /// auch über Unter-Spaces. Diese Räume stehen nur in ihrem Server, nicht /// zusätzlich in „Chats“ (Bernd 2026-10-09: „Alles in Chats“). Set spaceChannelIds(Client client) { final ids = {}; for (final space in client.rooms) { if (!space.isSpace || space.membership != Membership.join) continue; for (final child in space.spaceChildren) { final id = child.roomId; if (id != null) ids.add(id); } } return ids; } /// Gehört [room] in die gemeinsame Chatliste? Direktnachrichten und Gruppen, /// die zu keinem beigetretenen Server gehören. [channelIds] stammt aus /// [spaceChannelIds] (einmal pro Liste berechnen, nicht pro Raum). bool isChatListRoom(Room room, Set channelIds) { if (room.isSpace) return false; if (room.isDirectChat) return true; return !channelIds.contains(room.id); } /// Gruppenchat = kein Space, keine Direktnachricht, kein Sprachkanal. bool isGroupChatRoom(Room room) => !room.isSpace && !room.isDirectChat && !isVoiceChannelRoom(room);