@k1nster

Как обрабатывать кнопки находясь в состоянии AIOGRAM 2?

Суть проблемы:

Не могу понять, как обрабатывать ReplyKeyboardMarkup кнопку находясь в состоянии? Вне состояния всё работает отлично - когда перехожу в состояние - ничего не работает. Пробовал уже много вариантов, ставить state=None, "*", и т.д. Но всё равно не срабатывает.

Состояние работает таким образом, что пересылает сообщения другому пользователю (своеобразная тех.поддержка), и именно когда пользователи в состоянии - при нажатии на кнопку она просто пересылается пользователю, без каких либо обработчиков.

Нужно обрабатывать эту кнопку:
@dp.message_handler(text='End session ', state="*")
async def exit_support(message: types.Message, state: FSMContext):
    print('Exit support handler triggered')
    user_data = await state.get_data()
    second_id = user_data.get("second_id")
    
    if second_id:
        second_state = dp.current_state(user=second_id, chat=second_id)
        second_state_str = await second_state.get_state()
        
        if second_state_str is not None:
            await second_state.reset_state()
            await bot.send_message(second_id, "Пользователь завершил сеанс технической поддержки. ")
    
    await message.answer("Вы завершили сеанс ", reply_markup=types.ReplyKeyboardRemove())
    await state.reset_state()


Полный код проекта:
from aiogram import types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Text
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton

from keyboards.inline.support import support_keyboard, support_callback, check_support_available, get_support_manager
from loader import dp, bot

@dp.callback_query_handler(lambda query: query.data == 'start_conversation')
async def write_message_handler(callback_query: types.CallbackQuery):
    await callback_query.answer()
    text = "Чтобы открыть чат с юристом, нажмите на кнопку ниже\n\n(вам ответит первый свободный юрист)\n\nВыбрать:"
    photo = open(r'images\\lawyer_chat_photo.png', 'rb')
    keyboard = await support_keyboard(messages="many")
    
    if not keyboard:
        await callback_query.message.answer("К сожалению, на данный момент нет свободных операторов. Пожалуйста, повторите попытку позже. ")
        photo.close()
        return
    
    await bot.send_photo(callback_query.message.chat.id, photo, caption=text, parse_mode='Markdown', reply_markup=keyboard)
    photo.close()

@dp.callback_query_handler(support_callback.filter(messages="many", as_user="yes"))
async def send_to_support_call(call: types.CallbackQuery, state: FSMContext, callback_data: dict):
    await call.message.answer("Чат открыт. Ожидается подключение с юристом... ")

    user_id = int(callback_data.get("user_id"))
    if not await check_support_available(user_id):
        support_id = await get_support_manager()
    else:
        support_id = user_id

    if not support_id:
        await call.message.answer("К сожалению, на данный момент нет свободных операторов. Пожалуйста, повторите попытку позже. ")
        await state.reset_state()
        return

    await state.set_state("wait_in_support")
    await state.update_data(second_id=support_id)

    keyboard = await support_keyboard(messages="many", user_id=call.from_user.id)

    await bot.send_message(support_id,
                           f"Пользователь хочет связаться с вами {call.from_user.full_name} ",
                           reply_markup=keyboard
                           )

@dp.callback_query_handler(support_callback.filter(messages="many", as_user="no"))
async def answer_support_call(call: types.CallbackQuery, state: FSMContext, callback_data: dict):
    second_id = int(callback_data.get("user_id"))
    user_state = dp.current_state(user=second_id, chat=second_id)

    if str(await user_state.get_state()) != "wait_in_support":
        await call.message.edit_text("К сожалению, пользователь передумал. ‍♂️")
        return

    await state.set_state("in_support")
    await user_state.set_state("in_support")

    await state.update_data(second_id=second_id)

    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True).add(types.KeyboardButton("End session "))
    keyboard_second_user = types.ReplyKeyboardMarkup(resize_keyboard=True).add(types.KeyboardButton("End session "))

    await bot.send_message(call.from_user.id,
                           "Вы на связи с пользователем! \n"
                           "Чтобы завершить общение, нажмите на кнопку ниже. ",
                           reply_markup=keyboard
                           )
    await bot.send_message(second_id,
                           f"Юрист на линии. С вами общается {call.from_user.first_name}. Как к вам обращаться? \n",
                           reply_markup=keyboard_second_user
                           )

    await call.message.delete()
    

@dp.message_handler(text='End session ', state="*")
async def exit_support(message: types.Message, state: FSMContext):
    print('Exit support handler triggered')
    user_data = await state.get_data()
    second_id = user_data.get("second_id")
    
    if second_id:
        second_state = dp.current_state(user=second_id, chat=second_id)
        second_state_str = await second_state.get_state()
        
        if second_state_str is not None:
            await second_state.reset_state()
            await bot.send_message(second_id, "Пользователь завершил сеанс технической поддержки. ")
    
    await message.answer("Вы завершили сеанс ", reply_markup=types.ReplyKeyboardRemove())
    await state.reset_state()



@dp.message_handler(state="wait_in_support", content_types=types.ContentTypes.ANY)
async def not_supported(message: types.Message, state: FSMContext):
    data = await state.get_data()
    second_id = data.get("second_id")

    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True).add(types.KeyboardButton("End session "))
    await message.answer(" Дождитесь ответа оператора или нажмите отмену. ", reply_markup=keyboard)
  • Вопрос задан
  • 14 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы