Add lunch.py
This commit is contained in:
parent
e4ef7499e8
commit
a2849d5c41
1 changed files with 112 additions and 0 deletions
112
lunch.py
Normal file
112
lunch.py
Normal file
|
@ -0,0 +1,112 @@
|
|||
import re
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
from PyPDF2 import PdfReader
|
||||
import requests
|
||||
|
||||
# === CONFIG ===
|
||||
PDF_FILE = "menu.pdf"
|
||||
BOT_TOKEN = "TOKEN"
|
||||
CHAT_ID = "CHATID" # or use the channel's numeric ID
|
||||
|
||||
# === HELPERS ===
|
||||
def extract_text_from_pdf(path):
|
||||
reader = PdfReader(path)
|
||||
return "\n".join(page.extract_text() for page in reader.pages)
|
||||
|
||||
def extract_month_year(text):
|
||||
match = re.search(r"Lunch\s+(\w+)\s+(\d{4})", text)
|
||||
if match:
|
||||
return match.group(1), int(match.group(2))
|
||||
raise ValueError("Could not find month and year in PDF")
|
||||
|
||||
def month_name_to_number(name):
|
||||
return datetime.strptime(name[:3], "%b").month
|
||||
|
||||
def find_menu_items(text):
|
||||
# Match number-day + content, even if day markers are inline (e.g., "29) ... 30)")
|
||||
pattern = r"(\d{1,2}\))\s*(.*?)(?=(?:\n?\s*\d{1,2}\))|\Z)"
|
||||
matches = re.findall(pattern, text, re.DOTALL)
|
||||
|
||||
entries = []
|
||||
for day_marker, content in matches:
|
||||
day = day_marker.strip(")").strip()
|
||||
cleaned = re.sub(r"\s+", " ", content).strip()
|
||||
entries.append((day, cleaned))
|
||||
return entries
|
||||
|
||||
def build_menu_mapping(text, year, month):
|
||||
items = find_menu_items(text)
|
||||
menu_by_date = {}
|
||||
|
||||
# Get all weekdays in the month
|
||||
current = datetime(year, month, 1)
|
||||
weekdays = []
|
||||
while current.month == month:
|
||||
if current.weekday() < 5: # Mon–Fri
|
||||
weekdays.append(current)
|
||||
current += timedelta(days=1)
|
||||
|
||||
# Match each menu item to weekday, assuming school days only
|
||||
for (day_str, content) in items:
|
||||
try:
|
||||
day = int(day_str)
|
||||
date = datetime(year, month, day)
|
||||
if date.weekday() >= 5:
|
||||
continue # Skip weekends
|
||||
date_key = date.strftime("%Y-%m-%d")
|
||||
cleaned = re.sub(r"\s+", " ", content).strip()
|
||||
menu_by_date[date_key] = cleaned
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
return menu_by_date
|
||||
|
||||
def load_or_parse_menu():
|
||||
# Extract month/year
|
||||
text = extract_text_from_pdf(PDF_FILE)
|
||||
#print(text[:2000]) # show the first 2000 characters
|
||||
#exit()
|
||||
month_name, year = extract_month_year(text)
|
||||
month = month_name_to_number(month_name)
|
||||
|
||||
# JSON cache
|
||||
json_file = f"menu_{year}_{month:02d}.json"
|
||||
if os.path.exists(json_file):
|
||||
with open(json_file) as f:
|
||||
return json.load(f)
|
||||
|
||||
# Parse and save
|
||||
menu_data = build_menu_mapping(text, year, month)
|
||||
with open(json_file, "w") as f:
|
||||
json.dump(menu_data, f, indent=2)
|
||||
return menu_data
|
||||
|
||||
def send_to_telegram(text):
|
||||
url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
|
||||
payload = {"chat_id": CHAT_ID, "text": text}
|
||||
response = requests.post(url, data=payload)
|
||||
return response.status_code == 200
|
||||
|
||||
def main():
|
||||
today = datetime.now().strftime("%Y-%m-%d")
|
||||
menu = load_or_parse_menu()
|
||||
|
||||
if today in menu:
|
||||
lunch = menu[today]
|
||||
|
||||
if "Early Dismissal" in lunch:
|
||||
message = f"⚠️ Early Dismissal Today ({today}):\n\n{lunch}"
|
||||
elif "No School" in lunch:
|
||||
message = f"❌ No School Today ({today}):\n\n{lunch}"
|
||||
elif "No lunch" in lunch:
|
||||
message = f"⚠️ No Lunch Today ({today}):\n\n{lunch}"
|
||||
else:
|
||||
message = f"📅 Today's Lunch Menu ({today}):\n\n{lunch}"
|
||||
|
||||
send_to_telegram(message)
|
||||
else:
|
||||
print(f"No menu for {today}. Might be a weekend or no school.")
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Add table
Reference in a new issue