Recognize creator as owner (MSC4289 room v12+); v2.0.1

This commit is contained in:
Eddy de Vink 2026-09-01 23:40:34 +02:00
commit 9a76ea1a8b
3 changed files with 24 additions and 7 deletions

View file

@ -1,6 +1,6 @@
maubot: 0.1.0
id: nl.roomsoverview
version: 2.0.0
version: 2.0.1
license: MIT
modules:
- roomsoverview

Binary file not shown.

View file

@ -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).")
await evt.reply(
f"Index gecontroleerd: {total - removed} rooms over, "
f"{removed} verwijderd (bestonden niet meer)."
)