Początek pakietu zyrarbot, budowanego wedle zasady jedna klasa = jeden plik.
- Settings zbiera konfigurację ze zmiennych środowiskowych oraz ścieżki
i limity, które dotąd były literałami rozsianymi po bot.py i web.py
("config/config.json", "uploads", zakres 1-999, domyślne 5 odtworzeń).
- JsonFileStore zastępuje sześć niemal identycznych bloków open/json.load
z ręcznym try/except. Brakujący lub uszkodzony plik daje pusty słownik
zamiast wyjątku, a zapis sam tworzy katalog.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Settings:
|
|
"""Konfiguracja aplikacji odczytana ze zmiennych środowiskowych."""
|
|
|
|
discord_token: str | None = None
|
|
guild_id: int | None = None
|
|
config_dir: str = "config"
|
|
uploads_dir: str = "uploads"
|
|
static_dir: str = "static"
|
|
web_host: str = "0.0.0.0"
|
|
web_port: int = 8000
|
|
default_plays: int = 5
|
|
history_limit: int = 50
|
|
min_plays: int = 1
|
|
max_plays: int = 999
|
|
|
|
@classmethod
|
|
def from_env(cls) -> Settings:
|
|
load_dotenv()
|
|
raw_guild_id = os.getenv("GUILD_ID")
|
|
return cls(
|
|
discord_token=os.getenv("DISCORD_TOKEN"),
|
|
guild_id=int(raw_guild_id) if raw_guild_id else None,
|
|
)
|
|
|
|
@property
|
|
def config_file(self) -> str:
|
|
return os.path.join(self.config_dir, "config.json")
|
|
|
|
@property
|
|
def history_file(self) -> str:
|
|
return os.path.join(self.config_dir, "history.json")
|
|
|
|
def is_valid_plays(self, value: int) -> bool:
|
|
return self.min_plays <= value <= self.max_plays
|