#!/usr/bin/env python """ Enhanced Scheduler Bot with CSV support """ try: import pandas as pd except ImportError: print("❌ Error: pandas library not found!") print("Please install required packages using:") print("pip install -r requirements.txt") exit(1) import datetime from telegram import Update from telegram.ext import Application, CommandHandler, ContextTypes # 🔑 REPLACE THIS with your bot token from @BotFather BOT_TOKEN = "8248686383:AAGN5UJ73H9i7LQzIBR3TjuJgUGNTFyRHk8" def load_schedule(): """ Load schedule from CSV file using pandas Returns a dictionary with day-wise schedule """ try: # Read CSV file df = pd.read_csv('schedule.csv') schedule = {} # Process each row (each day) for _, row in df.iterrows(): day = row['Day'] schedule[day] = [] # Process each time slot column time_slots = ['Period_1', 'Period_2', 'Period_3', 'Period_4', 'Period_5','Period_6', 'Period_7'] for slot in time_slots: # Check if class exists for this time slot if pd.notna(row[slot]) and str(row[slot]).strip(): class_info = str(row[slot]) schedule[day].append((slot, class_info)) return schedule except FileNotFoundError: print("❌ Error: schedule.csv file not found!") print("Please create schedule.csv in the same folder") return {} except Exception as e: print(f"❌ Error loading schedule: {e}") return {} # Load schedule at startup SCHEDULE = load_schedule() # Time mapping for periods PERIOD_TIMES = { 'Period_1': ('09:00', '09:40'), 'Period_2': ('10:00', '10:40'), 'Period_3': ('11:00', '11:40'), 'Period_4': ('11:50', '12:30'), 'Period_5': ('12:40', '13:20'), 'Period_6': ('13:30', '14:10'), 'Period_7': ('10:00', '10:40'), } async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): """Send welcome message when command /start is issued.""" await update.message.reply_text( "🤖 Hello! I'm your enhanced class scheduler bot!\n" "Use /whereami to find your current class\n" "Use /schedule to see today's full schedule\n" "Use /tomorrow to see tomorrow's schedule\n" "Use /help for all commands" ) async def where_am_i(update: Update, context: ContextTypes.DEFAULT_TYPE): """Tell user where they should be right now.""" if not SCHEDULE: await update.message.reply_text("❌ Schedule not loaded. Check schedule.csv file.") return now = datetime.datetime.now() current_time = now.strftime("%H:%M") current_day = now.strftime("%A") await update.message.reply_text(f"📅 Today is {current_day}") await update.message.reply_text(f"⏰ Current time: {current_time}") # Check if we have schedule for today if current_day not in SCHEDULE: await update.message.reply_text("😊 No classes scheduled for today!") return # Find current class found_class = False for period, class_info in SCHEDULE[current_day]: start_time, end_time = PERIOD_TIMES[period] if start_time <= current_time <= end_time: await update.message.reply_text(f"🎯 You should be in: {class_info}") found_class = True break if not found_class: await update.message.reply_text("😊 No class right now! Free period.") async def schedule(update: Update, context: ContextTypes.DEFAULT_TYPE): """Show today's full schedule.""" if not SCHEDULE: await update.message.reply_text("❌ Schedule not loaded. Check schedule.csv file.") return current_day = datetime.datetime.now().strftime("%A") if current_day not in SCHEDULE or not SCHEDULE[current_day]: await update.message.reply_text("😊 No classes scheduled for today!") return schedule_text = f"📚 {current_day}'s Schedule:\n\n" for period, class_info in SCHEDULE[current_day]: start, end = PERIOD_TIMES[period] schedule_text += f"⏰ {start}-{end}: {class_info}\n" await update.message.reply_text(schedule_text) async def tomorrow(update: Update, context: ContextTypes.DEFAULT_TYPE): """Show tomorrow's schedule.""" if not SCHEDULE: await update.message.reply_text("❌ Schedule not loaded. Check schedule.csv file.") return tomorrow_date = datetime.datetime.now() + datetime.timedelta(days=1) tomorrow_day = tomorrow_date.strftime("%A") if tomorrow_day not in SCHEDULE or not SCHEDULE[tomorrow_day]: await update.message.reply_text(f"😊 No classes scheduled for {tomorrow_day}!") return schedule_text = f"📚 {tomorrow_day}'s Schedule:\n\n" for period, class_info in SCHEDULE[tomorrow_day]: start, end = PERIOD_TIMES[period] schedule_text += f"⏰ {start}-{end}: {class_info}\n" await update.message.reply_text(schedule_text) async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Send help message with all commands.""" await update.message.reply_text( "Available commands:\n" "/start - Start the bot\n" "/whereami - Find your current class\n" "/schedule - Show today's schedule\n" "/tomorrow - Show tomorrow's schedule\n" "/help - Show this help message" ) def main(): """Start the bot.""" if not SCHEDULE: print("❌ Failed to load schedule. Please check schedule.csv file.") print("Make sure schedule.csv exists in the same folder") return # Create the Application application = Application.builder().token(BOT_TOKEN).build() # Add command handlers application.add_handler(CommandHandler("start", start)) application.add_handler(CommandHandler("whereami", where_am_i)) application.add_handler(CommandHandler("schedule", schedule)) application.add_handler(CommandHandler("tomorrow", tomorrow)) application.add_handler(CommandHandler("help", help_command)) # Start the Bot print("🤖 Enhanced scheduler bot is running...") print("📊 Schedule loaded successfully!") print("📅 Available days:", list(SCHEDULE.keys())) print("Press Ctrl+C to stop the bot") application.run_polling() if __name__ == "__main__": main()