From fe149713f9776add88426626402d513d32a87d6c Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Sun, 6 Sep 2026 15:15:06 +0200 Subject: [PATCH] Dutch command names: !kamer with subcommands over/voegtoe/wijzig/verwijder/ververs/hulp; English names kept as aliases; v3.0.0 --- maubot.yaml | 2 +- roomsoverview.mbp | Bin 9288 -> 9390 bytes roomsoverview.py | 104 ++++++++++++++++++++++++---------------------- 3 files changed, 56 insertions(+), 50 deletions(-) diff --git a/maubot.yaml b/maubot.yaml index 0d61d9d..d623741 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.1.0 id: nl.roomsoverview -version: 2.4.1 +version: 3.0.0 license: MIT modules: - roomsoverview diff --git a/roomsoverview.mbp b/roomsoverview.mbp index 4dce9375d0084f26f3b86090f4124d8516d97694..3305d8e91808112d0553006390cd79c01aef0986 100644 GIT binary patch delta 8767 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 delta 8699 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 POGyZ#rb6_l`rq None: def _parse_edit_args(args: str) -> Optional[Tuple[str, str, str]]: - """Parse `!rooms edit =`. + """Parse `!kamer wijzig =`. Retourneert (room_ref, field, value) of None bij ongeldige vorm. field is genormaliseerd naar lowercase; value mag leeg zijn (wissen). @@ -535,8 +535,8 @@ class RoomsOverviewPlugin(Plugin): rooms = self._sort_rooms(await self._list_rooms()) if not rooms: await evt.reply( - "De room-index is nog leeg. Moderators kunnen rooms toevoegen met " - "`!rooms add `." + "De kamer-index is nog leeg. Moderators kunnen kamers toevoegen met " + "`!kamer voegtoe `." ) return await self._send_cards( @@ -570,7 +570,7 @@ class RoomsOverviewPlugin(Plugin): found = await self._search_rooms(query) query_label = " ".join(query.split()) if not found: - await evt.reply(f"Geen rooms gevonden voor `{query_label}`.") + await evt.reply(f"Geen kamers gevonden voor `{query_label}`.") return await self._send_cards( evt, @@ -580,67 +580,70 @@ class RoomsOverviewPlugin(Plugin): ) async def _send_help(self, evt: MessageEvent) -> None: - """Uitgebreide Nederlandstalige handleiding voor !rooms.""" + """Uitgebreide Nederlandstalige handleiding voor !kamer.""" help_text = ( - "**!rooms** — overzicht van de room-index\n\n" - "Toont alle rooms als kaarten met naam, ledental, omschrijving " - "en een directe join-link. Ruimtes met een eigen icoon tonen die " - "naast de naam.\n\n" + "**!kamer** — overzicht van de kamer-index\n\n" + "Toont alle kamers als kaarten met naam, ledental, omschrijving " + "en een directe join-link. Kamers met een eigen icoon tonen die " + "naast de naam. De oude Engelse commando's (`!rooms`, `add`, " + "`edit`, `remove`, `refresh`, `help`) blijven als alias werken.\n\n" "**Basis:**\n" - "* `!rooms` — toon de volledige lijst (bij veel rooms verdeeld " + "* `!kamer` — toon de volledige lijst (bij veel kamers verdeeld " "over meerdere berichten)\n" - "* `!rooms over ` — zoek rooms op naam, alias en/of " - "omschrijving (bijv. `!rooms over linux`); alle termen moeten " + "* `!kamer over ` — zoek kamers op naam, alias en/of " + "omschrijving (bijv. `!kamer over linux`); alle termen moeten " "matchen\n\n" "**Subcommando's (moderator of hoger vereist):**\n" - "* `!rooms add ` — voeg een room toe aan de index\n" - "* `!rooms edit =` — wijzig een " - "veld van een room\n" - "* `!rooms remove ` — verwijder een room uit de index\n" - "* `!rooms refresh` — controleer of rooms nog bestaan en vul " + "* `!kamer voegtoe ` — voeg een kamer toe aan de index\n" + "* `!kamer wijzig =` — wijzig een " + "veld van een kamer\n" + "* `!kamer verwijder ` — verwijder een kamer uit de index\n" + "* `!kamer ververs` — controleer of kamers nog bestaan en vul " "ontbrekende avatars aan\n\n" - "**Veld bij edit:** `name` (naam), `topic` (omschrijving) of " + "**Veld bij wijzig:** `name` (naam), `topic` (omschrijving) of " "`alias` (adres). Een lege waarde wist het veld.\n\n" "**Voorbeelden:**\n" - "* `!rooms add #algemeen:mtux.nl`\n" - "* `!rooms edit #algemeen:mtux.nl name=Algemeen Overleg`\n" - "* `!rooms edit #algemeen:mtux.nl topic=` (wist de omschrijving)\n" - "* `!rooms remove #algemeen:mtux.nl`\n\n" - "Alleen moderators (macht ≥ 50) mogen rooms toevoegen, wijzigen " + "* `!kamer voegtoe #algemeen:mtux.nl`\n" + "* `!kamer wijzig #algemeen:mtux.nl name=Algemeen Overleg`\n" + "* `!kamer wijzig #algemeen:mtux.nl topic=` (wist de omschrijving)\n" + "* `!kamer verwijder #algemeen:mtux.nl`\n\n" + "Alleen moderators (macht ≥ 50) mogen kamers toevoegen, wijzigen " "of verwijderen. Iedereen kan de lijst bekijken." ) await evt.respond(help_text, markdown=True) @command.new( - name="rooms", - help="Toon de room-index als kaarten; subcommands: over (zoeken), add, edit, remove, refresh, help", + name="kamer", + aliases=["rooms"], + help="Toon de kamer-index als kaarten; subcommando's: over, voegtoe, wijzig, verwijder, ververs, hulp", require_subcommand=False, ) async def handle_rooms(self, evt: MessageEvent) -> None: await evt.mark_read() await self._send_list(evt) - @handle_rooms.subcommand(name="help", help="Toon deze handleiding") + @handle_rooms.subcommand(name="hulp", aliases=["help"], help="Toon deze handleiding") async def rooms_help(self, evt: MessageEvent) -> None: await self._send_help(evt) @handle_rooms.subcommand( name="over", - help="Zoek rooms op naam, alias of omschrijving: !rooms over ", + help="Zoek kamers op naam, alias of omschrijving: !kamer over ", ) @command.argument("terms", pass_raw=True, required=True) async def search_over(self, evt: MessageEvent, terms: str) -> None: if not terms.strip(): await evt.reply( - "Gebruik: `!rooms over ` (bijv. `!rooms over linux`).\n" + "Gebruik: `!kamer over ` (bijv. `!kamer over linux`).\n" "Zoekt op naam, alias en omschrijving; alle termen moeten matchen." ) return await self._send_search(evt, terms) @handle_rooms.subcommand( - name="add", - help="Voeg een room toe aan de index: !rooms add (moderator+)", + name="voegtoe", + aliases=["add"], + help="Voeg een kamer toe aan de index: !kamer voegtoe (moderator+)", ) @command.argument("room", pass_raw=True, required=True) async def add_room(self, evt: MessageEvent, room: str) -> None: @@ -649,11 +652,11 @@ class RoomsOverviewPlugin(Plugin): return room_id = room if room.startswith("!") else await self._resolve_alias(room) if not room_id: - await evt.reply(f"Room `{room}` kon niet gevonden worden.") + await evt.reply(f"Kamer `{room}` kon niet gevonden worden.") return info = await self._get_room_info(room_id) if info is None: - await evt.reply(f"Room `{room_id}` bestaat niet (of is niet meer bereikbaar).") + await evt.reply(f"Kamer `{room_id}` bestaat niet (of is niet meer bereikbaar).") return max_rooms = max(1, int(self.config.get("max_rooms", 300) or 300)) count = await self.database.fetchval( @@ -681,13 +684,14 @@ class RoomsOverviewPlugin(Plugin): ) target = info["alias"] or room_id await evt.reply( - f"Room toegevoegd: **{info['name'] or room_id}** " + f"Kamer toegevoegd: **{info['name'] or room_id}** " f"([{target}](https://matrix.to/#/{target}))" ) @handle_rooms.subcommand( - name="edit", - help="Wijzig een veld van een room: !rooms edit " + name="wijzig", + aliases=["edit"], + help="Wijzig een veld van een kamer: !kamer wijzig " "= (moderator+)", ) @command.argument("args", pass_raw=True, required=True) @@ -698,7 +702,7 @@ class RoomsOverviewPlugin(Plugin): parsed = _parse_edit_args(args) if parsed is None: await evt.reply( - "Gebruik: `!rooms edit =`\n" + "Gebruik: `!kamer wijzig =`\n" "Lege waarde wist het veld (bijv. `alias=`)." ) return @@ -712,7 +716,7 @@ class RoomsOverviewPlugin(Plugin): 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.") + await evt.reply(f"Kamer `{room_ref}` kon niet gevonden worden.") return new_value = value or None # lege waarde wist het veld (NULL) column = field_ok[field] @@ -724,7 +728,7 @@ class RoomsOverviewPlugin(Plugin): int(time.time()), ) if result != "UPDATE 1": - await evt.reply(f"Room `{room_id}` stond niet in de index.") + await evt.reply(f"Kamer `{room_id}` stond niet in de index.") return row = await self.database.fetchrow( "SELECT display_name, canonical_alias FROM roomsoverview_rooms " @@ -735,12 +739,13 @@ class RoomsOverviewPlugin(Plugin): 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}`." + f"Kamer bijgewerkt: **{label}** — {field_name} is nu `{shown}`." ) @handle_rooms.subcommand( - name="remove", - help="Verwijder een room uit de index: !rooms remove (moderator+)", + name="verwijder", + aliases=["remove"], + help="Verwijder een kamer uit de index: !kamer verwijder (moderator+)", ) @command.argument("room", pass_raw=True, required=True) async def remove_room(self, evt: MessageEvent, room: str) -> None: @@ -749,19 +754,20 @@ class RoomsOverviewPlugin(Plugin): return room_id = room if room.startswith("!") else await self._resolve_alias(room) if not room_id: - await evt.reply(f"Room `{room}` kon niet gevonden worden.") + await evt.reply(f"Kamer `{room}` kon niet gevonden worden.") return result = await self.database.execute( "DELETE FROM roomsoverview_rooms WHERE room_id = $1", room_id ) if result == "DELETE 1": - await evt.reply(f"Room verwijderd: `{room_id}`.") + await evt.reply(f"Kamer verwijderd: `{room_id}`.") else: - await evt.reply(f"Room `{room_id}` stond niet in de index.") + await evt.reply(f"Kamer `{room_id}` stond niet in de index.") @handle_rooms.subcommand( - name="refresh", - help="Controleer of rooms bestaan en vul ontbrekende avatars aan (moderator+)", + name="ververs", + aliases=["refresh"], + help="Controleer of kamers bestaan en vul ontbrekende avatars aan (moderator+)", ) async def refresh_index(self, evt: MessageEvent) -> None: if not await self._is_mod(evt.room_id, evt.sender): @@ -770,7 +776,7 @@ class RoomsOverviewPlugin(Plugin): removed, total = await self._validate_all() filled = await self._enrich_avatars_online() await evt.reply( - f"Index gecontroleerd: {total - removed} rooms over, " - f"{removed} verwijderd (bestonden niet meer). " - f"{filled} avatar(s) aangevuld." +f"Index gecontroleerd: {total - removed} kamers over, " + f"{removed} verwijderd (bestonden niet meer). " + f"{filled} avatar(s) aangevuld." ) \ No newline at end of file