"""Player state and registry.""" from __future__ import annotations from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any from mudlib.caps import ClientCaps from mudlib.entity import Entity if TYPE_CHECKING: from mudlib.editor import Editor from mudlib.embedded_if_session import EmbeddedIFSession from mudlib.if_session import IFSession @dataclass class Player(Entity): """Represents a connected player.""" writer: Any = None # telnetlib3 TelnetWriter for sending output reader: Any = None # telnetlib3 TelnetReader for reading input flying: bool = False mode_stack: list[str] = field(default_factory=lambda: ["normal"]) caps: ClientCaps = field(default_factory=lambda: ClientCaps(ansi=True)) editor: Editor | None = None if_session: IFSession | EmbeddedIFSession | None = None paint_mode: bool = False painting: bool = False paint_brush: str = "." @property def mode(self) -> str: """Current mode is the top of the stack.""" return self.mode_stack[-1] @property def color_depth(self) -> str: """Best available color mode: truecolor, 256, or 16.""" return self.caps.color_depth async def send(self, message: str) -> None: """Send a message to the player via their telnet writer.""" self.writer.write(message) await self.writer.drain() # Global registry of connected players players: dict[str, Player] = {}