Add !rooms edit subcommand: moderators can change name/topic/alias of a room record; v2.3.0
This commit is contained in:
parent
11c8c5ca15
commit
812f30d333
3 changed files with 71 additions and 2 deletions
|
|
@ -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.
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue