mirror of
https://github.com/python-telegram-bot/python-telegram-bot.git
synced 2025-03-29 01:37:28 +01:00
new inlinekeyboard example (#355)
This commit is contained in:
parent
c51c2224da
commit
f5c57cd6c6
1 changed files with 20 additions and 79 deletions
|
@ -1,108 +1,49 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
# Basic example for a bot that awaits an answer from the user. It's built upon
|
# Basic example for a bot that uses inline keyboards.
|
||||||
# the state_machine_bot.py example
|
|
||||||
# This program is dedicated to the public domain under the CC0 license.
|
# This program is dedicated to the public domain under the CC0 license.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from telegram import Emoji, ForceReply, InlineKeyboardButton, \
|
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
|
||||||
InlineKeyboardMarkup
|
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
|
||||||
from telegram.ext import Updater, CommandHandler, MessageHandler, \
|
|
||||||
CallbackQueryHandler, Filters
|
|
||||||
|
|
||||||
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||||
level=logging.DEBUG)
|
level=logging.INFO)
|
||||||
|
|
||||||
# Define the different states a chat can be in
|
|
||||||
MENU, AWAIT_CONFIRMATION, AWAIT_INPUT = range(3)
|
|
||||||
|
|
||||||
# Python 2 and 3 unicode differences
|
|
||||||
try:
|
|
||||||
YES, NO = (Emoji.THUMBS_UP_SIGN.decode('utf-8'), Emoji.THUMBS_DOWN_SIGN.decode('utf-8'))
|
|
||||||
except AttributeError:
|
|
||||||
YES, NO = (Emoji.THUMBS_UP_SIGN, Emoji.THUMBS_DOWN_SIGN)
|
|
||||||
|
|
||||||
# States are saved in a dict that maps chat_id -> state
|
|
||||||
state = dict()
|
|
||||||
# Sometimes you need to save data temporarily
|
|
||||||
context = dict()
|
|
||||||
# This dict is used to store the settings value for the chat.
|
|
||||||
# Usually, you'd use persistence for this (e.g. sqlite).
|
|
||||||
values = dict()
|
|
||||||
|
|
||||||
|
|
||||||
# Example handler. Will be called on the /set command and on regular messages
|
def start(bot, update):
|
||||||
def set_value(bot, update):
|
keyboard = [[InlineKeyboardButton("Option 1", callback_data='1'),
|
||||||
chat_id = update.message.chat_id
|
InlineKeyboardButton("Option 2", callback_data='2')],
|
||||||
user_id = update.message.from_user.id
|
|
||||||
user_state = state.get(chat_id, MENU)
|
|
||||||
|
|
||||||
if user_state == MENU:
|
[InlineKeyboardButton("Option 3", callback_data='3')]]
|
||||||
state[user_id] = AWAIT_INPUT # set the state
|
|
||||||
bot.sendMessage(chat_id,
|
reply_markup = InlineKeyboardMarkup(keyboard)
|
||||||
text="Please enter your settings value",
|
|
||||||
reply_markup=ForceReply())
|
bot.sendMessage(update.message.chat_id, text="Please choose:", reply_markup=reply_markup)
|
||||||
|
|
||||||
|
|
||||||
def entered_value(bot, update):
|
def button(bot, update):
|
||||||
chat_id = update.message.chat_id
|
|
||||||
user_id = update.message.from_user.id
|
|
||||||
chat_state = state.get(user_id, MENU)
|
|
||||||
|
|
||||||
# Check if we are waiting for input
|
|
||||||
if chat_state == AWAIT_INPUT:
|
|
||||||
state[user_id] = AWAIT_CONFIRMATION
|
|
||||||
|
|
||||||
# Save the user id and the answer to context
|
|
||||||
context[user_id] = update.message.text
|
|
||||||
reply_markup = InlineKeyboardMarkup([[InlineKeyboardButton(YES, callback_data=YES),
|
|
||||||
InlineKeyboardButton(NO, callback_data=NO)]])
|
|
||||||
bot.sendMessage(chat_id, text="Are you sure?", reply_markup=reply_markup)
|
|
||||||
|
|
||||||
|
|
||||||
def confirm_value(bot, update):
|
|
||||||
query = update.callback_query
|
query = update.callback_query
|
||||||
chat_id = query.message.chat_id
|
|
||||||
user_id = query.from_user.id
|
|
||||||
text = query.data
|
|
||||||
user_state = state.get(user_id, MENU)
|
|
||||||
user_context = context.get(user_id, None)
|
|
||||||
|
|
||||||
# Check if we are waiting for confirmation and the right user answered
|
bot.editMessageText(text="Selected option: %s" % query.data,
|
||||||
if user_state == AWAIT_CONFIRMATION:
|
chat_id=query.message.chat_id,
|
||||||
del state[user_id]
|
message_id=query.message.message_id)
|
||||||
del context[user_id]
|
|
||||||
bot.answerCallbackQuery(query.id, text="Ok!")
|
|
||||||
if text == YES:
|
|
||||||
values[user_id] = user_context
|
|
||||||
bot.editMessageText(text="Changed value to %s." % values[user_id],
|
|
||||||
chat_id=chat_id,
|
|
||||||
message_id=query.message.message_id)
|
|
||||||
else:
|
|
||||||
bot.editMessageText(text="Alright, value is still %s." %
|
|
||||||
values.get(user_id, 'not set'),
|
|
||||||
chat_id=chat_id,
|
|
||||||
message_id=query.message.message_id)
|
|
||||||
|
|
||||||
|
|
||||||
def help(bot, update):
|
def help(bot, update):
|
||||||
bot.sendMessage(update.message.chat_id, text="Use /set to test this bot.")
|
bot.sendMessage(update.message.chat_id, text="Use /start to test this bot.")
|
||||||
|
|
||||||
|
|
||||||
def error(bot, update, error):
|
def error(bot, update, error):
|
||||||
logging.warning('Update "%s" caused error "%s"' % (update, error))
|
logging.warning('Update "%s" caused error "%s"' % (update, error))
|
||||||
|
|
||||||
|
|
||||||
# Create the Updater and pass it your bot's token.
|
# Create the Updater and pass it your bot's token.
|
||||||
updater = Updater("TOKEN")
|
updater = Updater("TOKEN")
|
||||||
|
|
||||||
# The command
|
updater.dispatcher.add_handler(CommandHandler('start', start))
|
||||||
updater.dispatcher.add_handler(CommandHandler('set', set_value))
|
updater.dispatcher.add_handler(CallbackQueryHandler(button))
|
||||||
# The answer
|
|
||||||
updater.dispatcher.add_handler(MessageHandler([Filters.text], entered_value))
|
|
||||||
# The confirmation
|
|
||||||
updater.dispatcher.add_handler(CallbackQueryHandler(confirm_value))
|
|
||||||
updater.dispatcher.add_handler(CommandHandler('start', help))
|
|
||||||
updater.dispatcher.add_handler(CommandHandler('help', help))
|
updater.dispatcher.add_handler(CommandHandler('help', help))
|
||||||
updater.dispatcher.add_error_handler(error)
|
updater.dispatcher.add_error_handler(error)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue