mirror of
https://github.com/ada-dmitry/vol_bot.git
synced 2026-09-24 08:40:17 +00:00
init project
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
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}")
|
||||
@@ -0,0 +1,33 @@
|
||||
from aiogram import Router, F
|
||||
from aiogram.types import Message, CallbackQuery
|
||||
from sqlalchemy import select, insert, update
|
||||
from models import User
|
||||
from database import async_session
|
||||
from keyboards import get_subscription_keyboard
|
||||
|
||||
router = Router()
|
||||
|
||||
@router.message(F.text == "/start")
|
||||
async def start_handler(message: Message):
|
||||
async with async_session() as session:
|
||||
|
||||
result = await session.execute(select(User).where(User.user_id == message.from_user.id))
|
||||
user = result.scalar_one_or_none()
|
||||
if not user:
|
||||
await session.execute(insert(User).values(user_id=message.from_user.id))
|
||||
await session.commit()
|
||||
text = "Добро пожаловать! Управляйте подпиской:"
|
||||
await message.answer(text, reply_markup=get_subscription_keyboard(user.is_subscribed if user else True))
|
||||
|
||||
@router.callback_query(F.data.in_(["subscribe", "unsubscribe"]))
|
||||
async def toggle_subscription(callback: CallbackQuery):
|
||||
subscribe = callback.data == "subscribe"
|
||||
async with async_session() as session:
|
||||
await session.execute(
|
||||
update(User)
|
||||
.where(User.user_id == callback.from_user.id)
|
||||
.values(is_subscribed=subscribe)
|
||||
)
|
||||
await session.commit()
|
||||
await callback.message.edit_reply_markup(reply_markup=get_subscription_keyboard(subscribe))
|
||||
await callback.answer("Вы подписались!" if subscribe else "Вы отписались.")
|
||||
Reference in New Issue
Block a user