world/multi_user_bridge.py — HTTP API for multi-user AI interaction (280 lines)
commands/timmy_commands.py — Evennia commands (ask, tell, timmy status)
paper/ — Research paper draft + experiment results
Key findings:
- 0% cross-contamination (3 concurrent users, isolated contexts)
- Crisis detection triggers correctly ('Are you safe right now?')
98 lines
2.7 KiB
Python
98 lines
2.7 KiB
Python
"""
|
|
Evennia command for talking to Timmy in-game.
|
|
|
|
Usage in-game:
|
|
say Hello Timmy
|
|
ask Timmy about the Tower
|
|
tell Timmy I need help
|
|
|
|
Timmy responds with isolated context per user.
|
|
"""
|
|
|
|
from evennia import Command
|
|
|
|
|
|
class CmdTalkTimmy(Command):
|
|
"""
|
|
Talk to Timmy in the room.
|
|
|
|
Usage:
|
|
say <message> (if Timmy is in the room)
|
|
ask Timmy <message>
|
|
tell Timmy <message>
|
|
"""
|
|
|
|
key = "ask"
|
|
aliases = ["tell"]
|
|
locks = "cmd:all()"
|
|
|
|
def func(self):
|
|
caller = self.caller
|
|
message = self.args.strip()
|
|
|
|
if not message:
|
|
caller.msg("Ask Timmy what?")
|
|
return
|
|
|
|
# Build user identity
|
|
user_id = f"mud_{caller.id}"
|
|
username = caller.key
|
|
room = caller.location.key if caller.location else "The Threshold"
|
|
|
|
# Call the multi-user bridge
|
|
import json
|
|
from urllib.request import Request, urlopen
|
|
|
|
bridge_url = "http://127.0.0.1:4004/bridge/chat"
|
|
payload = json.dumps({
|
|
"user_id": user_id,
|
|
"username": username,
|
|
"message": message,
|
|
"room": room,
|
|
}).encode()
|
|
|
|
try:
|
|
req = Request(bridge_url, data=payload, headers={"Content-Type": "application/json"})
|
|
resp = urlopen(req, timeout=30)
|
|
data = json.loads(resp.read())
|
|
timmy_response = data.get("response", "*The green LED flickers.*")
|
|
|
|
# Show to caller
|
|
caller.msg(f"Timmy says: {timmy_response}")
|
|
|
|
# Show to others in room (without the response text, just that Timmy is talking)
|
|
for obj in caller.location.contents:
|
|
if obj != caller and obj.has_account:
|
|
obj.msg(f"{caller.key} asks Timmy something. Timmy responds.")
|
|
|
|
except Exception as e:
|
|
caller.msg(f"Timmy is quiet. The green LED glows. (Bridge error: {e})")
|
|
|
|
|
|
class CmdTimmyStatus(Command):
|
|
"""
|
|
Check Timmy's status in the world.
|
|
|
|
Usage:
|
|
timmy status
|
|
"""
|
|
|
|
key = "timmy"
|
|
aliases = ["timmy-status"]
|
|
locks = "cmd:all()"
|
|
|
|
def func(self):
|
|
import json
|
|
from urllib.request import urlopen
|
|
|
|
try:
|
|
resp = urlopen("http://127.0.0.1:4004/bridge/health", timeout=5)
|
|
data = json.loads(resp.read())
|
|
self.caller.msg(
|
|
f"Timmy Status:\n"
|
|
f" Active sessions: {data.get('active_sessions', '?')}\n"
|
|
f" The green LED is {'glowing' if data.get('status') == 'ok' else 'flickering'}."
|
|
)
|
|
except:
|
|
self.caller.msg("Timmy is offline. The green LED is dark.")
|