diff --git a/maubot.yaml b/maubot.yaml index 554abd6..27c40f7 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.1.0 id: nl.roomsoverview -version: 2.0.0 +version: 2.0.1 license: MIT modules: - roomsoverview diff --git a/roomsoverview.mbp b/roomsoverview.mbp index 518c4ce..29dff19 100644 Binary files a/roomsoverview.mbp and b/roomsoverview.mbp differ diff --git a/roomsoverview.py b/roomsoverview.py index f164090..a620484 100644 --- a/roomsoverview.py +++ b/roomsoverview.py @@ -177,7 +177,6 @@ class RoomsOverviewPlugin(Plugin): members = len(d.get("joined", {})) elif r.status == 404: return None # room bestaat niet (meer) - # 403: bestaat, maar bot heeft geen toegang except Exception: pass @@ -204,18 +203,33 @@ class RoomsOverviewPlugin(Plugin): return None async def _is_mod(self, room_id: str, user_id: str) -> bool: - """Moderator (power level >= 50) in de gegeven room.""" + """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. + """ + base = self._base_url() + h = self._headers() + rid = quote(room_id, safe="") try: async with self.http.get( - f"{self._base_url()}/_matrix/client/v3/rooms/{quote(room_id, safe='')}/state/m.room.power_levels", - headers=self._headers(), + f"{base}/_matrix/client/v3/rooms/{rid}/state/m.room.power_levels", + headers=h, timeout=_REQUEST_TIMEOUT, ) as r: if r.status != 200: return False d = await r.json() + async with self.http.get( + f"{base}/_matrix/client/v3/rooms/{rid}/state/m.room.create", + headers=h, + timeout=_REQUEST_TIMEOUT, + ) as r: + creator = (await r.json()).get("creator") if r.status == 200 else None except Exception: return False + if 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) pl = int(users.get(user_id, default) or 0) @@ -368,7 +382,10 @@ class RoomsOverviewPlugin(Plugin): @handle_rooms.subcommand(name="refresh", help="Valideer de index nu (moderator+)") async def refresh_index(self, evt: MessageEvent) -> None: if not await self._is_mod(evt.room_id, evt.sender): - await evt.reply("Geen permissie: moderator of hoger.") + await evt.reply("Geen permissie: moderator of hoger vereist.") return removed, total = await self._validate_all() - await evt.reply(f"Index gecontroleerd: {total - removed} rooms over, {removed} verwijderd (bestonden niet meer).") \ No newline at end of file + await evt.reply( + f"Index gecontroleerd: {total - removed} rooms over, " + f"{removed} verwijderd (bestonden niet meer)." + ) \ No newline at end of file