timflash's picture
Initial commit
3795b82
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, MessageHandler, CallbackQueryHandler, ChatMemberHandler, filters, ContextTypes
from retriever.retriever import HymnRetriever
from llm.generate_response import generate_hymn_response
from dotenv import load_dotenv
import os
import logging
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
load_dotenv()
WELCOME_MESSAGE = (
"Hello, I'm ChoralMind! 🎶\n"
"I can help you find hymns in English or Yoruba. "
"Please choose a language:"
)
async def send_welcome_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Send the welcome message with language selection buttons."""
logger.info("Sending welcome message with language selection")
keyboard = [
[
InlineKeyboardButton("English", callback_data="english"),
InlineKeyboardButton("Yoruba", callback_data="yoruba")
]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.effective_chat.send_message(WELCOME_MESSAGE, reply_markup=reply_markup)
logger.info("Sent welcome message and language selection prompt")
async def chat_member(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle new chat members to send welcome message when bot is added."""
my_chat_member = update.my_chat_member
new_status = my_chat_member.new_chat_member.status
logger.info(f"Chat member update received. New status: {new_status}")
# Trigger when the bot is added to a chat or a private chat is started
if new_status in ['member', 'administrator']:
await send_welcome_message(update, context)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle /start command to resend welcome message and buttons."""
logger.info("Received /start command")
await send_welcome_message(update, context)
async def clear(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Clear the user's conversation data."""
logger.info("Received /clear command")
context.user_data.clear()
await update.message.reply_text(
"Conversation cleared! Click /start or wait for the welcome message to begin again.\n"
"Note: To manage or forget this chat from my memory, go to the 'Data Controls' section in your settings"
)
logger.info("Cleared user data and sent confirmation")
# Resend welcome message after clearing
await send_welcome_message(update, context)
async def language_choice(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle language selection from inline buttons."""
query = update.callback_query
await query.answer()
language = query.data
context.user_data["language"] = language
logger.info(f"User selected language: {language}")
await query.message.reply_text(f"Selected {language.capitalize()}. Enter a line from the hymn to search:")
logger.info("Prompted user for hymn line")
async def search_hymn(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle hymn search queries."""
query = update.message.text
language = context.user_data.get("language", None)
logger.info(f"Received hymn search query: '{query}'")
if not language:
logger.warning("No language selected for query")
await update.message.reply_text(
"Please select a language first. Use /start or wait for the welcome message."
)
await send_welcome_message(update, context)
return
logger.info(f"Retrieving hymns for language: {language}")
retriever = HymnRetriever()
retrieved_hymns = retriever.retrieve(query, language)
if not retrieved_hymns:
logger.info(f"No hymns found for query: '{query}' in {language}")
await update.message.reply_text(
f"No matching hymns found in {language.capitalize()}. Try another line."
)
return
logger.info("Generating response with retrieved hymns")
response = generate_hymn_response(retrieved_hymns, query, language)
await update.message.reply_text(response)
logger.info("Sent response to user")
def main():
logger.info("Starting Telegram bot")
application = Application.builder().token(os.getenv("TELEGRAM_BOT_TOKEN")).build()
# Command handlers
application.add_handler(CommandHandler("start", start))
application.add_handler(CommandHandler("clear", clear))
# Chat member handler for new chats
application.add_handler(ChatMemberHandler(chat_member, ChatMemberHandler.MY_CHAT_MEMBER))
# Callback and message handlers
application.add_handler(CallbackQueryHandler(language_choice))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, search_hymn))
logger.info("Bot polling started")
application.run_polling()
if __name__ == "__main__":
main()