Move DTO definitions from dto/ to schemas/ and update imports. Add buy handler with FSM state management for device selection, whitelist toggling, and duration choice. Include pricing logic, inline keyboards, and new configuration fields.
70 lines
2.1 KiB
Python
70 lines
2.1 KiB
Python
import logging
|
|
from aiogram import Router, F
|
|
from aiogram.filters import Command
|
|
from aiogram.fsm.context import FSMContext
|
|
from aiogram.types import CallbackQuery, Message
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from config import settings
|
|
from schemas.di import DependenciesDTO
|
|
from services.user_service import UserServiceException
|
|
from states.support import SupportStorage
|
|
from texts import GENERAL_PROCESSING, STANDARD_FALLBACK, SUPPORT_INIT, SUPPORT_MSG_SENT
|
|
from keyboards.client import return_to_menu
|
|
|
|
router = Router()
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@router.callback_query(F.data == "support")
|
|
async def support_init(cb: CallbackQuery, state: FSMContext):
|
|
await state.clear()
|
|
|
|
await cb.message.edit_text(text=SUPPORT_INIT, reply_markup=return_to_menu)
|
|
await state.set_state(SupportStorage.prompt)
|
|
|
|
|
|
@router.message(SupportStorage.prompt)
|
|
async def received_message(
|
|
msg: Message, state: FSMContext, session: AsyncSession, deps: DependenciesDTO
|
|
):
|
|
await state.clear()
|
|
|
|
notification_msg = await msg.reply(GENERAL_PROCESSING)
|
|
|
|
try:
|
|
await deps.user_service.support_forward_message(session, msg, deps.rw_sdk)
|
|
except UserServiceException:
|
|
await msg.reply(STANDARD_FALLBACK)
|
|
raise
|
|
except Exception:
|
|
await msg.reply(STANDARD_FALLBACK)
|
|
logger.exception("Exception occured while trying to forward a msg to support")
|
|
raise
|
|
|
|
await notification_msg.edit_text(SUPPORT_MSG_SENT, reply_markup=return_to_menu)
|
|
await state.set_state(SupportStorage.prompt)
|
|
|
|
|
|
@router.message(
|
|
F.chat.id == settings.admin_group_id,
|
|
F.message_thread_id.is_not(None),
|
|
F.from_user.is_bot == False, # noqa: E712
|
|
~Command("close"),
|
|
)
|
|
async def handle_admin_message(
|
|
msg: Message, state: FSMContext, session: AsyncSession, deps: DependenciesDTO
|
|
):
|
|
await state.clear()
|
|
|
|
await deps.user_service.support_answer(session, msg)
|
|
|
|
|
|
@router.message(F.chat.id == settings.admin_group_id, Command("close"))
|
|
async def close_ticket(
|
|
msg: Message, state: FSMContext, session: AsyncSession, deps: DependenciesDTO
|
|
):
|
|
await state.clear()
|
|
|
|
await deps.user_service.close_ticket(session, msg)
|