test / bot /config.py
mtaaz's picture
Upload 94 files
91c7f83 verified
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)
# Discord snowflake IDs are positive integers, typically 17-19 digits
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,
)