diff --git a/src/mudlib/player.py b/src/mudlib/player.py index fe39024..cf02737 100644 --- a/src/mudlib/player.py +++ b/src/mudlib/player.py @@ -4,6 +4,7 @@ from __future__ import annotations import asyncio import time +from collections.abc import Callable from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any @@ -29,6 +30,7 @@ class Player(Entity): caps: ClientCaps = field(default_factory=lambda: ClientCaps(ansi=True)) editor: Editor | None = None if_session: IFSession | EmbeddedIFSession | None = None + pending_input: Callable[..., Any] | None = None paint_mode: bool = False painting: bool = False paint_brush: str = "." diff --git a/src/mudlib/server.py b/src/mudlib/server.py index b216001..2647e00 100644 --- a/src/mudlib/server.py +++ b/src/mudlib/server.py @@ -504,8 +504,14 @@ async def shell( leave_msg = f"{player.name} steps away from the terminal.\r\n" await broadcast_to_spectators(player, leave_msg) else: - # Dispatch normal command - await mudlib.commands.dispatch(player, command) + # Check for pending input callback (used by @help create/edit prompts) + if player.pending_input is not None: + callback = player.pending_input + player.pending_input = None + await callback(player, command) + else: + # Dispatch normal command + await mudlib.commands.dispatch(player, command) # Update GMCP vitals after command (prompt shows vitals, so sync GMCP) send_char_vitals(player) diff --git a/tests/test_help_topics.py b/tests/test_help_topics.py index 2e601b3..2861c5f 100644 --- a/tests/test_help_topics.py +++ b/tests/test_help_topics.py @@ -154,3 +154,10 @@ def test_zones_toml_loads_from_content(): assert "zones" in topics assert topics["zones"].admin is True assert "@zones" in topics["zones"].body + + +def test_player_has_pending_input(): + from mudlib.player import Player + + p = Player(name="Test", x=0, y=0, reader=MagicMock(), writer=MagicMock()) + assert p.pending_input is None