167 lines
5.1 KiB
Python
167 lines
5.1 KiB
Python
"""
|
|
Live memory commands — write new memories into the palace from Evennia.
|
|
"""
|
|
|
|
import json
|
|
import subprocess
|
|
from evennia.commands.command import Command
|
|
from evennia import create_object
|
|
|
|
PALACE_SCRIPT = "/root/wizards/bezalel/evennia/palace_search.py"
|
|
PALACE_PATH = "/root/wizards/bezalel/.mempalace/palace"
|
|
ADDER_SCRIPT = "/root/wizards/bezalel/evennia/palace_add.py"
|
|
|
|
|
|
def _add_drawer(content, wing, room, source):
|
|
"""Add a verbatim drawer to the palace via the helper script."""
|
|
cmd = [
|
|
"/root/wizards/bezalel/hermes/venv/bin/python",
|
|
ADDER_SCRIPT,
|
|
content,
|
|
wing,
|
|
room,
|
|
source,
|
|
]
|
|
try:
|
|
result = subprocess.run(cmd, capture_output=True, text=True, timeout=15)
|
|
return result.returncode == 0 and "OK" in result.stdout
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
class CmdRecord(Command):
|
|
"""
|
|
Record a decision into the palace hall_facts.
|
|
|
|
Usage:
|
|
record <text>
|
|
record We decided to use PostgreSQL over MySQL.
|
|
"""
|
|
|
|
key = "record"
|
|
aliases = ["decide"]
|
|
locks = "cmd:all()"
|
|
help_category = "Mind Palace"
|
|
|
|
def func(self):
|
|
if not self.args.strip():
|
|
self.caller.msg("Record what decision? Usage: record <text>")
|
|
return
|
|
|
|
wing = self.caller.db.wing if self.caller.attributes.has("wing") else (self.caller.key.lower() if self.caller.key else "general")
|
|
text = self.args.strip()
|
|
full_text = f"DECISION ({wing}): {text}\nRecorded by {self.caller.key} via Evennia."
|
|
|
|
ok = _add_drawer(full_text, wing, "general", f"evennia:{self.caller.key}")
|
|
if ok:
|
|
self.caller.location.msg_contents(
|
|
f"$You() record() a decision in the palace archives.",
|
|
from_obj=self.caller,
|
|
)
|
|
else:
|
|
self.caller.msg("The palace scribes could not write that down.")
|
|
|
|
|
|
class CmdNote(Command):
|
|
"""
|
|
Note a breakthrough into the palace hall_discoveries.
|
|
|
|
Usage:
|
|
note <text>
|
|
note The GraphQL schema can be auto-generated from our typeclasses.
|
|
"""
|
|
|
|
key = "note"
|
|
aliases = ["jot"]
|
|
locks = "cmd:all()"
|
|
help_category = "Mind Palace"
|
|
|
|
def func(self):
|
|
if not self.args.strip():
|
|
self.caller.msg("Note what? Usage: note <text>")
|
|
return
|
|
|
|
wing = self.caller.db.wing if self.caller.attributes.has("wing") else (self.caller.key.lower() if self.caller.key else "general")
|
|
text = self.args.strip()
|
|
full_text = f"BREAKTHROUGH ({wing}): {text}\nNoted by {self.caller.key} via Evennia."
|
|
|
|
ok = _add_drawer(full_text, wing, "general", f"evennia:{self.caller.key}")
|
|
if ok:
|
|
self.caller.location.msg_contents(
|
|
f"$You() inscribe() a breakthrough into the palace scrolls.",
|
|
from_obj=self.caller,
|
|
)
|
|
else:
|
|
self.caller.msg("The palace scribes could not write that down.")
|
|
|
|
|
|
class CmdEvent(Command):
|
|
"""
|
|
Log an event into the palace hall_events.
|
|
|
|
Usage:
|
|
event <text>
|
|
event Gitea runner came back online after being offline for 6 hours.
|
|
"""
|
|
|
|
key = "event"
|
|
aliases = ["log"]
|
|
locks = "cmd:all()"
|
|
help_category = "Mind Palace"
|
|
|
|
def func(self):
|
|
if not self.args.strip():
|
|
self.caller.msg("Log what event? Usage: event <text>")
|
|
return
|
|
|
|
wing = self.caller.db.wing if self.caller.attributes.has("wing") else (self.caller.key.lower() if self.caller.key else "general")
|
|
text = self.args.strip()
|
|
full_text = f"EVENT ({wing}): {text}\nLogged by {self.caller.key} via Evennia."
|
|
|
|
ok = _add_drawer(full_text, wing, "general", f"evennia:{self.caller.key}")
|
|
if ok:
|
|
self.caller.location.msg_contents(
|
|
f"$You() chronicle() an event in the palace records.",
|
|
from_obj=self.caller,
|
|
)
|
|
else:
|
|
self.caller.msg("The palace scribes could not write that down.")
|
|
|
|
|
|
class CmdPalaceWrite(Command):
|
|
"""
|
|
Directly write a memory into a specific palace room.
|
|
|
|
Usage:
|
|
palace/write <room> = <text>
|
|
"""
|
|
|
|
key = "palace/write"
|
|
locks = "cmd:all()"
|
|
help_category = "Mind Palace"
|
|
|
|
def func(self):
|
|
if "=" not in self.args:
|
|
self.caller.msg("Usage: palace/write <room> = <text>")
|
|
return
|
|
|
|
room, text = self.args.split("=", 1)
|
|
room = room.strip()
|
|
text = text.strip()
|
|
|
|
if not room or not text:
|
|
self.caller.msg("Both room and text are required.")
|
|
return
|
|
|
|
wing = self.caller.db.wing if self.caller.attributes.has("wing") else (self.caller.key.lower() if self.caller.key else "general")
|
|
full_text = f"MEMORY ({wing}/{room}): {text}\nWritten by {self.caller.key} via Evennia."
|
|
|
|
ok = _add_drawer(full_text, wing, room, f"evennia:{self.caller.key}")
|
|
if ok:
|
|
self.caller.location.msg_contents(
|
|
f"$You() etch() a memory into the |c{room}|n room of the palace.",
|
|
from_obj=self.caller,
|
|
)
|
|
else:
|
|
self.caller.msg("The palace scribes could not write that down.")
|