From 78820450e185a30fcd9eb1db13faac87f8543d8c Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Tue, 1 Sep 2026 23:52:05 +0200 Subject: [PATCH] Fix !rooms top-level (require_subcommand=False), pass_raw room arg, creator via create-event sender; v2.0.3 --- maubot.yaml | 2 +- roomsoverview.mbp | Bin 4783 -> 4960 bytes roomsoverview.py | 26 ++++++++++++++++++++------ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/maubot.yaml b/maubot.yaml index 27c40f7..9daa5ee 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.1.0 id: nl.roomsoverview -version: 2.0.1 +version: 2.0.3 license: MIT modules: - roomsoverview diff --git a/roomsoverview.mbp b/roomsoverview.mbp index 29dff1983c765910906e519ad2cb9b7513cef783..bfd5846fe400cf313d3ebf2dabbec41da07ad8b1 100644 GIT binary patch delta 4367 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 Jl@b5|000HQJjnn6 delta 4188 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 m=N%6K0DU bool: """Moderator (power level >= 50) in de gegeven room. - Let op room v12+ (MSC4289): de creator heeft impliciet de maximale macht - en mag/hoeft niet in de users-map voor te komen. Die telt daarom mee. + Room v12+ (MSC4289): de creator heeft impliciet de maximale macht en + mag/hoeft niet in de users-map voor te komen (het create-event heeft dan + ook geen creator-veld meer). Creator = sender van m.room.create, te + vinden via de bulk-state-query (die wél de sender per event bevat). """ base = self._base_url() h = self._headers() @@ -220,15 +222,21 @@ class RoomsOverviewPlugin(Plugin): if r.status != 200: return False d = await r.json() + creator = None async with self.http.get( - f"{base}/_matrix/client/v3/rooms/{rid}/state/m.room.create", + f"{base}/_matrix/client/v3/rooms/{rid}/state", headers=h, timeout=_REQUEST_TIMEOUT, ) as r: - creator = (await r.json()).get("creator") if r.status == 200 else None + if r.status == 200: + evs = await r.json() + for ev in evs: + if ev.get("type") == "m.room.create" and ev.get("sender"): + creator = ev["sender"] + break except Exception: return False - if user_id == creator: + if creator and user_id == creator: return True # MSC4289: creator heeft impliciet maximale macht users = d.get("users", {}) or {} default = int(d.get("users_default", 0) or 0) @@ -316,12 +324,17 @@ class RoomsOverviewPlugin(Plugin): header = f"**Rooms overzicht ({total} rooms getoond, deel {idx}/{len(chunks)}):**\n\n" await evt.respond(header + "\n".join(chunk), markdown=True) - @command.new(name="rooms", help="Toon de room-index; subcommand: add, remove, refresh") + @command.new( + name="rooms", + help="Toon de room-index; subcommand: add, remove, refresh", + require_subcommand=False, + ) async def handle_rooms(self, evt: MessageEvent) -> None: await evt.mark_read() await self._send_list(evt) @handle_rooms.subcommand(name="add", help="Voeg een room toe (moderator+)") + @command.argument("room", pass_raw=True, required=True) async def add_room(self, evt: MessageEvent, room: str) -> None: if not await self._is_mod(evt.room_id, evt.sender): await evt.reply("Geen permissie: moderator of hoger vereist.") @@ -363,6 +376,7 @@ class RoomsOverviewPlugin(Plugin): ) @handle_rooms.subcommand(name="remove", help="Verwijder een room (moderator+)") + @command.argument("room", pass_raw=True, required=True) async def remove_room(self, evt: MessageEvent, room: str) -> None: if not await self._is_mod(evt.room_id, evt.sender): await evt.reply("Geen permissie: moderator of hoger vereist.")