Delete data_manager.py
This commit is contained in:
		
							parent
							
								
									a0a8c7de1a
								
							
						
					
					
						commit
						7cd202a5c4
					
				@ -1,90 +0,0 @@
 | 
			
		||||
import json
 | 
			
		||||
import threading
 | 
			
		||||
import shutil
 | 
			
		||||
import os
 | 
			
		||||
from typing import Callable, Any
 | 
			
		||||
 | 
			
		||||
class DataManager:
 | 
			
		||||
    def __init__(self, json_path: str):
 | 
			
		||||
        self.json_path = json_path
 | 
			
		||||
        self.lock = threading.Lock()
 | 
			
		||||
        self._data = self._load()
 | 
			
		||||
 | 
			
		||||
    def _load(self):
 | 
			
		||||
        try:
 | 
			
		||||
            with open(self.json_path, 'r') as f:
 | 
			
		||||
                return json.load(f)
 | 
			
		||||
        except FileNotFoundError:
 | 
			
		||||
            default = {
 | 
			
		||||
                'agreed_rules': [],
 | 
			
		||||
                'agreed_engagement': [],
 | 
			
		||||
                'agreed_nickname': [],
 | 
			
		||||
                'nick_same_confirmed': [],
 | 
			
		||||
                'nick_nudged': [],
 | 
			
		||||
                'nick_dm_map': [],
 | 
			
		||||
                'pirates': [],
 | 
			
		||||
                'modlog': [],
 | 
			
		||||
                'reports': [],
 | 
			
		||||
                'encounters': [],
 | 
			
		||||
                'vc_channels': [],
 | 
			
		||||
                'user_cards': [],
 | 
			
		||||
                'pirates_list_posts': [],
 | 
			
		||||
                'spicepay_prefs': [],
 | 
			
		||||
                'nick_verified': [],
 | 
			
		||||
                'nick_claim_pending': [],
 | 
			
		||||
                'nick_reviews': [],
 | 
			
		||||
                'rr_msg_channels': [],
 | 
			
		||||
            }
 | 
			
		||||
            self._save(default)
 | 
			
		||||
            return default
 | 
			
		||||
 | 
			
		||||
    def _safe_write(self, data: dict):
 | 
			
		||||
        # ensure parent dir exists
 | 
			
		||||
        os.makedirs(os.path.dirname(self.json_path) or ".", exist_ok=True)
 | 
			
		||||
        tmp = self.json_path + ".tmp"
 | 
			
		||||
        with open(tmp, 'w') as f:
 | 
			
		||||
            json.dump(data, f, indent=4)
 | 
			
		||||
        # backup current file (best-effort)
 | 
			
		||||
        if os.path.exists(self.json_path):
 | 
			
		||||
            try:
 | 
			
		||||
                shutil.copy2(self.json_path, self.json_path + ".bak")
 | 
			
		||||
            except Exception:
 | 
			
		||||
                pass
 | 
			
		||||
        os.replace(tmp, self.json_path)
 | 
			
		||||
 | 
			
		||||
    def _save(self, data: dict):
 | 
			
		||||
        # single place to write (atomic replace + rolling .bak)
 | 
			
		||||
        self._safe_write(data)
 | 
			
		||||
 | 
			
		||||
    def get(self, category: str):
 | 
			
		||||
        with self.lock:
 | 
			
		||||
            return list(self._data.get(category, []))
 | 
			
		||||
 | 
			
		||||
    def add(self, category: str, item: Any):
 | 
			
		||||
        with self.lock:
 | 
			
		||||
            self._data.setdefault(category, []).append(item)
 | 
			
		||||
            self._save(self._data)
 | 
			
		||||
 | 
			
		||||
    def remove(self, category: str, predicate: Callable[[Any], bool]):
 | 
			
		||||
        with self.lock:
 | 
			
		||||
            arr = self._data.get(category, [])
 | 
			
		||||
            self._data[category] = [i for i in arr if not predicate(i)]
 | 
			
		||||
            self._save(self._data)
 | 
			
		||||
 | 
			
		||||
    def update(self, category: str, predicate: Callable[[Any], bool], updater: Callable[[dict], dict]) -> bool:
 | 
			
		||||
        """
 | 
			
		||||
        Atomically find one item in `category` matching predicate and update it with `updater`.
 | 
			
		||||
        Returns True if an item was updated, else False.
 | 
			
		||||
        """
 | 
			
		||||
        with self.lock:
 | 
			
		||||
            arr = self._data.get(category, [])
 | 
			
		||||
            for idx, item in enumerate(arr):
 | 
			
		||||
                if predicate(item):
 | 
			
		||||
                    # Copy → mutate → save back
 | 
			
		||||
                    new_item = dict(item)
 | 
			
		||||
                    new_item = updater(new_item) or new_item
 | 
			
		||||
                    arr[idx] = new_item
 | 
			
		||||
                    self._data[category] = arr
 | 
			
		||||
                    self._save(self._data)
 | 
			
		||||
                    return True
 | 
			
		||||
            return False
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user