Такая проблема: бот не реагирует на клавиатуру или текст, например "1-7" или "x2", в режиах: 'mr' и 'double'. Он реагирует только если я отправляю сообщение в ответ на сообщение бота, где была вызвана клавиатура. В режимах 'wheel' и 'dice' я могу просто ввести "19-36" или же "1" и ставка будет определена без ответа на сообщние. Почему так?
Клавиатуры:
def create_keyboard_wheel():
return types.ReplyKeyboardMarkup(
keyboard=[
[types.KeyboardButton(text="1-18"), types.KeyboardButton(text="19-36")],
[types.KeyboardButton(text="Черное"), types.KeyboardButton(text="Красное")],
[types.KeyboardButton(text="Четное"), types.KeyboardButton(text="Нечетное")],
[types.KeyboardButton(text="1-12"), types.KeyboardButton(text="13-22"), types.KeyboardButton(text="23-36")],
[types.KeyboardButton(text="Число")],
[types.KeyboardButton(text="Банк"), types.KeyboardButton(text="Профиль")]
],
resize_keyboard=True,
one_time_keyboard=False
)
def create_keyboard_double():
return types.ReplyKeyboardMarkup(
keyboard=[
[types.KeyboardButton(text="2x"), types.KeyboardButton(text="3x")],
[types.KeyboardButton(text="5x"), types.KeyboardButton(text="40x")],
[types.KeyboardButton(text="Банк"), types.KeyboardButton(text="Профиль")]
],
resize_keyboard=True,
one_time_keyboard=False
)
def create_keyboard_mr():
return types.ReplyKeyboardMarkup(
keyboard=[
[types.KeyboardButton(text="Красное"), types.KeyboardButton(text="Черное")],
[types.KeyboardButton(text="1-7"), types.KeyboardButton(text="Число"), types.KeyboardButton(text="8-14")],
[types.KeyboardButton(text="Четное"), types.KeyboardButton(text="Нечетное")],
[types.KeyboardButton(text="Банк"), types.KeyboardButton(text="Профиль")]
],
resize_keyboard=True,
one_time_keyboard=False
)
def create_keyboard_dice():
return types.ReplyKeyboardMarkup(
keyboard=[
[types.KeyboardButton(text="1"), types.KeyboardButton(text="2"), types.KeyboardButton(text="3")],
[types.KeyboardButton(text="4"), types.KeyboardButton(text="5"), types.KeyboardButton(text="6")],
[types.KeyboardButton(text="Четное"), types.KeyboardButton(text="Нечетное")],
[types.KeyboardButton(text="Банк"), types.KeyboardButton(text="Профиль")]
],
resize_keyboard=True,
one_time_keyboard=False
)
async def create_dynamic_keyboard(game_choice):
game_choice = game_choice.lower().replace(' ', '_')
if game_choice == "wheel":
return create_keyboard_wheel()
elif game_choice == "mr":
return create_keyboard_mr()
elif game_choice == "dice":
return create_keyboard_dice()
elif game_choice == "double":
return create_keyboard_double()
else:
return types.ReplyKeyboardMarkup(
resize_keyboard=True, one_time_keyboard=False
)
Вызов клавиатур:
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('select_game_'))
async def process_game_selection(callback_query: types.CallbackQuery):
game_choice = callback_query.data.replace('select_game_', '').replace('_', ' ').lower()
chat_id = callback_query.message.chat.id
async with aiosqlite.connect("database/database.db") as db:
await db.execute("UPDATE chats SET game_selected = ?, game = ? WHERE chat_id = ?", (True, game_choice, chat_id))
await db.commit()
keyboard = await create_dynamic_keyboard(game_choice)
await callback_query.message.answer(f"Вы выбрали игру: {game_choice}. Теперь вы можете начать делать ставки.\n\n", reply_markup=keyboard)
Обработчик текста:
@dp.message_handler(lambda message: message.text in ["1-7", "8-14", "Четное", "Нечетное", "Число", "Черное", "Красное", "1-18", "19-36", "1-12", "13-22", "23-36", "1", "2", "3", "4", "5", "6", "2x", "3x", "5x", "40x"])
async def place_bet(message: types.Message):
global betting_active, active_bets
bet_type = message.text
user_id = message.from_user.id
chat_id = message.chat.id
await register_user(user_id, message.from_user.username)
game_mode = await get_game_mode(chat_id)
…
Функция регистрации отработчиков:
def register_handlers_result(dp: Dispatcher):
dp.register_message_handler(place_bet, lambda message: message.text in ["1-7", "8-14", "Четное", "Нечетное", "Число", "Черное", "Красное", "1-18", "19-36", "1-12", "13-22", "23-36", "1", "2", "3", "4", "5", "6"], state="*")
В main.py:
result.register_handlers_result(dp)
Я добавил логгер, заметил, что он вообще не видит текст именно в режмах "mr" и "double", только в ответ на сообщение. Отработчик текста ведь для всего один, в других режимах он все ставки видит, даже предназначенные для других режимов - выводя ошибку об этом.
Вот как это наглядно. В Wheel я пишу или нажимаю кнопку без ответа на сообщение и он идёт дальше. В double я пишу без ответа - игнор, с ответом - идёт дальше...
Обработчик пробывал менять на:
@dp.message_handler(Text(equals=["1-7", "8-14", "Четное", "Нечетное", "Число", "Черное", "Красное", "1-18", "19-36", "1-12", "13-22", "23-36", "1", "2", "3", "4", "5", "6", "2x", "3x", "5x", "40x"]))