Files
Iridium/iridium/head.py
T
SKYMirror d5ba9743ed release: Iridium 26.9.1
MCDR plugin: item share, hat, player head, calculator, join MOTD.
All rights reserved. Author: 云镜之端/SKYMirror
2026-09-13 02:32:54 +08:00

53 lines
1.8 KiB
Python

from mcdreforged.api.all import *
from iridium.config import config
from iridium.utils import (
check_cooldown,
check_permission,
mark_cooldown,
require_player,
safe_execute,
sanitize_name,
)
from iridium.version_util import is_at_least, require_version, tr
def _give_head_command(player: str, target: str, version: Version) -> str:
# Defense in depth: never interpolate an unsanitized name
safe_player = sanitize_name(player) or "Steve"
safe_target = sanitize_name(target) or safe_player
if is_at_least(version, "1.20.5"):
return f'give {safe_player} minecraft:player_head[minecraft:profile="{safe_target}"] 1'
if is_at_least(version, "1.13"):
return f'give {safe_player} minecraft:player_head{{SkullOwner:"{safe_target}"}} 1'
return f'give {safe_player} minecraft:skull 1 3 {{SkullOwner:"{safe_target}"}}'
def do_head(server: PluginServerInterface, src: CommandSource, context: dict) -> None:
player = require_player(src)
if player is None:
return
if not check_permission(src, config.permission):
return
version = require_version(server, src)
if version is None:
return
target = context.get("player_name") or player
safe_target = sanitize_name(target) or sanitize_name(player) or player
if not check_cooldown(src, player, "head", config.head_cooldown_seconds):
return
safe_execute(server, _give_head_command(player, safe_target, version))
mark_cooldown(player, "head")
src.reply(RText(tr("head_success", safe_target), RColor.green))
def register(server: PluginServerInterface) -> None:
builder = SimpleCommandBuilder()
builder.command("!!head", lambda src: do_head(server, src, {}))
builder.command("!!head <player_name>", lambda src, ctx: do_head(server, src, ctx))
builder.arg("player_name", Text)
builder.register(server)
server.register_help_message("!!head [player]", tr("head_help", config.head_cooldown_seconds))