Implicitly support abbreviating commands
[mudpy.git] / mudpy / misc.py
index dce3ea6..501d5b4 100644 (file)
@@ -672,8 +672,18 @@ class User:
         if not prompt:
             return get_menu_prompt(self.state)
 
+        # Allow including the World clock state
+        if "$_(time)" in prompt:
+            prompt = prompt.replace(
+                "$_(time)",
+                str(universe.groups["internal"]["counters"].get("elapsed")))
+
+        # Append a single space for clear separation from user input
+        if prompt[-1] != " ":
+            prompt = "%s " % prompt
+
         # Return the cooked prompt
-        return "%s " % prompt
+        return prompt
 
     def adjust_echoing(self):
         """Adjust echoing to match state menu requirements."""
@@ -1464,6 +1474,25 @@ def check_for_connection(listening_socket):
     return user
 
 
+def find_command(command_name):
+    """Try to find a command by name or abbreviation."""
+
+    # lowercase the command
+    command_name = command_name.lower()
+
+    command = None
+    if command_name in universe.groups["command"]:
+        # the command matches a command word for which we have data
+        command = universe.groups["command"][command_name]
+    else:
+        for candidate in sorted(universe.groups["command"]):
+            if candidate.startswith(command_name):
+                # the command matches the start of a command word
+                command = universe.groups["command"][candidate]
+                break
+    return command
+
+
 def get_menu(state, error=None, choices=None):
     """Show the correct menu text to a user."""
 
@@ -1854,14 +1883,8 @@ def handler_active(user):
         else:
             command_name, parameters = first_word(input_data)
 
-        # lowercase the command
-        command_name = command_name.lower()
-
-        # the command matches a command word for which we have data
-        if command_name in universe.groups["command"]:
-            command = universe.groups["command"][command_name]
-        else:
-            command = None
+        # expand to an actual command
+        command = find_command(command_name)
 
         # if it's allowed, do it
         if actor.can_run(command):