Add !rooms edit subcommand: moderators can change name/topic/alias of a room record; v2.3.0

This commit is contained in:
Eddy de Vink 2026-09-05 00:17:39 +02:00
commit 812f30d333
3 changed files with 71 additions and 2 deletions

View file

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

Binary file not shown.

View file

@ -97,6 +97,23 @@ async def upgrade_v3(conn: Connection, scheme: Scheme) -> None:
)
def _parse_edit_args(args: str) -> Optional[Tuple[str, str, str]]:
"""Parse `!rooms edit <room> <veld>=<waarde>`.
Retourneert (room_ref, field, value) of None bij ongeldige vorm.
field is genormaliseerd naar lowercase; value mag leeg zijn (wissen).
"""
parts = args.strip().split(" ", 1)
if len(parts) != 2:
return None
room_ref, kv = parts
if "=" not in kv:
return None
field, _, value = kv.partition("=")
field = field.strip().lower()
return room_ref, field, value.strip()
class Config(BaseProxyConfig):
def do_update(self, helper: ConfigUpdateHelper) -> None:
helper.copy("refresh_interval_minutes")
@ -515,7 +532,7 @@ class RoomsOverviewPlugin(Plugin):
@command.new(
name="rooms",
help="Toon de room-index; subcommand: add, remove, refresh",
help="Toon de room-index; subcommand: add, edit, remove, refresh",
require_subcommand=False,
)
async def handle_rooms(self, evt: MessageEvent) -> None:
@ -566,6 +583,58 @@ class RoomsOverviewPlugin(Plugin):
f"([{target}](https://matrix.to/#/{target}))"
)
@handle_rooms.subcommand(
name="edit",
help="Wijzig naam/topic/alias van een room (moderator+)",
)
@command.argument("args", pass_raw=True, required=True)
async def edit_room(self, evt: MessageEvent, args: str) -> None:
if not await self._is_mod(evt.room_id, evt.sender):
await evt.reply("Geen permissie: moderator of hoger vereist.")
return
parsed = _parse_edit_args(args)
if parsed is None:
await evt.reply(
"Gebruik: `!rooms edit <room-id-of-alias> <name|topic|alias>=<waarde>`\n"
"Lege waarde wist het veld (bijv. `alias=`)."
)
return
room_ref, field, value = parsed
field_ok = {"name": "display_name", "topic": "topic", "alias": "canonical_alias"}
if field not in field_ok:
await evt.reply("Veld moet `name`, `topic` of `alias` zijn.")
return
if field == "alias" and value and not value.startswith("#"):
await evt.reply("Alias moet beginnen met `#` (bijv. `#mijn-room:server.nl`).")
return
room_id = room_ref if room_ref.startswith("!") else await self._resolve_alias(room_ref)
if not room_id:
await evt.reply(f"Room `{room_ref}` kon niet gevonden worden.")
return
new_value = value or None # lege waarde wist het veld (NULL)
column = field_ok[field]
result = await self.database.execute(
f"UPDATE roomsoverview_rooms SET {column} = $2, last_checked = $3 "
"WHERE room_id = $1",
room_id,
new_value,
int(time.time()),
)
if result != "UPDATE 1":
await evt.reply(f"Room `{room_id}` stond niet in de index.")
return
row = await self.database.fetchrow(
"SELECT display_name, canonical_alias FROM roomsoverview_rooms "
"WHERE room_id = $1",
room_id,
)
label = row["display_name"] or row["canonical_alias"] or room_id
shown = new_value if new_value is not None else "(leeg)"
field_name = {"name": "naam", "topic": "omschrijving", "alias": "alias"}[field]
await evt.reply(
f"Room bijgewerkt: **{label}** — {field_name} is nu `{shown}`."
)
@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: