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()