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