diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 52069f0..3c7dee5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,7 @@ jobs: env: BOT_TOKEN: dummy-token CHAT_ID: ${{ secrets.CHAT_ID || '0' }} + ADMIN_ID: ${{ secrets.ADMIN_ID }} run: | python -m pytest -q @@ -89,4 +90,5 @@ jobs: -v /opt/saintbot/db/database.db:/app/src/db/database.db \ -e BOT_TOKEN=${{ secrets.BOT_TOKEN }} \ -e CHAT_ID=${{ secrets.CHAT_ID }} \ + -e ADMIN_ID=${{ secrets.ADMIN_ID }} \ $IMAGE diff --git a/README.md b/README.md index 3f1e2da..313f92e 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,11 @@ ``` BOT_TOKEN="<токен вашего Telegram-бота от @BotFather>" CHAT_ID="" +ADMIN_ID="<обязательный ID администратора для команд /backup и /status>" ``` - `BOT_TOKEN` — обязательный токен бота. - `CHAT_ID` — необязательный, но полезный ID чата/канала, куда бот отправляет копии фото из желаний, чтобы они не пропали из-за ограничений Telegram. Получить можно командой `/ID`, переслав боту сообщение из нужного чата/канала. +- `ADMIN_ID` — обязательный ID администратора, которому доступны команды `/backup` и `/status`. Не храните `.env` в репозитории. diff --git a/src/app/bot.py b/src/app/bot.py index 02449db..64b1fb2 100644 --- a/src/app/bot.py +++ b/src/app/bot.py @@ -14,6 +14,7 @@ debug, join_room, settings as room_settings, + admin_command, ) @@ -37,6 +38,7 @@ async def run_bot(token: str) -> None: debug.router, join_room.router, room_settings.router, + admin_command.router, ) await bot.delete_webhook(drop_pending_updates=True) diff --git a/src/db/db.py b/src/db/db.py index 1f0fd39..ed1abc7 100644 --- a/src/db/db.py +++ b/src/db/db.py @@ -418,6 +418,24 @@ async def update_room_settings(room_iden, price=None, event_time=None, exchange_ ) db.commit() + + +async def get_stats(): + total_users_raw = cur.execute("SELECT COUNT(*) FROM users").fetchone() + participants_raw = cur.execute( + "SELECT COUNT(DISTINCT tg_id) FROM user_rooms WHERE is_member = TRUE" + ).fetchone() + rooms_total_raw = cur.execute("SELECT COUNT(*) FROM rooms").fetchone() + started_rooms_raw = cur.execute( + "SELECT COUNT(*) FROM rooms WHERE status = TRUE" + ).fetchone() + + total_users = total_users_raw[0] if total_users_raw else 0 + participants = participants_raw[0] if participants_raw else 0 + rooms_total = rooms_total_raw[0] if rooms_total_raw else 0 + started_rooms = started_rooms_raw[0] if started_rooms_raw else 0 + + return total_users, participants, rooms_total, started_rooms return True diff --git a/src/settings/settings.py b/src/settings/settings.py index 5423932..1ad875a 100644 --- a/src/settings/settings.py +++ b/src/settings/settings.py @@ -5,6 +5,7 @@ class Settings(BaseSettings): bot_token: str = "" chat_id: int | None = Field(default=None, alias="CHAT_ID") + admin_id: int @field_validator("chat_id", mode="before") def _normalize_chat_id(cls, v):