Spaces:
Sleeping
Sleeping
| import json | |
| import os | |
| import uuid | |
| from datetime import datetime, timedelta | |
| MEMORY_FILE = "calendar_memory.json" | |
| def load_events(): | |
| """Load all events from the JSON memory file.""" | |
| if not os.path.exists(MEMORY_FILE): | |
| return [] | |
| with open(MEMORY_FILE, "r") as f: | |
| return json.load(f) | |
| def save_events(events): | |
| """Save all events to the JSON memory file.""" | |
| with open(MEMORY_FILE, "w") as f: | |
| json.dump(events, f, indent=2) | |
| def add_event(date, description, category="event"): | |
| """Add a new calendar event to memory.""" | |
| events = load_events() | |
| new_event = { | |
| "id": str(uuid.uuid4()), | |
| "date": date, | |
| "description": description, | |
| "category": category, | |
| "created_at": datetime.now().isoformat() | |
| } | |
| events.append(new_event) | |
| save_events(events) | |
| return new_event | |
| def search_events(start_date=None, end_date=None, keyword=None): | |
| """Search events by date range and/or keyword.""" | |
| events = load_events() | |
| results = [] | |
| for event in events: | |
| match = True | |
| if start_date: | |
| if event["date"] < start_date: | |
| match = False | |
| if end_date: | |
| if event["date"] > end_date: | |
| match = False | |
| if keyword: | |
| if keyword.lower() not in event["description"].lower(): | |
| match = False | |
| if match: | |
| results.append(event) | |
| results.sort(key=lambda e: e["date"]) | |
| return results | |
| def get_upcoming_events(days=7): | |
| """Get events in the next N days for context assembly.""" | |
| today = datetime.now().strftime("%Y-%m-%d") | |
| end = (datetime.now() + timedelta(days=days)).strftime("%Y-%m-%d") | |
| return search_events(start_date=today, end_date=end) | |