from telegram import Update from telegram.ext import ContextTypes from telegram.error import TelegramError from config import logger from gemini_client import GeminiChatClient # --- Command Handlers --- async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """Handles the /start command with a welcome message.""" welcome_message = ( "🌟 *Welcome to TravelBuddy\!* 🌍\n\n" "I'm your friendly travel agent assistant, here to help with:\n" "β€’ ✈️ Flight searches\n" "β€’ 🏨 Hotel bookings\n" "β€’ πŸ—ΊοΈ Trip planning\n" "β€’ πŸ’Έ Budget calculations\n" "β€’ 🌐 Fetching web content\n\n" "Try asking: 'Calculate 1 \+ 3' to see my tools in action\!\n" "Type `/new` to start a fresh conversation or `/help` for more info." ) try: await update.message.reply_text(welcome_message, parse_mode="Markdown") except TelegramError: await update.message.reply_text(welcome_message.replace("*", "").replace("`", "")) async def new_chat_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """Handles the /new command to reset the chat session.""" chat_client: GeminiChatClient = context.bot_data["chat_client"] chat_id = update.effective_chat.id response = chat_client.start_session(chat_id) try: await update.message.reply_text(response) except TelegramError: await update.message.reply_text(response.replace("*", "").replace("`", "")) async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """Handles the /help command.""" help_message = ( "πŸ“š *TravelBuddy Help Guide* πŸ“š\n\n" "Here's how I can assist you:\n" "β€’ *Ask anything travel\-related:* 'Find flights to Paris' or 'Suggest a hotel in Tokyo\.'\n" "β€’ *Use my tools directly:* 'Calculate 5 \* 120' or 'Fetch travel tips from a website\.'\n\n" "*Commands:*\n" " β€’ `/start` \- Begin our conversation\.\n" " β€’ `/new` \- Start a completely new chat session\.\n" " β€’ `/help` \- Show this help message\.\n\n" "I'm here to make your travel planning seamless\! 🌴" ) try: await update.message.reply_text(help_message, parse_mode="MarkdownV2") except TelegramError: await update.message.reply_text(help_message.replace("*", "").replace("`", "")) # --- Message Handler --- async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: """Handles all non-command text messages from the user.""" chat_client: GeminiChatClient = context.bot_data["chat_client"] query = update.message.text chat_id = update.effective_chat.id # Process the query and let process_query handle the Telegram response response = await chat_client.process_query( query, chat_id, context.bot_data["mcp_client"].gemini_tools, context ) # No need to reply again; process_query already sends the response logger.info(f"Processed query for chat_id {chat_id}: {query}, Response: {response[:50]}...") # --- Error Handler --- async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> None: """Logs errors and sends a user-friendly message.""" logger.error("An error occurred: %s", context.error) error_message = ( "⚠️ *Oops, something went wrong\!* πŸ˜”\n" "Don't worry, TravelBuddy is still here to help. Please try your request again, or use `/new` to start over." ) if isinstance(update, Update) and update.effective_chat: try: await context.bot.send_message( chat_id=update.effective_chat.id, text=error_message, parse_mode="Markdown" ) except TelegramError: # Fallback for the error message itself await context.bot.send_message( chat_id=update.effective_chat.id, text=error_message.replace("*", "").replace("`", "").replace("\\", "") )