Fix !rooms top-level (require_subcommand=False), pass_raw room arg, creator via create-event sender; v2.0.3

This commit is contained in:
Eddy de Vink 2026-09-01 23:52:05 +02:00
commit 78820450e1
3 changed files with 21 additions and 7 deletions

View file

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

Binary file not shown.

View file

@ -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.")