Initial commit

This commit is contained in:
2026-01-15 08:39:04 +00:00
commit e492db40d2
9 changed files with 1131 additions and 0 deletions

View File

@@ -0,0 +1,196 @@
#!/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()