diff --git a/handlers/buy.py b/handlers/buy.py index d4e4aef..fa966de 100644 --- a/handlers/buy.py +++ b/handlers/buy.py @@ -3,14 +3,25 @@ from aiogram import Router, F from aiogram.types import CallbackQuery from aiogram.fsm.context import FSMContext -from keyboards.client import devices_selector, duration_selector -from misc.utils import calculate_price, convert_int_to_duration +from keyboards.client import ( + devices_selector, + duration_selector, + return_to_menu, + payment_gateways, +) +from misc.utils import ( + calculate_price, + convert_int_to_duration, + format_support_subscription, +) from schemas.subscriptions import SubscriptionPlan from states.buy import SubscriptionStorage from texts import ( CALLBACK_FALLBACK, + CHECKOUT_PAYMENT_CHOICE, CONTEXT_REINITIATED, NOTHING_PLACEHOLDER, + STANDARD_FALLBACK, SUBSCRIPTION_DEVICE_SELECTOR, SUBSCRIPTION_DURATION_SELECTOR, ) @@ -58,18 +69,13 @@ async def toggle_whitelists(cb: CallbackQuery, state: FSMContext): data = await state.get_data() await state.clear() - ctx: Optional[SubscriptionPlan] = data.get("ctx") - if not ctx: - await state.set_state(SubscriptionPlan()) - await state.set_data({"ctx": ctx}) - await cb.answer(CALLBACK_FALLBACK) - return + ctx: Optional[SubscriptionPlan] = data.get("ctx", SubscriptionPlan()) ctx.whitelists = ( not ctx.whitelists or ctx.devices >= settings.whitelist_device_threshold ) try: - await cb.message.edit_reply_markup( + await cb.message.edit_text( SUBSCRIPTION_DEVICE_SELECTOR.format(price=calculate_price(ctx)), reply_markup=devices_selector( current=ctx.devices, whitelists=ctx.whitelists @@ -91,8 +97,6 @@ async def select_duration_init(cb: CallbackQuery, state: FSMContext): ctx: Optional[SubscriptionPlan] = data.get("ctx") if not ctx: - await state.set_state(SubscriptionPlan()) - await state.set_data({"ctx": ctx}) await cb.answer(CALLBACK_FALLBACK) return @@ -121,8 +125,6 @@ async def select_duration(cb: CallbackQuery, state: FSMContext): ctx: Optional[SubscriptionPlan] = data.get("ctx") if not ctx: - await state.set_state() - await state.set_data({"ctx": ctx}) await cb.answer(CONTEXT_REINITIATED) ctx = SubscriptionPlan() @@ -149,5 +151,15 @@ async def select_duration(cb: CallbackQuery, state: FSMContext): @router.callback_query(SubscriptionStorage.duration, F.data == "confirm") async def proceed_to_checkout(cb: CallbackQuery, state: FSMContext): - await cb.answer("yay!!!! fuck off.") - ... + data = await state.get_data() + await state.clear() + + ctx: Optional[SubscriptionPlan] = data.get("ctx") + if not ctx: + await cb.message.edit_text(STANDARD_FALLBACK, reply_markup=return_to_menu) + return + + await cb.message.edit_text( + CHECKOUT_PAYMENT_CHOICE.format(code=format_support_subscription(ctx)), + reply_markup=payment_gateways, + ) # FIXME: temp solution that's incredibly stupid diff --git a/handlers/support.py b/handlers/support.py index 98659c8..05ec05b 100644 --- a/handlers/support.py +++ b/handlers/support.py @@ -51,11 +51,13 @@ async def received_message( F.message_thread_id.is_not(None), F.from_user.is_bot == False, # noqa: E712 ~Command("close"), + F.text, ) async def handle_admin_message( msg: Message, state: FSMContext, session: AsyncSession, deps: DependenciesDTO ): await state.clear() + print(str(msg)) await deps.user_service.support_answer(session, msg) diff --git a/keyboards/client.py b/keyboards/client.py index fc92341..b17e4c1 100644 --- a/keyboards/client.py +++ b/keyboards/client.py @@ -86,3 +86,11 @@ def duration_selector( builder.row(_return_btn(back_cb)) return builder.as_markup() + + +payment_gateways: InlineKeyboardMarkup = InlineKeyboardBuilder( + [ + [InlineKeyboardButton(text="✍️ Поддержка", callback_data="support")], + [_return_to_menu_btn], + ] +).as_markup() diff --git a/misc/utils.py b/misc/utils.py index a4d96c0..1a37242 100644 --- a/misc/utils.py +++ b/misc/utils.py @@ -169,3 +169,18 @@ def calculate_price(subscription: SubscriptionPlan): else 0 ) ) * convert_duration_to_int(subscription.duration) + + +def format_support_subscription(subscription: SubscriptionPlan) -> str: + whitelist_description = "ВЫКЛ" + if subscription.devices >= settings.whitelist_device_threshold: + whitelist_description = "ВКЛ (Бесплатно)" + elif subscription.whitelists: + whitelist_description = "ВКЛ (Платно)" + + return ( + f"Подписка на {convert_duration_to_int(subscription.duration)} месяцев.\n" + f"Количество устройств: {subscription.devices}\n" + f"Белые списки: {whitelist_description}\n\n" + f"Итого: {calculate_price(subscription)}₽" + ) diff --git a/services/user_service.py b/services/user_service.py index e2238c0..8cd9466 100644 --- a/services/user_service.py +++ b/services/user_service.py @@ -115,6 +115,7 @@ class UserService: await self.ticket_repository.update_ticket_status( session, ticket, TicketStatus.CLOSED ) + raise rw_user = await get_user_by_telegram_id(rw, user.id) creator = TicketCreator(id=user.id, username=msg.from_user.username) diff --git a/texts.py b/texts.py index eac494d..c81199a 100644 --- a/texts.py +++ b/texts.py @@ -38,6 +38,13 @@ STANDARD_FALLBACK = ( "❌ Что-то пошло не так, прожмите /start и повторите попытку позже." ) +TEMP_SUPPORT_FORM = ( + "обратитесь в поддержку, прикрепив текст ниже:\n\n" "\n" "{code}\n" "" +) +CHECKOUT_PAYMENT_CHOICE = ( + "в поддержку чирканите епта там всё обьяснят\n" + TEMP_SUPPORT_FORM +) + CALLBACK_FALLBACK = "❌ Что-то пошло не так" CONTEXT_REINITIATED = "🔴 Контекст данного взаимодействия сброшен. Данные могут отличаться от указанных вами."