from aiogram import F, Router from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery, Message from sqlalchemy.ext.asyncio import AsyncSession from schemas.di import DependenciesDTO from schemas.promotions import NewPromotionContext from bot.texts import ADM_PROMO_INIT, CALLBACK_FALLBACK, GENERAL_PROCESSING, ADM_VERIFY_PROMOTION, SUCCESSFULLY_SENT_PROMO from bot.keyboards.common import return_to_menu from bot.keyboards.admins import action_confirmation from bot.states.admins import AdminStorage router = Router() @router.callback_query(F.data == "promotion") async def promo_init(cb: CallbackQuery, state: FSMContext): await state.clear() await cb.message.edit_text(ADM_PROMO_INIT, reply_markup=return_to_menu) ctx = NewPromotionContext(cb.message) await state.set_state(AdminStorage.promotion_msg) await state.set_data({"ctx": ctx}) @router.message(AdminStorage.promotion_msg) async def promo_text(msg: Message, state: FSMContext): data = await state.get_data() await state.clear() edited_msg = await msg.answer(GENERAL_PROCESSING) ctx: NewPromotionContext | None = data.get("ctx") if ctx: await ctx.msg.delete() ctx.promotion = msg await edited_msg.edit_text(ADM_VERIFY_PROMOTION, reply_markup=action_confirmation) await state.set_state(AdminStorage.promotion_msg) await state.set_data({"ctx": ctx}) @router.callback_query(AdminStorage.promotion_msg, F.data.in_(("approve", "decline"))) async def promo_send(cb: CallbackQuery, state: FSMContext, session: AsyncSession, deps: DependenciesDTO): data = await state.get_data() await state.clear() ctx: NewPromotionContext | None = data.get("ctx") if not (ctx and ctx.promotion and ctx.msg): await cb.message.edit_text(CALLBACK_FALLBACK, reply_markup=return_to_menu) return successful = await deps.user_service.launch_promotion(session, ctx.promotion) await cb.message.edit_text(SUCCESSFULLY_SENT_PROMO.format(successful=successful), reply_markup=return_to_menu)