Add @promote and @demote admin commands

This commit is contained in:
Jared Miller 2026-02-14 18:41:14 -05:00
parent 05afff9538
commit 1064af87d0
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C

View file

@ -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 <player_name>\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 <player_name>\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")
)