Skip to content

Commit

Permalink
Use environs instead of getenv, include .env.dist
Browse files Browse the repository at this point in the history
  • Loading branch information
Arutemu64 committed Jul 29, 2023
1 parent c6f4408 commit efd4c45
Show file tree
Hide file tree
Showing 7 changed files with 444 additions and 174 deletions.
40 changes: 40 additions & 0 deletions .env.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Telegram bot token
BOT_TOKEN=

# Links
CHANNEL_ID=
CHANNEL_LINK=

# PostgreSQL settings
POSTGRES_DATABASE=
POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_PORT=
POSTGRES_HOST=

# Redis settings
REDIS_DATABASE=
REDIS_HOST=
REDIS_PASSWORD=

# Polling mode (polling/webhooks)
MODE=polling

# Ngrok settings (in case of MODE=webhooks)
NGROK_PROTOCOL=http
NGROK_PORT=8000
NGROK_AUTH=
NGROK_REGION=eu

# Sentry logging settings
SENTRY_DSN=
SENTRY_ENV=

# Logging settings
LOGGING_LEVEL=10
DB_ECHO=False
DEBUG=True

# Other bot settings
ANNOUNCE_TIMEOUT=5
EVENTS_PER_PAGE=7
501 changes: 358 additions & 143 deletions poetry.lock

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ aiogram = "3.0b7"
aiogram-dialog = "^2.0.0b20"
alembic = "^1.11.1"
asyncpg = "^0.28.0"
environs = "^9.5.0"
opencv-python-headless = "^4.8.0.74"
pyngrok = "^6.0.0"
qreader = {version = "^2.13", extras = ["yolo7"]}
Expand All @@ -29,6 +30,14 @@ isort = "^5.12.0"
[tool.poetry.group.dev]
optional=true

[tool.poetry.group.scripts]
optional=true

[tool.poetry.group.scripts.dependencies]
openpyxl = "^3.1.2"
pandas = "^2.0.3"
psycopg2 = "^2.9.6"

[tool.isort]
profile = "black"

Expand Down
2 changes: 1 addition & 1 deletion src/bot/dialogs/announce_mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ async def send_announce(
global_timestamp = float(await cache.get("announcement_timestamp"))
if global_timestamp:
timestamp = time.time()
if (timestamp - global_timestamp) < int(os.getenv("ANNOUNCE_TIMEOUT")):
if (timestamp - global_timestamp) < conf.bot.announcement_timeout:
await callback.answer(strings.errors.announce_too_fast, show_alert=True)
return
await cache.set("announcement_timestamp", time.time())
Expand Down
2 changes: 1 addition & 1 deletion src/bot/dialogs/widgets/schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from src.db import Database
from src.db.models import Event

per_page = conf.events_per_page
per_page = conf.bot.events_per_page


async def get_schedule(dialog_manager: DialogManager, db: Database, **kwargs):
Expand Down
8 changes: 5 additions & 3 deletions src/bot/ui/strings/errors.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import os
from environs import Env

env = Env()

announce = """❌ Произошла ошибка! Возможные варианты:
1. Нарушен синтаксис команды
2. Не найдено выступление под таким номером"""
ticket_not_found = "❌ Ваш билет не найден!"
ticket_used = "❌ Ваш билет был использован ранее!"
announce_too_fast = f"""❌ С прошлого анонса не прошло {os.getenv("ANNOUNCE_TIMEOUT")} секунд!
Чтобы избежать повторов, рассылка анонсов возможна раз в {os.getenv("ANNOUNCE_TIMEOUT")} секунд."""
announce_too_fast = f"""❌ С прошлого анонса не прошло {env("ANNOUNCE_TIMEOUT")} секунд!
Чтобы избежать повторов, рассылка анонсов возможна раз в {env("ANNOUNCE_TIMEOUT")} секунд."""
no_access = "❌ У вас нет доступа к этой команде!"
wrong_command_usage = "❌ Неправильное использование команды!"
performance_doesnt_exist = "❌ Такого выступления не существует!"
Expand Down
56 changes: 30 additions & 26 deletions src/config.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
import logging
from dataclasses import dataclass
from os import getenv

from environs import Env
from sqlalchemy.engine import URL

env = Env()
env.read_env()


class DatabaseConfig:
"""Database connection variables"""

name: str = getenv("POSTGRES_DATABASE")
user: str = getenv("POSTGRES_USER", "docker")
passwd: str = getenv("POSTGRES_PASSWORD", None)
port: int = int(getenv("POSTGRES_PORT", 5432))
host: str = getenv("POSTGRES_HOST", "db")
name: str = env("POSTGRES_DATABASE")
user: str = env("POSTGRES_USER", "docker")
passwd: str = env("POSTGRES_PASSWORD", None)
port: int = env.int("POSTGRES_PORT", 5432)
host: str = env("POSTGRES_HOST", "db")

driver: str = "asyncpg"
database_system: str = "postgresql"
Expand All @@ -34,41 +37,42 @@ def build_connection_str(self) -> str:
class RedisConfig:
"""Redis connection variables"""

db: str = int(getenv("REDIS_DATABASE", 1))
host: str = getenv("REDIS_HOST", "redis")
port: int = int(getenv("REDIS_PORT", 6379))
passwd: str = getenv("REDIS_PASSWORD")
username: int = getenv("REDIS_USERNAME")
state_ttl: int = getenv("REDIS_TTL_STATE", None)
data_ttl: int = getenv("REDIS_TTL_DATA", None)
db: str = env.int("REDIS_DATABASE", 1)
host: str = env("REDIS_HOST", "redis")
port: int = env.int("REDIS_PORT", 6379)
passwd: str = env("REDIS_PASSWORD")
username: str = env("REDIS_USERNAME", None)
state_ttl: int = env.int("REDIS_TTL_STATE", None)
data_ttl: int = env.int("REDIS_TTL_DATA", None)


@dataclass
class BotConfig:
"""Bot configuration"""

token: str = getenv("BOT_TOKEN")
mode: str = getenv("MODE", "polling")
token: str = env("BOT_TOKEN")
mode: str = env("MODE", "polling")

channel_id: int = env.int("CHANNEL_ID")
channel_link: str = env("CHANNEL_LINK")

channel_id = int(getenv("CHANNEL_ID"))
channel_link = getenv("CHANNEL_LINK")
ngrok_auth: str = env("NGROK_AUTH")
ngrok_region: str = env("NGROK_REGION", "eu")

ngrok_auth: str = getenv("NGROK_AUTH")
ngrok_region = getenv("NGROK_REGION", "eu")
sentry_dsn: str = env("SENTRY_DSN")
sentry_env: str = env("SENTRY_ENV")

sentry_dsn = getenv("SENTRY_DSN")
sentry_env = getenv("SENTRY_ENV")
events_per_page = env.int("EVENTS_PER_PAGE", 7)
announcement_timeout = env.int("ANNOUNCE_TIMEOUT", 30)


@dataclass
class Configuration:
"""All in one configuration's class"""

debug = bool(getenv("DEBUG", "False") == "True")
logging_level = int(getenv("LOGGING_LEVEL", logging.INFO))
db_echo = bool(getenv("DB_ECHO", "False") == "True")

events_per_page = 2
debug = env.bool("DEBUG", False)
logging_level = env.int("LOGGING_LEVEL", logging.INFO)
db_echo = env.bool("DB_ECHO", False)

db = DatabaseConfig()
bot = BotConfig()
Expand Down

0 comments on commit efd4c45

Please sign in to comment.