Добавление логгирования

This commit is contained in:
ada-dmitry
2025-05-03 09:42:50 +03:00
parent e1063b669f
commit ec2c0c7dfc
21 changed files with 244 additions and 99 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8 -2
View File
@@ -5,24 +5,30 @@ 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())
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:
@@ -48,4 +54,4 @@ async def broadcast_handler(message: Message, bot: Bot):
except Exception:
failed += 1
await message.answer(f"📬 Рассылка завершена:\nУспешно: {sent}\nОшибок: {failed}")
await message.answer(f"📬 Рассылка завершена:\nУспешно: {sent}\nОшибок: {failed}")
+1 -5
View File
@@ -11,11 +11,10 @@ import os
router = Router()
admin_ids = list(map(int, os.getenv("ADMINS", "").split(",")))
# Храним рассылки
adv_memory = {} # {adv_id: {"text": str, "is_active": bool}}
current_adv_id = None
# Состояния для FSM
class AdvForm(StatesGroup):
short = State()
full = State()
@@ -44,18 +43,15 @@ async def get_full_text_and_send(message: Message, state: FSMContext, bot: Bot):
# Генерируем уникальный ID рассылки
adv_id = str(uuid4())
# Деактивируем старые рассылки
for adv in adv_memory.values():
adv["is_active"] = False
# Сохраняем новую рассылку
adv_memory[adv_id] = {
"text": full_text,
"is_active": True
}
current_adv_id = adv_id
# Клавиатура
kb = InlineKeyboardMarkup(inline_keyboard=[
[
InlineKeyboardButton(text="👍 Интересно", callback_data=f"adv:{adv_id}"),
+64 -14
View File
@@ -3,35 +3,47 @@ from aiogram.fsm.context import FSMContext
from aiogram.types import Message, CallbackQuery
from aiogram.fsm.state import State, StatesGroup
from sqlalchemy import select, insert, update
import logging
from models import User
from database import async_session
from keyboards import get_subscription_keyboard
logger = logging.getLogger(__name__)
router = Router()
# Машина состояний
class Register(StatesGroup):
waiting_for_fullname = State()
waiting_for_study_group = State()
@router.message(F.text == "/start")
async def start_handler(message: Message, state: FSMContext):
user_id = message.from_user.id
logger.info(f"User {message.from_user.id} started the bot")
async with async_session() as session:
result = await session.execute(select(User).where(User.user_id == user_id))
user = result.scalar_one_or_none()
if user:
# Приветствие при повторном запуске
text = f"👋 Привет, {user.full_name or 'друг'}!\n" \
f"Группа: {user.study_group or 'не указана'}\n" \
"Используй кнопки ниже, чтобы управлять подпиской:"
await message.answer(text, reply_markup=get_subscription_keyboard(user.is_subscribed))
text = (
f"👋 Привет, {user.full_name or 'друг'}!\n"
f"Группа: {user.study_group or 'не указана'}\n"
"Используй кнопки ниже, чтобы управлять подпиской:"
)
await message.answer(
text, reply_markup=get_subscription_keyboard(user.is_subscribed)
)
else:
# Первый запуск — регистрация
await state.set_state(Register.waiting_for_fullname)
await message.answer("👋 Привет! Пожалуйста, напиши свои ФИО одной строкой:")
await message.answer(
"👋 Привет! Пожалуйста, напиши свои ФИО одной строкой:"
)
@router.message(Register.waiting_for_fullname)
async def get_fullname(message: Message, state: FSMContext):
@@ -39,6 +51,7 @@ async def get_fullname(message: Message, state: FSMContext):
await state.set_state(Register.waiting_for_study_group)
await message.answer("Теперь укажи номер своей группы (например, Б11-111):")
@router.message(Register.waiting_for_study_group)
async def get_study_group(message: Message, state: FSMContext):
data = await state.get_data()
@@ -46,14 +59,51 @@ async def get_study_group(message: Message, state: FSMContext):
study_group = message.text
async with async_session() as session:
await session.execute(insert(User).values(
user_id=message.from_user.id,
full_name=full_name,
study_group=study_group,
is_subscribed=True
))
await session.execute(
insert(User).values(
user_id=message.from_user.id,
full_name=full_name,
study_group=study_group,
is_subscribed=True,
)
)
await session.commit()
await message.answer(f"✅ Регистрация завершена!\nФИО: {full_name}\nГруппа: {study_group}")
await message.answer("Теперь ты можешь управлять подпиской ниже 👇", reply_markup=get_subscription_keyboard(True))
await message.answer(
f"✅ Регистрация завершена!\nФИО: {full_name}\nГруппа: {study_group}"
)
await message.answer(
"Теперь ты можешь управлять подпиской ниже 👇",
reply_markup=get_subscription_keyboard(True),
)
await state.clear()
@router.callback_query(F.data == "subscribe")
async def subscribe(callback: CallbackQuery):
async with async_session() as session:
await session.execute(
update(User)
.where(User.user_id == callback.from_user.id)
.values(is_subscribed=True)
)
await session.commit()
await callback.message.edit_reply_markup(
reply_markup=get_subscription_keyboard(True)
)
await callback.answer("✅ Вы подписались на рассылку!")
@router.callback_query(F.data == "unsubscribe")
async def unsubscribe(callback: CallbackQuery):
async with async_session() as session:
await session.execute(
update(User)
.where(User.user_id == callback.from_user.id)
.values(is_subscribed=False)
)
await session.commit()
await callback.message.edit_reply_markup(
reply_markup=get_subscription_keyboard(False)
)
await callback.answer("❌ Вы отписались от рассылки.")