-
Notifications
You must be signed in to change notification settings - Fork 6k
Add pass_user_data and pass_chat_data to Handler #436
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
95ee0ff
initial commit for user_data
jh0ker 583453b
add chat_data and use defaultdict
jh0ker dcdb71b
fix chat_data copy-paste error
jh0ker c71a5fd
add test for user_data and chat_data
jh0ker 99826a6
fix case where chat is None
jh0ker c122ee0
remove braces from import line
jh0ker File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,152 @@ | ||
| #!/usr/bin/env python | ||
| # -*- coding: utf-8 -*- | ||
| # | ||
| # Simple Bot to reply to Telegram messages | ||
| # This program is dedicated to the public domain under the CC0 license. | ||
| """ | ||
| This Bot uses the Updater class to handle the bot. | ||
|
|
||
| First, a few callback functions are defined. Then, those functions are passed to | ||
| the Dispatcher and registered at their respective places. | ||
| Then, the bot is started and runs until we press Ctrl-C on the command line. | ||
|
|
||
| Usage: | ||
| Example of a bot-user conversation using ConversationHandler. | ||
| Send /start to initiate the conversation. | ||
| Press Ctrl-C on the command line or send a signal to the process to stop the | ||
| bot. | ||
| """ | ||
|
|
||
| from telegram import ReplyKeyboardMarkup | ||
| from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters, RegexHandler, | ||
| ConversationHandler) | ||
|
|
||
| import logging | ||
|
|
||
| # Enable logging | ||
| logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', | ||
| level=logging.INFO) | ||
|
|
||
| logger = logging.getLogger(__name__) | ||
|
|
||
| CHOOSING, TYPING_REPLY, TYPING_CHOICE = range(3) | ||
|
|
||
| reply_keyboard = [['Age', 'Favourite colour'], | ||
| ['Number of siblings', 'Something else...'], | ||
| ['Done']] | ||
| markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True) | ||
|
|
||
|
|
||
| def facts_to_str(user_data): | ||
| facts = list() | ||
|
|
||
| for key, value in user_data.items(): | ||
| facts.append('%s - %s' % (key, value)) | ||
|
|
||
| return "\n".join(facts).join(['\n', '\n']) | ||
|
|
||
|
|
||
| def start(bot, update): | ||
| update.message.reply_text( | ||
| "Hi! My name is Doctor Botter. I will hold a more complex conversation with you. " | ||
| "Why don't you tell me something about yourself?", | ||
| reply_markup=markup) | ||
|
|
||
| return CHOOSING | ||
|
|
||
|
|
||
| def regular_choice(bot, update, user_data): | ||
| text = update.message.text | ||
| user_data['choice'] = text | ||
| update.message.reply_text('Your %s? Yes, I would love to hear about that!' % text.lower()) | ||
|
|
||
| return TYPING_REPLY | ||
|
|
||
|
|
||
| def custom_choice(bot, update): | ||
| update.message.reply_text('Alright, please send me the category first, ' | ||
| 'for example "Most impressive skill"') | ||
|
|
||
| return TYPING_CHOICE | ||
|
|
||
|
|
||
| def received_information(bot, update, user_data): | ||
| text = update.message.text | ||
| category = user_data['choice'] | ||
| user_data[category] = text | ||
| del user_data['choice'] | ||
|
|
||
| update.message.reply_text("Neat! Just so you know, this is what you already told me:" | ||
| "%s" | ||
| "You can tell me more, or change your opinion on something." | ||
| % facts_to_str(user_data), | ||
| reply_markup=markup) | ||
|
|
||
| return CHOOSING | ||
|
|
||
|
|
||
| def done(bot, update, user_data): | ||
| if 'choice' in user_data: | ||
| del user_data['choice'] | ||
|
|
||
| update.message.reply_text("I learned these facts about you:" | ||
| "%s" | ||
| "Until next time!" % facts_to_str(user_data)) | ||
|
|
||
| user_data.clear() | ||
| return ConversationHandler.END | ||
|
|
||
|
|
||
| def error(bot, update, error): | ||
| logger.warn('Update "%s" caused error "%s"' % (update, error)) | ||
|
|
||
|
|
||
| def main(): | ||
| # Create the Updater and pass it your bot's token. | ||
| updater = Updater("TOKEN") | ||
|
|
||
| # Get the dispatcher to register handlers | ||
| dp = updater.dispatcher | ||
|
|
||
| # Add conversation handler with the states GENDER, PHOTO, LOCATION and BIO | ||
| conv_handler = ConversationHandler( | ||
| entry_points=[CommandHandler('start', start)], | ||
|
|
||
| states={ | ||
| CHOOSING: [RegexHandler('^(Age|Favourite colour|Number of siblings)$', | ||
| regular_choice, | ||
| pass_user_data=True), | ||
| RegexHandler('^Something else...$', | ||
| custom_choice), | ||
| ], | ||
|
|
||
| TYPING_CHOICE: [MessageHandler([Filters.text], | ||
| regular_choice, | ||
| pass_user_data=True), | ||
| ], | ||
|
|
||
| TYPING_REPLY: [MessageHandler([Filters.text], | ||
| received_information, | ||
| pass_user_data=True), | ||
| ], | ||
| }, | ||
|
|
||
| fallbacks=[RegexHandler('^Done$', done, pass_user_data=True)] | ||
| ) | ||
|
|
||
| dp.add_handler(conv_handler) | ||
|
|
||
| # log all errors | ||
| dp.add_error_handler(error) | ||
|
|
||
| # Start the Bot | ||
| updater.start_polling() | ||
|
|
||
| # Run the bot until the you presses Ctrl-C or the process receives SIGINT, | ||
| # SIGTERM or SIGABRT. This should be used most of the time, since | ||
| # start_polling() is non-blocking and will stop the bot gracefully. | ||
| updater.idle() | ||
|
|
||
|
|
||
| if __name__ == '__main__': | ||
| main() | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Due to the bitwise-filters PR this will raise a warning. Just so you're aware.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh this was already merged, right ^^
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On a second thought, I'll wait with that till the release
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alright, should probably change throughout our examples at that point then :)