mud/src/mudlib/player.py

45 lines
1.3 KiB
Python

"""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.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 | None = None
@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] = {}