# ── Startup Congratulation ──────────────────────────────────────────────────────── import json import os import random import time # JSON-backed state for greetings rotation + cross-device achievement sync. # _load/_save were referenced throughout but never defined (NameError on every # greeting/sync call); implemented here against DATA_DIR. try: from config import DATA_DIR except Exception: DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data") _STATE_FILE = os.path.join(DATA_DIR, "arc_reactor_state.json") def _load() -> dict: try: with open(_STATE_FILE, "r", encoding="utf-8") as f: return json.load(f) except Exception: return {} def _save(data: dict) -> None: try: os.makedirs(os.path.dirname(_STATE_FILE), exist_ok=True) with open(_STATE_FILE, "w", encoding="utf-8") as f: json.dump(data, f) except Exception: pass ACTIVATION_GREETINGS = [ "Hey! I'm here.", "Online! Hey, what's up?", "Got it! What do you need?", "Hey! Ready to go.", "I'm here! What's up?", "Online! Hey, what do you need?", "Hey! What's happening?", "Gotcha! What do you need?", "Hey! Let's go.", "I'm online! Hey.", ] POST_ACTIVATION_PROMPTS = [ "Want me to show latest news in AR?", "India news? Shall I display in AR?", "What's happening in the world - show AR?", "Latest updates - AR or normal?", "Check world news? AR display?", ] def get_activation_greeting() -> str: """Get unique activation greeting.""" data = _load() used = data.get("used_greetings", []) available = [g for g in ACTIVATION_GREETINGS if g not in used] if not available: available = ACTIVATION_GREETINGS greeting = random.choice(available) used = used[-9:] + [greeting] data["used_greetings"] = used _save(data) return greeting def get_post_activation_prompt() -> str: """Get the 'what's happening' prompt after activation.""" import random return random.choice(POST_ACTIVATION_PROMPTS) # ── PC <-> Phone Sync ──────────────────────────────────────────────────────── def sync_achievement(source: str, achievement: dict): """Sync achievement between PC and Phone.""" data = _load() data.setdefault("sync", {})[source] = { "achievement": achievement, "time": time.time(), "synced": False, } _save(data) def get_pending_sync() -> list[dict]: """Get achievements pending sync.""" data = _load() sync = data.get("sync", {}) pending = [] for source, info in sync.items(): if not info.get("synced"): pending.append({"source": source, "data": info}) return pending def mark_synced(source: str): """Mark achievement as synced.""" data = _load() if source in data.get("sync", {}): data["sync"][source]["synced"] = True _save(data) def sync_to_phone(): """Sync pending to phone.""" pending = get_pending_sync() for p in pending: source = p.get("source") if source == "pc": continue try: from phone.status_provider import broadcast_status broadcast_status({"achievement": p.get("data", {}).get("achievement", {})}) mark_synced(source) except Exception: pass def sync_to_pc(): """Sync pending to PC.""" pending = get_pending_sync() for p in pending: source = p.get("source") if source == "phone": try: from modules.obsidian import unlock_achievement data = p.get("data", {}).get("achievement", {}) unlock_achievement(data.get("name", ""), data) mark_synced(source) except Exception: pass # ── AR Hologram Control ──────────────────────────────────────────────────────── AR_PRESETS = ["table", "helmet", "float"] def ar_patch(state: dict) -> bool: """Apply AR state.""" try: from modules.ar_scene import set_state set_state(state) return True except Exception: return False def ar_load_state() -> dict: """Get current AR state.""" try: from modules.ar_scene import get_state return get_state() except Exception: return {} # ── Dynamic Lines ──────────────────────────────────────────────────────── def get_completion_line(category: str = "task") -> str: """Get never-repeating completion line.""" try: from engines.dynamic_lines import get_line return get_line(category) except Exception: return "Done."