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 = "🔴 Контекст данного взаимодействия сброшен. Данные могут отличаться от указанных вами."