Суть проблемы:
Не могу понять, как обрабатывать 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)