Bot & Automation

Activity Reminder Bot

/root/hermes-projects/Activity Reminder Bot

apps/activity_reminder_bot/core/config.py text
from functools import lru_cache
from zoneinfo import ZoneInfo

from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")

    app_env: str = Field(default="production", alias="APP_ENV")
    app_name: str = Field(default="Activity Reminder Bot", alias="APP_NAME")
    app_timezone: str = Field(default="Asia/Jakarta", alias="APP_TIMEZONE")
    public_base_url: str = Field(default="http://localhost:8022", alias="PUBLIC_BASE_URL")
    log_level: str = Field(default="INFO", alias="LOG_LEVEL")

    telegram_bot_token: str = Field(default="", alias="TELEGRAM_BOT_TOKEN")
    telegram_admin_ids: str = Field(default="", alias="TELEGRAM_ADMIN_IDS")

    google_sheets_spreadsheet_id: str = Field(default="", alias="GOOGLE_SHEETS_SPREADSHEET_ID")
    google_service_account_json_base64: str = Field(default="", alias="GOOGLE_SERVICE_ACCOUNT_JSON_BASE64")
    google_sheets_worksheet_name: str = Field(default="Sheet1", alias="GOOGLE_SHEETS_WORKSHEET_NAME")

    scheduler_scan_seconds: int = Field(default=30, alias="SCHEDULER_SCAN_SECONDS")
    reminder_lookahead_minutes: int = Field(default=1, alias="REMINDER_LOOKAHEAD_MINUTES")
    alarm_repeat_enabled: bool = Field(default=True, alias="ALARM_REPEAT_ENABLED")
    alarm_repeat_interval_seconds: int = Field(default=60, alias="ALARM_REPEAT_INTERVAL_SECONDS")
    alarm_repeat_max_count: int = Field(default=5, alias="ALARM_REPEAT_MAX_COUNT")
    alarm_delete_previous_message: bool = Field(default=True, alias="ALARM_DELETE_PREVIOUS_MESSAGE")

    @property
    def timezone(self) -> ZoneInfo:
        return ZoneInfo(self.app_timezone)

    @property
    def admin_ids(self) -> set[int]:
        values: set[int] = set()
        for raw_id in self.telegram_admin_ids.split(","):
            raw_id = raw_id.strip()
            if raw_id.isdigit():
                values.add(int(raw_id))
        return values

    @property
    def is_telegram_configured(self) -> bool:
        return bool(self.telegram_bot_token.strip())

    @property
    def is_sheets_configured(self) -> bool:
        return bool(self.google_sheets_spreadsheet_id.strip() and self.google_service_account_json_base64.strip())


@lru_cache
def get_settings() -> Settings:
    return Settings()