From 1064af87d05e7d3fad1e8ef6deaa91a498ae1958 Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Sat, 14 Feb 2026 18:41:14 -0500 Subject: [PATCH] Add @promote and @demote admin commands --- src/mudlib/commands/build.py | 74 +++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/src/mudlib/commands/build.py b/src/mudlib/commands/build.py index 8a332b8..6adc300 100644 --- a/src/mudlib/commands/build.py +++ b/src/mudlib/commands/build.py @@ -4,7 +4,8 @@ from pathlib import Path from mudlib.commands import CommandDefinition, register from mudlib.export import export_zone_to_file -from mudlib.player import Player +from mudlib.player import Player, players +from mudlib.store import account_exists, load_player_data, set_admin from mudlib.things import spawn_thing, thing_templates from mudlib.zone import Zone from mudlib.zones import get_zone, register_zone @@ -114,7 +115,78 @@ async def cmd_place(player: Player, args: str) -> None: await player.send(f"Placed {thing_name} at ({player.x}, {player.y}).\r\n") +async def cmd_promote(player: Player, args: str) -> None: + """Grant admin status to a player.""" + target_name = args.strip() + if not target_name: + await player.send("Usage: @promote \r\n") + return + + if not account_exists(target_name): + await player.send(f"Account '{target_name}' not found.\r\n") + return + + # Check current status via live player or DB + data = load_player_data(target_name) + if data and data.get("is_admin"): + await player.send(f"{target_name} is already an admin.\r\n") + return + + set_admin(target_name, True) + + # Update live player if online + target = next( + (p for p in players.values() if p.name.lower() == target_name.lower()), + None, + ) + if target is not None: + target.is_admin = True + await target.send("You have been granted admin status.\r\n") + + await player.send(f"{target_name} is now an admin.\r\n") + + +async def cmd_demote(player: Player, args: str) -> None: + """Revoke admin status from a player.""" + target_name = args.strip() + if not target_name: + await player.send("Usage: @demote \r\n") + return + + if target_name.lower() == player.name.lower(): + await player.send("You can't demote yourself.\r\n") + return + + if not account_exists(target_name): + await player.send(f"Account '{target_name}' not found.\r\n") + return + + data = load_player_data(target_name) + if data and not data.get("is_admin"): + await player.send(f"{target_name} is not an admin.\r\n") + return + + set_admin(target_name, False) + + # Update live player if online + target = next( + (p for p in players.values() if p.name.lower() == target_name.lower()), + None, + ) + if target is not None: + target.is_admin = False + await target.send("Your admin status has been revoked.\r\n") + + await player.send(f"{target_name} is no longer an admin.\r\n") + + register(CommandDefinition("@goto", cmd_goto, admin=True, help="Teleport to a zone")) register(CommandDefinition("@dig", cmd_dig, admin=True, help="Create a new zone")) register(CommandDefinition("@save", cmd_save, admin=True, help="Save current zone")) register(CommandDefinition("@place", cmd_place, admin=True, help="Place a thing")) +register( + CommandDefinition("@promote", cmd_promote, admin=True, help="Grant admin status") +) +register( + CommandDefinition("@demote", cmd_demote, admin=True, help="Revoke admin status") +)