Ian Gabaraev
Ian Gabaraev

Reputation: 121

Telebot: how to retrieve InlineKeyboardButton callback data?

I am buidling a simple game with pytelegrambotapi. According to the rules, the user is sent a definition and four buttons with words as text, of which one is correct. The user then should press the right button. Another routine then compares the user's answer to the right answer. How do I retrieve the value of the button that the user pressed?

import telebot
from telebot import types

TOKEN = 'XXXXXXXXXXXXXXXXX'
bot = telebot.TeleBot(TOKEN)

kb = types.InlineKeyboardMarkup(row_width=2)

words = {
'Meager' : 'Lacking in quantity',
'Asylum' : 'Shelter',
'Irk' : 'To annoy',
'Kudos' : 'Great glory'
}


def compare(message, word, definition):
    if definition == words[word]:
        bot.send_message(message.from_user.id, 'Correct!')
    else:
        bot.send_message(message.from_user.id, 'Wrong!')


for item in words.items():
    kb.add(types.InlineKeyboardButton(item[0], callback_data = item[0]))



@bot.message_handler(commands=['start', 's'])
def post_random_article(message):
    word = 'Meager'
    bot.send_message(message.from_user.id, word, reply_markup = kb)

bot.polling()

Upvotes: 2

Views: 8656

Answers (1)

Ian Gabaraev
Ian Gabaraev

Reputation: 121

Nevermind, I found an answer.

@bot.callback_query_handler(func=lambda call: True)
def handle_query(call):
    if call.data.split('#')[0] == call.data.split('#')[1]:
        bot.send_message(call.message.chat.id,  'āœ… Correct!')
    else:
        bot.send_message(call.message.chat.id,  'āŒ Wrong!\nā™»ļø The answer is: %s' % call.data.split('#')[1])



@bot.message_handler(commands=['game', 'g'])
def game(message):
    list_of_words = load_my_dictionary(message.from_user.id)
    random.shuffle(list_of_words)
    while not len(list_of_words) < 4:
        current = list_of_words.pop()
        word = current[0]
        definition = current[1]
        all_answers = generate_answers(word, list_of_words)
        keyboard = generate_keyboard(all_answers, word)
        bot.send_message(message.from_user.id, definition, reply_markup = keyboard)
        time.sleep(7)
    bot.send_message(message.from_user.id, 'šŸ“­ List is empty!')

Upvotes: 4

Related Questions