93 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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