| from __future__ import annotations |
|
|
| import logging |
| import os |
| from dataclasses import dataclass |
| from dotenv import load_dotenv |
|
|
|
|
| logger = logging.getLogger("mega-bot.config") |
|
|
|
|
| @dataclass(slots=True) |
| class Settings: |
| token: str |
| prefix: str |
| owner_ids: set[int] |
| db_path: str |
| openrouter_api_key: str |
| openrouter_model: str |
| gemini_api_key: str = "" |
|
|
|
|
| def _parse_owner_ids(raw: str) -> set[int]: |
| """Parse and validate OWNER_IDS from environment variable.""" |
| if not raw or not raw.strip(): |
| logger.warning("OWNER_IDS is empty. No owners configured.") |
| return set() |
|
|
| owner_ids: set[int] = set() |
| for part in raw.split(","): |
| cleaned = part.strip() |
| if not cleaned: |
| continue |
| if not cleaned.isdigit(): |
| logger.warning("Invalid OWNER_IDS value skipped: %r", cleaned) |
| continue |
| value = int(cleaned) |
| |
| if value <= 0: |
| logger.warning("Invalid OWNER_IDS value (non-positive): %d", value) |
| continue |
| if value > 9_999_999_999_999_999_999: |
| logger.warning("Suspiciously large OWNER_IDS value: %d", value) |
| continue |
| owner_ids.add(value) |
|
|
| if not owner_ids: |
| logger.warning("No valid OWNER_IDS found after validation.") |
| else: |
| logger.info("Loaded %d owner ID(s).", len(owner_ids)) |
|
|
| return owner_ids |
|
|
|
|
| def load_settings() -> Settings: |
| load_dotenv() |
| token = os.getenv("DISCORD_TOKEN", "").strip() |
| prefix = os.getenv("PREFIX", "!").strip() or "!" |
| raw_owners = os.getenv("OWNER_IDS", "") |
| owner_ids = _parse_owner_ids(raw_owners) |
| raw_db_path = os.getenv("DB_PATH", "").strip() |
| if raw_db_path: |
| db_path = raw_db_path |
| else: |
| running_on_hf = bool(os.getenv("SPACE_ID", "").strip() or os.getenv("HF_SPACE_ID", "").strip()) |
| hf_data_dir = "/data" |
| if running_on_hf and os.path.isdir(hf_data_dir) and os.access(hf_data_dir, os.W_OK): |
| db_path = f"{hf_data_dir}/database.db" |
| else: |
| db_path = "database.db" |
| openrouter_api_key = os.getenv("OPENROUTER_API_KEY", "").strip() |
| gemini_api_key = os.getenv("GEMINI_API_KEY", "").strip() |
| openrouter_model = os.getenv("OPENROUTER_MODEL", "meta-llama/llama-3.3-70b-instruct:free").strip() or "meta-llama/llama-3.3-70b-instruct:free" |
| return Settings( |
| token=token, |
| prefix=prefix, |
| owner_ids=owner_ids, |
| db_path=db_path, |
| openrouter_api_key=openrouter_api_key, |
| openrouter_model=openrouter_model, |
| gemini_api_key=gemini_api_key, |
| ) |
|
|