from __future__ import annotations import json import logging import threading from config import DATA_DIR from tickets.data import GuildTicketConfig, TicketData logger = logging.getLogger("vision") TICKETS_DIR = DATA_DIR / "tickets" _CONFIG_FILE = TICKETS_DIR / "config.json" _lock = threading.Lock() _config_cache: dict[int, GuildTicketConfig] = {} _tickets_cache: dict[int, TicketData] = {} def _ensure_dirs(): TICKETS_DIR.mkdir(parents=True, exist_ok=True) def _load_all_configs() -> dict[int, GuildTicketConfig]: global _config_cache _ensure_dirs() if _config_cache: return _config_cache if _CONFIG_FILE.exists(): with open(_CONFIG_FILE, "r", encoding="utf-8") as f: raw = json.load(f) _config_cache = {int(k): GuildTicketConfig.from_dict(v) for k, v in raw.items()} else: _config_cache = {} return _config_cache def _save_all_configs(): _ensure_dirs() data = {str(k): v.to_dict() for k, v in _config_cache.items()} with open(_CONFIG_FILE, "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False) def get_config(guild_id: int) -> GuildTicketConfig: with _lock: configs = _load_all_configs() if guild_id not in configs: configs[guild_id] = GuildTicketConfig(guild_id=guild_id) return configs[guild_id] def save_config(config: GuildTicketConfig): with _lock: _config_cache[config.guild_id] = config _save_all_configs() def get_ticket(channel_id: int) -> TicketData | None: with _lock: if channel_id in _tickets_cache: return _tickets_cache[channel_id] ticket_file = TICKETS_DIR / f"{channel_id}.json" if ticket_file.exists(): with open(ticket_file, "r", encoding="utf-8") as f: ticket = TicketData.from_dict(json.load(f)) _tickets_cache[channel_id] = ticket return ticket return None def save_ticket(ticket: TicketData): with _lock: _tickets_cache[ticket.channel_id] = ticket _ensure_dirs() ticket_file = TICKETS_DIR / f"{ticket.channel_id}.json" with open(ticket_file, "w", encoding="utf-8") as f: json.dump(ticket.to_dict(), f, indent=2, ensure_ascii=False) def delete_ticket(channel_id: int): with _lock: _tickets_cache.pop(channel_id, None) ticket_file = TICKETS_DIR / f"{channel_id}.json" if ticket_file.exists(): ticket_file.unlink()