Repository: python-telegram-bot/python-telegram-bot

Issue:
Answer CallbackQueryies in Examples
Not answering the queries may lead to problems on some clients even if the keyboard changes.


Discussion:

Resolving patch:
diff --git a/examples/inlinekeyboard.py b/examples/inlinekeyboard.py
--- a/examples/inlinekeyboard.py
+++ b/examples/inlinekeyboard.py
@@ -29,6 +29,10 @@ def start(update, context):
 def button(update, context):
     query = update.callback_query
 
+    # CallbackQueries need to be answered, even if no notification to the user is needed
+    # Some clients may have trouble otherwise. See https://core.telegram.org/bots/api#callbackquery
+    query.answer()
+
     query.edit_message_text(text="Selected option: {}".format(query.data))
 
 
diff --git a/examples/inlinekeyboard2.py b/examples/inlinekeyboard2.py
--- a/examples/inlinekeyboard2.py
+++ b/examples/inlinekeyboard2.py
@@ -55,8 +55,9 @@ def start_over(update, context):
     """Prompt same text & keyboard as `start` does but not as new message"""
     # Get CallbackQuery from Update
     query = update.callback_query
-    # Get Bot from CallbackContext
-    bot = context.bot
+    # CallbackQueries need to be answered, even if no notification to the user is needed
+    # Some clients may have trouble otherwise. See https://core.telegram.org/bots/api#callbackquery
+    query.answer()
     keyboard = [
         [InlineKeyboardButton("1", callback_data=str(ONE)),
          InlineKeyboardButton("2", callback_data=str(TWO))]
@@ -65,9 +66,7 @@ def start_over(update, context):
     # Instead of sending a new message, edit the message that
     # originated the CallbackQuery. This gives the feeling of an
     # interactive menu.
-    bot.edit_message_text(
-        chat_id=query.message.chat_id,
-        message_id=query.message.message_id,
+    query.edit_message_text(
         text="Start handler, Choose a route",
         reply_markup=reply_markup
     )
@@ -77,15 +76,13 @@ def start_over(update, context):
 def one(update, context):
     """Show new choice of buttons"""
     query = update.callback_query
-    bot = context.bot
+    query.answer()
     keyboard = [
         [InlineKeyboardButton("3", callback_data=str(THREE)),
          InlineKeyboardButton("4", callback_data=str(FOUR))]
     ]
     reply_markup = InlineKeyboardMarkup(keyboard)
-    bot.edit_message_text(
-        chat_id=query.message.chat_id,
-        message_id=query.message.message_id,
+    query.edit_message_text(
         text="First CallbackQueryHandler, Choose a route",
         reply_markup=reply_markup
     )
@@ -95,15 +92,13 @@ def one(update, context):
 def two(update, context):
     """Show new choice of buttons"""
     query = update.callback_query
-    bot = context.bot
+    query.answer()
     keyboard = [
         [InlineKeyboardButton("1", callback_data=str(ONE)),
          InlineKeyboardButton("3", callback_data=str(THREE))]
     ]
     reply_markup = InlineKeyboardMarkup(keyboard)
-    bot.edit_message_text(
-        chat_id=query.message.chat_id,
-        message_id=query.message.message_id,
+    query.edit_message_text(
         text="Second CallbackQueryHandler, Choose a route",
         reply_markup=reply_markup
     )
@@ -113,15 +108,13 @@ def two(update, context):
 def three(update, context):
     """Show new choice of buttons"""
     query = update.callback_query
-    bot = context.bot
+    query.answer()
     keyboard = [
         [InlineKeyboardButton("Yes, let's do it again!", callback_data=str(ONE)),
          InlineKeyboardButton("Nah, I've had enough ...", callback_data=str(TWO))]
     ]
     reply_markup = InlineKeyboardMarkup(keyboard)
-    bot.edit_message_text(
-        chat_id=query.message.chat_id,
-        message_id=query.message.message_id,
+    query.edit_message_text(
         text="Third CallbackQueryHandler. Do want to start over?",
         reply_markup=reply_markup
     )
@@ -132,15 +125,13 @@ def three(update, context):
 def four(update, context):
     """Show new choice of buttons"""
     query = update.callback_query
-    bot = context.bot
+    query.answer()
     keyboard = [
         [InlineKeyboardButton("2", callback_data=str(TWO)),
          InlineKeyboardButton("4", callback_data=str(FOUR))]
     ]
     reply_markup = InlineKeyboardMarkup(keyboard)
-    bot.edit_message_text(
-        chat_id=query.message.chat_id,
-        message_id=query.message.message_id,
+    query.edit_message_text(
         text="Fourth CallbackQueryHandler, Choose a route",
         reply_markup=reply_markup
     )
@@ -151,10 +142,8 @@ def end(update, context):
     """Returns `ConversationHandler.END`, which tells the
     ConversationHandler that the conversation is over"""
     query = update.callback_query
-    bot = context.bot
-    bot.edit_message_text(
-        chat_id=query.message.chat_id,
-        message_id=query.message.message_id,
+    query.answer()
+    query.edit_message_text(
         text="See you next time!"
     )
     return ConversationHandler.END
diff --git a/examples/nestedconversationbot.py b/examples/nestedconversationbot.py
--- a/examples/nestedconversationbot.py
+++ b/examples/nestedconversationbot.py
@@ -66,6 +66,7 @@ def start(update, context):
 
     # If we're starting over we don't need do send a new message
     if context.user_data.get(START_OVER):
+        update.callback_query.answer()
         update.callback_query.edit_message_text(text=text, reply_markup=keyboard)
     else:
         update.message.reply_text('Hi, I\'m FamiliyBot and here to help you gather information'
@@ -83,6 +84,7 @@ def adding_self(update, context):
     button = InlineKeyboardButton(text='Add info', callback_data=str(MALE))
     keyboard = InlineKeyboardMarkup.from_button(button)
 
+    update.callback_query.answer()
     update.callback_query.edit_message_text(text=text, reply_markup=keyboard)
 
     return DESCRIBING_SELF
@@ -118,6 +120,7 @@ def prettyprint(user_data, level):
     ]]
     keyboard = InlineKeyboardMarkup(buttons)
 
+    update.callback_query.answer()
     update.callback_query.edit_message_text(text=text, reply_markup=keyboard)
     ud[START_OVER] = True
 
@@ -133,6 +136,8 @@ def stop(update, context):
 
 def end(update, context):
     """End conversation from InlineKeyboardButton."""
+    update.callback_query.answer()
+
     text = 'See you around!'
     update.callback_query.edit_message_text(text=text)
 
@@ -151,6 +156,8 @@ def select_level(update, context):
         InlineKeyboardButton(text='Back', callback_data=str(END))
     ]]
     keyboard = InlineKeyboardMarkup(buttons)
+
+    update.callback_query.answer()
     update.callback_query.edit_message_text(text=text, reply_markup=keyboard)
 
     return SELECTING_LEVEL
@@ -172,8 +179,9 @@ def select_gender(update, context):
         InlineKeyboardButton(text='Show data', callback_data=str(SHOWING)),
         InlineKeyboardButton(text='Back', callback_data=str(END))
     ]]
-
     keyboard = InlineKeyboardMarkup(buttons)
+
+    update.callback_query.answer()
     update.callback_query.edit_message_text(text=text, reply_markup=keyboard)
 
     return SELECTING_GENDER
@@ -201,6 +209,8 @@ def select_feature(update, context):
     if not context.user_data.get(START_OVER):
         context.user_data[FEATURES] = {GENDER: update.callback_query.data}
         text = 'Please select a feature to update.'
+
+        update.callback_query.answer()
         update.callback_query.edit_message_text(text=text, reply_markup=keyboard)
     # But after we do that, we need to send a new message
     else:
@@ -215,6 +225,8 @@ def ask_for_input(update, context):
     """Prompt user to input data for selected feature."""
     context.user_data[CURRENT_FEATURE] = update.callback_query.data
     text = 'Okay, tell me.'
+
+    update.callback_query.answer()
     update.callback_query.edit_message_text(text=text)
 
     return TYPING


Test patch: