| from __future__ import annotations |
| from pathlib import Path |
| from typing import TYPE_CHECKING |
|
|
| from pydantic_settings import BaseSettings, SettingsConfigDict |
|
|
| if TYPE_CHECKING: |
| from sqlalchemy.engine.url import URL |
|
|
| DIR = Path(__file__).absolute().parent.parent.parent |
| BOT_DIR = Path(__file__).absolute().parent.parent |
| LOCALES_DIR = f"{BOT_DIR}/locales" |
| I18N_DOMAIN = "messages" |
| DEFAULT_LOCALE = "en" |
|
|
|
|
| class EnvBaseSettings(BaseSettings): |
| model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") |
|
|
|
|
| class WebhookSettings(EnvBaseSettings): |
| USE_WEBHOOK: bool = False |
| WEBHOOK_BASE_URL: str = "https://xxx.ngrok-free.app" |
| WEBHOOK_PATH: str = "/webhook" |
| WEBHOOK_SECRET: str = "" |
| WEBHOOK_HOST: str = "localhost" |
| WEBHOOK_PORT: int = 8080 |
|
|
| @property |
| def webhook_url(self) -> str: |
| if settings.USE_WEBHOOK: |
| return f"{self.WEBHOOK_BASE_URL}{self.WEBHOOK_PATH}" |
| return f"http://localhost:{settings.WEBHOOK_PORT}{settings.WEBHOOK_PATH}" |
|
|
|
|
| class BotSettings(WebhookSettings): |
| BOT_TOKEN: str |
| SUPPORT_URL: str | None = None |
| RATE_LIMIT: int | float = 0.5 |
|
|
|
|
| class DBSettings(EnvBaseSettings): |
| DB_HOST: str = "postgres" |
| DB_PORT: int = 5432 |
| DB_USER: str = "postgres" |
| DB_PASS: str | None = None |
| DB_NAME: str = "postgres" |
|
|
| @property |
| def database_url(self) -> URL | str: |
| if self.DB_PASS: |
| return f"postgresql+asyncpg://{self.DB_USER}:{self.DB_PASS}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" |
| return f"postgresql+asyncpg://{self.DB_USER}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" |
|
|
| @property |
| def database_url_psycopg2(self) -> str: |
| if self.DB_PASS: |
| return f"postgresql://{self.DB_USER}:{self.DB_PASS}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" |
| return f"postgresql://{self.DB_USER}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" |
|
|
|
|
| class CacheSettings(EnvBaseSettings): |
| REDIS_HOST: str = "redis" |
| REDIS_PORT: int = 6379 |
| REDIS_PASS: str | None = None |
|
|
| |
| |
| |
| |
|
|
| @property |
| def redis_url(self) -> str: |
| if self.REDIS_PASS: |
| return f"redis://{self.REDIS_PASS}@{self.REDIS_HOST}:{self.REDIS_PORT}/0" |
| return f"redis://{self.REDIS_HOST}:{self.REDIS_PORT}/0" |
|
|
|
|
| class Settings(BotSettings, DBSettings, CacheSettings): |
| DEBUG: bool = False |
|
|
| SENTRY_DSN: str | None = None |
|
|
| AMPLITUDE_API_KEY: str |
|
|
|
|
| settings = Settings() |
|
|