93 lines
3.9 KiB
Python
93 lines
3.9 KiB
Python
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 |