"""Per-user notes, tags and favorites for sounds (user data folder, never the game folder).""" import json import os from ackit.paths import user_dir class UserData: def __init__(self, path=None): self.path = path or os.path.join(user_dir("data"), "sound_notes.json") try: self.data = json.load(open(self.path, encoding="utf-8")) except (OSError, ValueError): self.data = {} def save(self): tmp = self.path + ".tmp" with open(tmp, "w", encoding="utf-8") as f: json.dump(self.data, f, indent=1, ensure_ascii=False) os.replace(tmp, self.path) def _get(self, key): return self.data.get(key, {}) def note(self, key): return self._get(key).get("note", "") def tags(self, key): return self._get(key).get("tags", []) def favorite(self, key): return bool(self._get(key).get("fav")) def update(self, key, note=None, tags=None, fav=None): d = dict(self._get(key)) if note is not None: d["note"] = note.strip() if tags is not None: d["tags"] = sorted({t.strip() for t in tags if t.strip()}) if fav is not None: d["fav"] = bool(fav) d = {k: v for k, v in d.items() if v} if d: self.data[key] = d else: self.data.pop(key, None) self.save() def all_tags(self): return sorted({t for d in self.data.values() for t in d.get("tags", [])})