diff --git a/maubot.yaml b/maubot.yaml index 3548c09..c38062b 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.1.0 id: nl.roomsoverview -version: 2.2.1 +version: 2.3.0 license: MIT modules: - roomsoverview diff --git a/roomsoverview.mbp b/roomsoverview.mbp index 34ecd24..bdbe11f 100644 Binary files a/roomsoverview.mbp and b/roomsoverview.mbp differ diff --git a/roomsoverview.py b/roomsoverview.py index 2c4bbc9..3f9ed25 100644 --- a/roomsoverview.py +++ b/roomsoverview.py @@ -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 =`. + + 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 =`\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: