aboutsummaryrefslogtreecommitdiffstats
path: root/cogs/utils/settings.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cogs/utils/settings.py69
1 files changed, 46 insertions, 23 deletions
diff --git a/cogs/utils/settings.py b/cogs/utils/settings.py
index d66ce7f..7146b6c 100644
--- a/cogs/utils/settings.py
+++ b/cogs/utils/settings.py
@@ -3,16 +3,18 @@
3# Copyright (C) 2026 Salmonik @ salmonik@tuta.io 3# Copyright (C) 2026 Salmonik @ salmonik@tuta.io
4# https://codeberg.org/salmonik/senator-sperma 4# https://codeberg.org/salmonik/senator-sperma
5 5
6import json
7import logging 6import logging
8import aiofiles 7import sqlite3
9import os 8import os
10from dataclasses import dataclass, field 9from dataclasses import dataclass, field
11 10
11from cogs.utils.database import get_connection, init_database
12
12logger = logging.getLogger(__name__) 13logger = logging.getLogger(__name__)
13 14
14settings_file = "data/settings.json" 15DEFAULT_BASEURL = "http://localhost:3939"
15DEFAULT_BASEURL = "http://localhost:8080" 16
17init_database()
16 18
17 19
18@dataclass 20@dataclass
@@ -28,24 +30,22 @@ class Settings:
28 } 30 }
29 31
30 try: 32 try:
31 if os.path.exists(settings_file): 33 conn = get_connection()
32 async with aiofiles.open(settings_file, "r") as f: 34 c = conn.cursor()
33 content = await f.read() 35 c.execute("SELECT key, value FROM settings")
34 if content.strip(): 36 rows = c.fetchall()
35 self._data = json.loads(content) 37 conn.close()
36 self._sync_from_data() 38
37 logger.info("Settings loaded into memory") 39 if rows:
38 else: 40 self._data = {row[0]: row[1] for row in rows}
39 self._data = default_settings.copy() 41 self._sync_from_data()
40 self._sync_from_data() 42 logger.info("Settings loaded from database")
41 await self.save()
42 logger.warning("Empty settings.json, reset to defaults")
43 else: 43 else:
44 self._data = default_settings.copy() 44 self._data = default_settings.copy()
45 self._sync_from_data() 45 self._sync_from_data()
46 await self.save() 46 await self.save()
47 logger.info("Created default settings.json") 47 logger.info("Created default settings in database")
48 except json.JSONDecodeError as e: 48 except Exception as e:
49 logger.error(f"Error loading settings: {e}") 49 logger.error(f"Error loading settings: {e}")
50 self._data = default_settings.copy() 50 self._data = default_settings.copy()
51 self._sync_from_data() 51 self._sync_from_data()
@@ -53,17 +53,28 @@ class Settings:
53 return self 53 return self
54 54
55 def _sync_from_data(self): 55 def _sync_from_data(self):
56 self.volume = self._data.get("volume", 1.0) 56 try:
57 self.volume = float(self._data.get("volume", 1.0))
58 except (ValueError, TypeError):
59 self.volume = 1.0
57 self.baseurl = self._data.get("baseurl", DEFAULT_BASEURL) 60 self.baseurl = self._data.get("baseurl", DEFAULT_BASEURL)
58 61
59 def _sync_to_data(self): 62 def _sync_to_data(self):
60 self._data["volume"] = self.volume 63 self._data["volume"] = str(self.volume)
61 self._data["baseurl"] = self.baseurl 64 self._data["baseurl"] = self.baseurl
62 65
63 async def save(self): 66 async def save(self):
64 self._sync_to_data() 67 self._sync_to_data()
65 async with aiofiles.open(settings_file, "w") as f: 68 conn = get_connection()
66 await f.write(json.dumps(self._data, indent=2)) 69 c = conn.cursor()
70 c.execute("PRAGMA foreign_keys = ON")
71 for key, value in self._data.items():
72 c.execute(
73 "INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)",
74 (key, value),
75 )
76 conn.commit()
77 conn.close()
67 78
68 79
69_settings_instance: Settings | None = None 80_settings_instance: Settings | None = None
@@ -90,4 +101,16 @@ def get_volume() -> float:
90 101
91 102
92def get_baseurl() -> str: 103def get_baseurl() -> str:
93 return _settings_instance.baseurl.rstrip("/") if _settings_instance else DEFAULT_BASEURL 104 url = os.getenv("COPYPARTY_URL")
105 if not url:
106 logger.warning("COPYPARTY_URL not set! Using default http://localhost:3939")
107 return DEFAULT_BASEURL
108 return url.rstrip("/")
109
110
111def get_uploadurl() -> str:
112 url = os.getenv("COPYPARTY_URL_UPLOAD")
113 if not url:
114 logger.warning("COPYPARTY_URL_UPLOAD not set! Using default http://localhost:3939")
115 return DEFAULT_BASEURL
116 return url.rstrip("/")