""" 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 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 ") 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 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 ") 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 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 ") 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 = """ key = "palace/write" locks = "cmd:all()" help_category = "Mind Palace" def func(self): if "=" not in self.args: self.caller.msg("Usage: palace/write = ") 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.")