mud/src/mudlib/commands/read.py

56 lines
1.7 KiB
Python

"""Read command for examining readable objects."""
from mudlib.commands import CommandDefinition, register
from mudlib.player import Player
from mudlib.thing import Thing
def _find_readable(player: Player, name: str) -> Thing | None:
"""Find a readable thing by name or alias in inventory or on ground."""
name_lower = name.lower()
# Check inventory first
for obj in player.contents:
if not isinstance(obj, Thing):
continue
if obj.name.lower() == name_lower:
return obj
if any(a.lower() == name_lower for a in obj.aliases):
return obj
# Check ground at player's position
if player.location is not None:
from mudlib.zone import Zone
if isinstance(player.location, Zone):
for obj in player.location.contents_at(player.x, player.y):
if not isinstance(obj, Thing):
continue
if obj.name.lower() == name_lower:
return obj
if any(a.lower() == name_lower for a in obj.aliases):
return obj
return None
async def cmd_read(player: Player, args: str) -> None:
"""Read a readable object."""
target_name = args.strip()
if not target_name:
await player.send("Read what?\r\n")
return
thing = _find_readable(player, target_name)
if thing is None:
await player.send("You don't see that here.\r\n")
return
if not thing.readable_text:
await player.send("There's nothing to read on that.\r\n")
return
await player.send(f"You read the {thing.name}:\r\n{thing.readable_text}\r\n")
register(CommandDefinition("read", cmd_read, help="Read a readable object"))