Telebot при попытке вызова функции через bot.reg._next_step_handler() выдаёт AttributeError: 'CallbackQuery' object has no attribute 'chat'
На днях делал небольшой текстовый квест для телеграм бота. Столкнулся с проблемой. При попытке вызова функции через bot.register_next_step_handler() выдаёт AttributeError: 'CallbackQuery' object has no attribute 'chat'. В вызове попробовал вместо аргумента message поставить call.message, но эта затея оказалась безуспешной. Заранее благодарю! Вот код проблемной зоны (на фиксацию попаданий можете не обращать внимания):
@bot.callback_query_handler(func=lambda call: call.data == '1')
def part1_1(message):
global game_status
global do_it
game_status = 1
if do_it == True:
bot.send_message(message.from_user.id, 'текст')
do_it = False
bot.register_next_step_handler(message, mini_game)
@bot.message_handler(content_types = ['text'])
def mini_game(message):
#инициализируем локальные переменные игры и несколько глобальных
global do_it
global hp_boss
global your_hp
global item
global game_active
do_it = False
game_active = True
print(do_it)
#цикл игры
while game_active == True:
mini_game_obr(message)
#здесь ошибка
bot.register_next_step_handler(message, update_game)
@bot.message_handler(content_types = ['text'])
def mini_game_obr(message):
global do_it
global hp_boss
global your_hp
global item
global game_active
max_hp = 100
rand_enemy = randint(1, 100)
rand = randint(1, 100)
print(message.text)
#обработка нажатий
if users_text == '1':
#"перемешиваем" значение переменной
rand = randint(1, 100)
#фиксация попаданий и промахов
if rand <= 60:
hp_boss -= 15
bot.send_message(message.from_user.id, 'Вы попали!')
print(users_text)
mini_game(message)
rand = randint(1, 100)
else:
rand = randint(1, 100)
bot.send_message(message.from_user.id, 'Неудача!')
rand_enemy = randint(1, 100)
if rand_enemy <= 50:
your_hp -= 20
bot.send_message(message.from_user.id, 'Вас ранили!')
print(users_text)
time.sleep(2)
else:
bot.send_message(message.from_user.id, 'Вы увернулись!')
print(users_text)
time.sleep(2)
#Проверяем, победил ли игрок...
if hp_boss <= 0:
bot.send_message(message.from_user.id, 'Вы победили!')
print(message.text)
time.sleep(3)
if game_status == 1:
part1_2(message)
message.text = ""
game_active = False
else:
part2()
message.text = ""
game_active = False
if your_hp <= 0:
bot.send_message(message.from_user.id, 'Вы погибли! Если захотите попробовать ещё раз, то пропишите команду /start')
print(message.text)
message.text = ""
game_active = False
elif message.text == '2':
rand = randint(1, 100)
if rand <= 70:
hp_boss -= 10
bot.send_message(message.from_user.id, 'Вы попали!')
print(message.text)
rand = randint(1, 100)
else:
rand = randint(1, 100)
bot.send_message(message.from_user.id, 'Неудача!')
rand_enemy = randint(1, 100)
if rand_enemy <= 50:
your_hp -= 20
bot.send_message(message.from_user.id, 'Вас ранили!')
print(message.text)
time.sleep(2)
else:
bot.send_message(message.from_user.id, 'Вы увернулись!')
print(message.text)
time.sleep(2)
if hp_boss <= 0:
bot.send_message(message.from_user.id, 'Вы победили!')
print(message.text)
message.text = ""
time.sleep(3)
if game_status == 1:
part1_2()
game_active = False
else:
part2()
game_active = False
if your_hp <= 0:
bot.send_message(message.from_user.id, 'Вы погибли! Если захотите попробовать ещё раз, то пропишите команду /start')
print(message.text)
message.text = ""
game_active = False
elif message.text == '3':
rand = randint(1, 100)
if rand <= 40:
hp_boss -= 60
bot.send_message(message.from_user.id, 'Вы попали!')
print(message.text)
rand = randint(1, 100)
else:
rand = randint(1, 100)
bot.send_message(message.from_user.id, 'Неудача!')
rand_enemy = randint(1, 100)
if rand_enemy <= 50:
your_hp -= 20
bot.send_message(message.from_user.id, 'Вас ранили!')
print(message.text)
time.sleep(2)
else:
bot.send_message(message.from_user.id, 'Вы увернулись!')
print(message.text)
time.sleep(2)
if hp_boss <= 0:
bot.send_message(message.from_user.id, 'Вы победили!')
print(message.text)
time.sleep(3)
message.text = ""
if game_status == 1:
part1_2()
game_active = False
else:
part2()
game_active = False
if your_hp <= 0:
bot.send_message(message.from_user.id, 'Вы погибли! Если захотите попробовать ещё раз, то пропишите команду /start')
print(message.text)
message.text = ""
game_active = False
elif message.text == '4':
rand = randint(1, 100)
if rand <= 20:
hp_boss -= 80
bot.send_message(message.from_user.id, 'Вы попали!')
print(message.text)
rand = randint(1, 100)
else:
rand = randint(1, 100)
time.sleep(2)
rand_enemy = randint(1, 100)
if rand_enemy <= 50:
your_hp -= 20
bot.send_message(message.from_user.id, 'Вас ранили!')
print(message.text)
time.sleep(2)
else:
bot.send_message(message.from_user.id, 'Вы увернулись!')
print(message.text)
time.sleep(2)
if hp_boss <= 0:
bot.send_message(message.from_user.id, 'Вы победили!')
print(message.text)
message.text = ""
time.sleep(3)
if game_status == 1:
part1_2()
game_active = False
else:
part2()
game_active = False
if your_hp <= 0:
bot.send_message(message.from_user.id, 'Вы погибли! Если захотите попробовать ещё раз, то пропишите команду /start')
print(message.text)
message.text = ""
game_active = False
elif message.text == '5':
#проверяем, здоров ли игрок
if your_hp < 100:
if item > 0:
item -= 1
#защита от прибавления здоровья больше чем 100%
if your_hp >= 71:
your_hp += max_hp - your_hp
elif your_hp <= 70:
your_hp += 30
else:
bot.send_message(message.from_user.id, 'у вас нет лекарств!')
else:
bot.send_message(message.from_user.id, 'Вы здоровы!')
rand_enemy = randint(1, 100)
if rand_enemy <= 50:
your_hp -= 20
bot.send_message(message.from_user.id, 'Вас ранили!')
print(message.text)
time.sleep(2)
else:
bot.send_message(message.from_user.id, 'Вы увернулись!')
print(message.text)
time.sleep(2)
if your_hp <= 0:
bot.send_message(message.from_user.id, 'Вы погибли! Если захотите попробовать ещё раз, то пропишите команду /start')
print(message.text)
message.text = ""
game_active = False
else:
bot.send_message(message.from_user.id, 'Пришлите действительный вариант ответа!')
print(message.text)
@bot.message_handler(content_types = ['text'])
def update_game(message):
global hp_boss
global your_hp
bot.send_message(message.from_user.id, 'Ударить:')
bot.send_message(message.from_user.id, '1. В ногу')
bot.send_message(message.from_user.id, '2. В руку')
bot.send_message(message.from_user.id, '3. В торс')
bot.send_message(message.from_user.id, '4. В голову')
bot.send_message(message.from_user.id, '5. Использовать лекарство')
bot.send_message(message.from_user.id, 'Ваше здоровье:')
bot.send_message(message.from_user.id, your_hp)
bot.send_message(message.from_user.id, 'Здоровье противника:')
bot.send_message(message.from_user.id, hp_boss)
bot.send_message(message.from_user.id, '*Чтобы ударить введитеномер ответа')
#здесь ошибка
bot.register_next_step_handler(message, mini_game)
def part1_2(message):
print("Это первая часть")
def part2():
print("Это вторая глава")
bot.polling(none_stop = True, interval=0)
Ответы (1 шт):
Ошибка скорее всего не в bot.register_next_step_handler(message, update_game), а в @bot.callback_query_handler(func=lambda call: call.data == '1').
Обрабатывать вызовы нужно в одном обработчике, попробуйте прописать вместо первой строчки это : @bot.callback_query_handler(func=lambda call:True)