Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # pylint: disable=unused-argument, wrong-import-position
- # This program is dedicated to the public domain under the CC0 license.
- """
- First, a few callback functions are defined. Then, those functions are passed to
- the Application 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.
- """
- import logging
- from telegram import __version__ as TG_VER
- try:
- from telegram import __version_info__
- except ImportError:
- __version_info__ = (0, 0, 0, 0, 0) # type: ignore[assignment]
- if __version_info__ < (20, 0, 0, "alpha", 5):
- raise RuntimeError(
- f"This example is not compatible with your current PTB version {TG_VER}. To view the "
- f"{TG_VER} version of this example, "
- f"visit https://docs.python-telegram-bot.org/en/v{TG_VER}/examples.html"
- )
- from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove, Update
- from telegram.ext import (
- Application,
- CommandHandler,
- ContextTypes,
- ConversationHandler,
- MessageHandler,
- filters,
- )
- # Enable logging
- logging.basicConfig(
- format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
- )
- # set higher logging level for httpx to avoid all GET and POST requests being logged
- logging.getLogger("httpx").setLevel(logging.WARNING)
- logger = logging.getLogger(__name__)
- GENDER, PHOTO, LOCATION, BIO = -1, 0, 1, 2
- async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Starts the conversation and asks the user about their gender."""
- reply_keyboard = [["Boy", "Girl", "Other"]]
- await update.message.reply_text(
- "Hi! My name is Professor Bot. I will hold a conversation with you. "
- "Send /cancel to stop talking to me.\n\n"
- "Are you a boy or a girl?",
- reply_markup=ReplyKeyboardMarkup(
- reply_keyboard, one_time_keyboard=True, input_field_placeholder="Boy or Girl?"
- ),
- )
- return GENDER
- async def gender(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Stores the selected gender and asks for a photo."""
- user = update.message.from_user
- logger.info("Gender of %s: %s", user.first_name, update.message.text)
- await update.message.reply_text(
- "I see! Please send me a photo of yourself, "
- "so I know what you look like, or send /skip if you don't want to.",
- reply_markup=ReplyKeyboardRemove(),
- )
- return PHOTO
- async def photo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Stores the photo and asks for a location."""
- user = update.message.from_user
- photo_file = await update.message.photo[-1].get_file()
- await photo_file.download_to_drive("user_photo.jpg")
- logger.info("Photo of %s: %s", user.first_name, "user_photo.jpg")
- await update.message.reply_text(
- "Gorgeous! Now, send me your location please, or send /skip if you don't want to."
- )
- return LOCATION
- async def skip_photo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Skips the photo and asks for a location."""
- user = update.message.from_user
- logger.info("User %s did not send a photo.", user.first_name)
- await update.message.reply_text(
- "I bet you look great! Now, send me your location please, or send /skip."
- )
- return LOCATION
- async def location(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Stores the location and asks for some info about the user."""
- user = update.message.from_user
- user_location = update.message.location
- logger.info(
- "Location of %s: %f / %f", user.first_name, user_location.latitude, user_location.longitude
- )
- await update.message.reply_text(
- "Maybe I can visit you sometime! At last, tell me something about yourself."
- )
- return BIO
- async def skip_location(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Skips the location and asks for info about the user."""
- user = update.message.from_user
- logger.info("User %s did not send a location.", user.first_name)
- await update.message.reply_text(
- "You seem a bit paranoid! At last, tell me something about yourself."
- )
- return BIO
- async def bio(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Stores the info about the user and ends the conversation."""
- user = update.message.from_user
- logger.info("Bio of %s: %s", user.first_name, update.message.text)
- await update.message.reply_text("Thank you! I hope we can talk again some day.")
- return ConversationHandler.END
- async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
- """Cancels and ends the conversation."""
- user = update.message.from_user
- logger.info("User %s canceled the conversation.", user.first_name)
- await update.message.reply_text(
- "Bye! I hope we can talk again some day.", reply_markup=ReplyKeyboardRemove()
- )
- return ConversationHandler.END
- def main() -> None:
- """Run the bot."""
- # Create the Application and pass it your bot's token.
- application = Application.builder().token("TOKEN").build()
- # Add conversation handler with the states GENDER, PHOTO, LOCATION and BIO
- conv_handler = ConversationHandler(
- entry_points=[CommandHandler("start", start)],
- states={
- GENDER: [MessageHandler(filters.Regex("^(Boy|Girl|Other)$"), gender)],
- PHOTO: [MessageHandler(filters.PHOTO, photo), CommandHandler("skip", skip_photo)],
- LOCATION: [
- MessageHandler(filters.LOCATION, location),
- CommandHandler("skip", skip_location),
- ],
- BIO: [MessageHandler(filters.TEXT & ~filters.COMMAND, bio)],
- },
- fallbacks=[CommandHandler("cancel", cancel)],
- )
- application.add_handler(conv_handler)
- # Run the bot until the user presses Ctrl-C
- application.run_polling(allowed_updates=Update.ALL_TYPES)
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement