mirror of
https://github.com/ada-dmitry/vol_bot.git
synced 2026-09-24 08:40:17 +00:00
58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
from aiogram import Router, F, Bot
|
|
from aiogram.types import Message
|
|
from sqlalchemy import select
|
|
from models import User
|
|
from database import async_session
|
|
import os
|
|
|
|
|
|
router = Router()
|
|
admin_ids = list(map(int, os.getenv("ADMINS").split(",")))
|
|
|
|
|
|
@router.message(F.text == "/admin")
|
|
async def admin_panel(message: Message):
|
|
if message.from_user.id not in admin_ids:
|
|
return await message.answer("Доступ запрещён.")
|
|
await message.answer("Команды:\n/stat — статистика\n/broadcast <текст> — рассылка")
|
|
|
|
|
|
@router.message(F.text.startswith("/stat"))
|
|
async def stat_handler(message: Message):
|
|
if message.from_user.id not in admin_ids:
|
|
return
|
|
async with async_session() as session:
|
|
total = await session.scalar(select(User).count())
|
|
subscribed = await session.scalar(
|
|
select(User).where(User.is_subscribed).count()
|
|
)
|
|
await message.answer(f"Всего пользователей: {total}\nПодписаны: {subscribed}")
|
|
|
|
|
|
@router.message(F.text.startswith("/broadcast "))
|
|
async def broadcast_handler(message: Message, bot: Bot):
|
|
if message.from_user.id not in admin_ids:
|
|
await message.answer("Доступ запрещён.")
|
|
return
|
|
|
|
text = message.text.removeprefix("/broadcast ").strip()
|
|
if not text:
|
|
await message.answer("Текст рассылки не найден.")
|
|
return
|
|
|
|
sent = 0
|
|
failed = 0
|
|
|
|
async with async_session() as session:
|
|
result = await session.execute(select(User.user_id).where(User.is_subscribed))
|
|
users = result.scalars().all()
|
|
|
|
for uid in users:
|
|
try:
|
|
await bot.send_message(uid, text)
|
|
sent += 1
|
|
except Exception:
|
|
failed += 1
|
|
|
|
await message.answer(f"📬 Рассылка завершена:\nУспешно: {sent}\nОшибок: {failed}")
|