- carry Matrix room_id through command callbacks - persist pending confirmations by user_id and room_id
76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
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))
|