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 29dff19..bfd5846 100644 Binary files a/roomsoverview.mbp and b/roomsoverview.mbp differ diff --git a/roomsoverview.py b/roomsoverview.py index a620484..4e0a48c 100644 --- a/roomsoverview.py +++ b/roomsoverview.py @@ -205,8 +205,10 @@ class RoomsOverviewPlugin(Plugin): async def _is_mod(self, room_id: str, user_id: str) -> 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.")