Added new codes
This commit is contained in:
1111
Building a Professional Scheduler Bot MVP.html
Normal file
1111
Building a Professional Scheduler Bot MVP.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
scheduler_bots/.DS_Store
vendored
Normal file
BIN
scheduler_bots/.DS_Store
vendored
Normal file
Binary file not shown.
60
scheduler_bots/README.md
Normal file
60
scheduler_bots/README.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# Scheduler Bots
|
||||||
|
|
||||||
|
This directory contains Telegram scheduler bots that help manage schedules.
|
||||||
|
|
||||||
|
## Setup Instructions
|
||||||
|
|
||||||
|
1. Create a virtual environment:
|
||||||
|
```
|
||||||
|
python -m venv venv
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Activate the virtual environment:
|
||||||
|
- On macOS/Linux: `source venv/bin/activate`
|
||||||
|
- On Windows: `venv\Scripts\activate`
|
||||||
|
|
||||||
|
3. Install required packages:
|
||||||
|
```
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Running the bots
|
||||||
|
|
||||||
|
### Method 1: Using Python command (Recommended)
|
||||||
|
```
|
||||||
|
python telegram_scheduler_v1.py
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```
|
||||||
|
python telegram_scheduler_v2.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### Method 2: Direct execution
|
||||||
|
Make sure you've activated the virtual environment first:
|
||||||
|
```
|
||||||
|
source venv/bin/activate # On macOS/Linux
|
||||||
|
./telegram_scheduler_v1.py
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```
|
||||||
|
./telegram_scheduler_v2.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
If you encounter "pandas library not found" error:
|
||||||
|
|
||||||
|
1. Make sure you've activated the virtual environment:
|
||||||
|
```
|
||||||
|
source venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Verify pandas is installed:
|
||||||
|
```
|
||||||
|
pip list | grep pandas
|
||||||
|
```
|
||||||
|
|
||||||
|
3. If not installed, install requirements:
|
||||||
|
```
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
13
scheduler_bots/requirements.txt
Normal file
13
scheduler_bots/requirements.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
anyio==4.12.0
|
||||||
|
certifi==2025.11.12
|
||||||
|
h11==0.16.0
|
||||||
|
httpcore==1.0.9
|
||||||
|
httpx==0.28.1
|
||||||
|
idna==3.11
|
||||||
|
numpy==2.3.5
|
||||||
|
pandas==2.3.3
|
||||||
|
python-dateutil==2.9.0.post0
|
||||||
|
python-telegram-bot==22.5
|
||||||
|
pytz==2025.2
|
||||||
|
six==1.17.0
|
||||||
|
tzdata==2025.2
|
||||||
11
scheduler_bots/schedule_template RS.csv
Normal file
11
scheduler_bots/schedule_template RS.csv
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Day,1 (9:00-9:40),2 (10:00-10:40),3 (11:00-11:40),4 (11:50-12:30),5 (12:40-13:20),6 (13:30-14:10),7 (14:20-15:00),8 (15:20-16:00),9 (16:15-16:55),10 (17:05-17:45),11 (17:55-18:35),12 (18:45-19:20),13 (19:20-20:00)
|
||||||
|
Monday,,"Subject: Maths Class: 2А/2В/2С E5
|
||||||
|
Room: B24",,,Subject: ICT Class: 6A/6B Room: B24,,Subject: ICT Class: 7C/7D Room: B24,Subject: ICT Class: 10ABC Room: B24,Subject: ICT Class: 7A/7B Room: B24,,,,
|
||||||
|
Tuesday,"Subject: Технотрек Class: 7A/7B/7C/7D/7E Room: B24, B02",Subject: Технотрек Class: 6A/6B/6C/6D Room: B24,,,,,,Subject: ICT Class: 9ABC Room: B24,Subject: ICT Class: 8ABC Room: B24,Subject: ICT Class: 11A Room: B24,,,
|
||||||
|
Wednesday,,,,Subject: ICT Class: 6C/6D Room: B24,,"Subject: Maths Class: 1А/1В/1С E6
|
||||||
|
Room: B24",,,,,,,
|
||||||
|
Thursday,,Subject: Технотрек Class: 7A/7B/7C/7D/7E Room: B24,Subject: Технотрек Class: 7A/7B/7C/7D/7E Room: B24,"Subject: Maths Class: 1А/1В/1С E6
|
||||||
|
Room: B24",,,Subject: Maths Class: 2А/2В/2С E6 Room: B24,,Subject: ICT Class: 10ABC Room: B24,Subject: ICT Class: 11A Room: B24,,,
|
||||||
|
Friday,,,Subject: Технотрек Class: 6A/6B/6C/6D Room: B24,Subject: Технотрек Class: 6A/6B/6C/6D Room: B24,,Subject: ICT Class: 10ABC Room: B24,,,Subject: ICT Class: 11A Room: B24,,,,
|
||||||
|
Saturday,,,,,,,,,,,,,
|
||||||
|
Sunday,,,,,,,,,,,,,
|
||||||
|
196
scheduler_bots/telegram_scheduler_v2.py
Normal file
196
scheduler_bots/telegram_scheduler_v2.py
Normal 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()
|
||||||
Reference in New Issue
Block a user