import json import os import base64 from typing import Dict, Any from cryptography.fernet import Fernet from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC class ConfigManager: """Класс для работы с зашифрованным конфигом""" def __init__(self, key_string: str = "FISHKArrCONFIG", config_file: str = "Config.rr"): self.key_string = key_string self.config_file = config_file self.config_dir = self._get_config_directory() self.config_path = os.path.join(self.config_dir, config_file) self.current_config = self.load_config() self._observers = [] def _get_config_directory(self) -> str: """Возвращает путь к директории для сохранения конфига""" # Путь: C:\Users\[USERNAME]\AppData\LocalLow\Robotic Retailers\Robonect4 appdata = os.environ.get('LOCALAPPDATA', '') if appdata: # Заменяем 'Local' на 'LocalLow' в пути # Обычно LOCALAPPDATA указывает на ...\AppData\Local # Нам нужно ...\AppData\LocalLow base_path = appdata.replace('Local', 'LocalLow') config_dir = os.path.join(base_path, 'Robotic Retailers', 'Robonect4') else: # Fallback для Linux/Mac base_path = os.path.expanduser('~') config_dir = os.path.join(base_path, '.config', 'Robotic Retailers', 'Robonect4') # Создаем директорию, если она не существует try: os.makedirs(config_dir, exist_ok=True) print(f"Директория для конфига: {config_dir}") except Exception as e: print(f"Ошибка создания директории: {e}") # В случае ошибки используем текущую директорию config_dir = os.getcwd() return config_dir def add_observer(self, callback): """Добавляет наблюдателя для обновлений конфига""" self._observers.append(callback) def notify_observers(self): """Уведомляет наблюдателей об изменении конфига""" for callback in self._observers: callback() def save_config(self, data: Dict[str, Any]) -> bool: """Сохраняет конфиг в файл в AppData/LocalLow""" try: # Убеждаемся, что директория существует os.makedirs(self.config_dir, exist_ok=True) # Сохраняем файл with open(self.config_path, 'w', encoding="utf-8") as f: json.dump(data, f, indent=2) print(f"Конфиг сохранен: {self.config_path}") self.current_config = data self.notify_observers() return True except Exception as e: print(f"Ошибка сохранения: {e}") return False def load_config(self) -> Dict[str, Any]: """Загружает конфиг из файла в AppData/LocalLow""" if not os.path.exists(self.config_path): print(f"Файл конфига не найден: {self.config_path}") return {} try: with open(self.config_path, 'r') as f: config = json.load(f) print(f"Конфиг загружен: {self.config_path}") return config except Exception as e: print(f"Ошибка загрузки: {e}") return {} def get_config_path(self) -> str: """Возвращает полный путь к файлу конфига""" return self.config_path