Add pending_input callback to Player for prompted input

This commit is contained in:
Jared Miller 2026-02-15 09:53:54 -05:00
parent a24e0c03c3
commit 6524116e97
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
3 changed files with 17 additions and 2 deletions

View file

@ -4,6 +4,7 @@ from __future__ import annotations
import asyncio import asyncio
import time import time
from collections.abc import Callable
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
@ -29,6 +30,7 @@ class Player(Entity):
caps: ClientCaps = field(default_factory=lambda: ClientCaps(ansi=True)) caps: ClientCaps = field(default_factory=lambda: ClientCaps(ansi=True))
editor: Editor | None = None editor: Editor | None = None
if_session: IFSession | EmbeddedIFSession | None = None if_session: IFSession | EmbeddedIFSession | None = None
pending_input: Callable[..., Any] | None = None
paint_mode: bool = False paint_mode: bool = False
painting: bool = False painting: bool = False
paint_brush: str = "." paint_brush: str = "."

View file

@ -504,8 +504,14 @@ async def shell(
leave_msg = f"{player.name} steps away from the terminal.\r\n" leave_msg = f"{player.name} steps away from the terminal.\r\n"
await broadcast_to_spectators(player, leave_msg) await broadcast_to_spectators(player, leave_msg)
else: else:
# Dispatch normal command # Check for pending input callback (used by @help create/edit prompts)
await mudlib.commands.dispatch(player, command) 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) # Update GMCP vitals after command (prompt shows vitals, so sync GMCP)
send_char_vitals(player) send_char_vitals(player)

View file

@ -154,3 +154,10 @@ def test_zones_toml_loads_from_content():
assert "zones" in topics assert "zones" in topics
assert topics["zones"].admin is True assert topics["zones"].admin is True
assert "@zones" in topics["zones"].body 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