from __future__ import annotations from core.store import StateStore ROOM_META_PREFIX = "matrix_room:" USER_META_PREFIX = "matrix_user:" ROOM_STATE_PREFIX = "matrix_state:" SKILLS_MSG_PREFIX = "matrix_skills_msg:" PENDING_CONFIRM_PREFIX = "matrix_pending_confirm:" async def get_room_meta(store: StateStore, room_id: str) -> dict | None: return await store.get(f"{ROOM_META_PREFIX}{room_id}") async def set_room_meta(store: StateStore, room_id: str, meta: dict) -> None: await store.set(f"{ROOM_META_PREFIX}{room_id}", meta) async def get_user_meta(store: StateStore, matrix_user_id: str) -> dict | None: return await store.get(f"{USER_META_PREFIX}{matrix_user_id}") async def set_user_meta(store: StateStore, matrix_user_id: str, meta: dict) -> None: await store.set(f"{USER_META_PREFIX}{matrix_user_id}", meta) async def get_room_state(store: StateStore, room_id: str) -> str: data = await store.get(f"{ROOM_STATE_PREFIX}{room_id}") return data["state"] if data else "idle" async def set_room_state(store: StateStore, room_id: str, state: str) -> None: await store.set(f"{ROOM_STATE_PREFIX}{room_id}", {"state": state}) async def get_skills_message_id(store: StateStore, room_id: str) -> str | None: data = await store.get(f"{SKILLS_MSG_PREFIX}{room_id}") return data["event_id"] if data else None async def set_skills_message_id(store: StateStore, room_id: str, event_id: str) -> None: await store.set(f"{SKILLS_MSG_PREFIX}{room_id}", {"event_id": event_id}) async def next_chat_id(store: StateStore, matrix_user_id: str) -> str: meta = await get_user_meta(store, matrix_user_id) or {} index = int(meta.get("next_chat_index", 1)) meta["next_chat_index"] = index + 1 await set_user_meta(store, matrix_user_id, meta) return f"C{index}" def _pending_confirm_key(user_id: str, room_id: str | None = None) -> str: if room_id is None: return f"{PENDING_CONFIRM_PREFIX}{user_id}" return f"{PENDING_CONFIRM_PREFIX}{user_id}:{room_id}" async def get_pending_confirm( store: StateStore, user_id: str, room_id: str | None = None ) -> dict | None: return await store.get(_pending_confirm_key(user_id, room_id)) async def set_pending_confirm( store: StateStore, user_id: str, room_id: str | dict, meta: dict | None = None ) -> None: if meta is None: await store.set(_pending_confirm_key(user_id), room_id) return await store.set(_pending_confirm_key(user_id, str(room_id)), meta) async def clear_pending_confirm( store: StateStore, user_id: str, room_id: str | None = None ) -> None: await store.delete(_pending_confirm_key(user_id, room_id))