diff options
Diffstat (limited to '')
| -rw-r--r-- | cogs/utils/settings.py | 108 |
1 files changed, 69 insertions, 39 deletions
diff --git a/cogs/utils/settings.py b/cogs/utils/settings.py index 0a1716f..984ec16 100644 --- a/cogs/utils/settings.py +++ b/cogs/utils/settings.py | |||
| @@ -7,56 +7,86 @@ import json | |||
| 7 | import logging | 7 | import logging |
| 8 | import aiofiles | 8 | import aiofiles |
| 9 | import os | 9 | import os |
| 10 | from dataclasses import dataclass, field | ||
| 10 | 11 | ||
| 11 | logger = logging.getLogger(__name__) | 12 | logger = logging.getLogger(__name__) |
| 12 | 13 | ||
| 13 | _settings = None | ||
| 14 | settings_file = "data/settings.json" | 14 | settings_file = "data/settings.json" |
| 15 | 15 | ||
| 16 | async def load_settings(): | 16 | |
| 17 | global _settings | 17 | @dataclass |
| 18 | global settings_file | 18 | class Settings: |
| 19 | 19 | volume: float = 1.0 | |
| 20 | default_settings = { | 20 | baseurl: str = "http://localhost:8080" |
| 21 | 'volume': 1.0, | 21 | _data: dict = field(default_factory=dict, init=False) |
| 22 | 'baseurl': 'http://localhost:8080' | 22 | |
| 23 | } | 23 | async def load(self) -> "Settings": |
| 24 | 24 | default_settings = { | |
| 25 | try: | 25 | "volume": 1.0, |
| 26 | if os.path.exists(settings_file): | 26 | "baseurl": "http://localhost:8080", |
| 27 | async with aiofiles.open(settings_file, 'r') as f: | 27 | } |
| 28 | content = await f.read() | 28 | |
| 29 | if content.strip(): | 29 | try: |
| 30 | _settings = json.loads(content) | 30 | if os.path.exists(settings_file): |
| 31 | logger.info("Settings loaded into memory") | 31 | async with aiofiles.open(settings_file, "r") as f: |
| 32 | else: | 32 | content = await f.read() |
| 33 | _settings = default_settings | 33 | if content.strip(): |
| 34 | await save_settings() | 34 | self._data = json.loads(content) |
| 35 | logger.warning("Empty settings.json, reset to defaults") | 35 | self._sync_from_data() |
| 36 | else: | 36 | logger.info("Settings loaded into memory") |
| 37 | _settings = default_settings | 37 | else: |
| 38 | await save_settings() | 38 | self._data = default_settings.copy() |
| 39 | logger.info("Created default settings.json") | 39 | self._sync_from_data() |
| 40 | except (json.JSONDecodeError, Exception) as e: | 40 | await self.save() |
| 41 | logger.error(f"Error loading settings: {e}") | 41 | logger.warning("Empty settings.json, reset to defaults") |
| 42 | _settings = default_settings | 42 | else: |
| 43 | 43 | self._data = default_settings.copy() | |
| 44 | return _settings | 44 | self._sync_from_data() |
| 45 | await self.save() | ||
| 46 | logger.info("Created default settings.json") | ||
| 47 | except (json.JSONDecodeError, Exception) as e: | ||
| 48 | logger.error(f"Error loading settings: {e}") | ||
| 49 | self._data = default_settings.copy() | ||
| 50 | self._sync_from_data() | ||
| 51 | |||
| 52 | return self | ||
| 53 | |||
| 54 | def _sync_from_data(self): | ||
| 55 | self.volume = self._data.get("volume", 1.0) | ||
| 56 | self.baseurl = self._data.get("baseurl", "http://localhost:8080") | ||
| 57 | |||
| 58 | def _sync_to_data(self): | ||
| 59 | self._data["volume"] = self.volume | ||
| 60 | self._data["baseurl"] = self.baseurl | ||
| 61 | |||
| 62 | async def save(self): | ||
| 63 | self._sync_to_data() | ||
| 64 | async with aiofiles.open(settings_file, "w") as f: | ||
| 65 | await f.write(json.dumps(self._data, indent=2)) | ||
| 66 | |||
| 67 | |||
| 68 | _settings_instance: Settings | None = None | ||
| 69 | |||
| 70 | |||
| 71 | async def load_settings() -> Settings: | ||
| 72 | global _settings_instance | ||
| 73 | _settings_instance = Settings() | ||
| 74 | await _settings_instance.load() | ||
| 75 | return _settings_instance | ||
| 45 | 76 | ||
| 46 | 77 | ||
| 47 | async def save_settings(): | 78 | async def save_settings(): |
| 48 | if _settings: | 79 | if _settings_instance: |
| 49 | async with aiofiles.open(settings_file, 'w') as f: | 80 | await _settings_instance.save() |
| 50 | await f.write(json.dumps(_settings, indent=2)) | ||
| 51 | 81 | ||
| 52 | 82 | ||
| 53 | def get_settings(): | 83 | def get_settings() -> Settings | None: |
| 54 | return _settings | 84 | return _settings_instance |
| 55 | 85 | ||
| 56 | 86 | ||
| 57 | def get_volume(): | 87 | def get_volume() -> float: |
| 58 | return _settings.get('volume', 1.0) if _settings else 1.0 | 88 | return _settings_instance.volume if _settings_instance else 1.0 |
| 59 | 89 | ||
| 60 | 90 | ||
| 61 | def get_baseurl(): | 91 | def get_baseurl() -> str: |
| 62 | return _settings.get('baseurl', 'http://localhost:8080').rstrip('/') if _settings else 'http://localhost:8080' \ No newline at end of file | 92 | return _settings_instance.baseurl.rstrip("/") if _settings_instance else "http://localhost:8080" |
