====== Mystic Calendar Code ====== ---- ===== šŸ”§ Mystic Setup ===== **In Mystic:** Editors → Scripts → Add **Command:** python3 scripts/calendar.py **Birthday mode:** python3 scripts/calendar.py bd ---- ===== Main Calendar Script ===== //**scripts/calendar.py**// #!/usr/bin/env python3 import os import sys import datetime import calendar DATA_PATH = "../calendar_data" MAX_EVENTS = 14 # ANSI Colors (Retro BBS Style) C_RESET = "\033[0m" C_RED = "\033[1;31m" C_GREEN = "\033[1;32m" C_YELLOW = "\033[1;33m" C_CYAN = "\033[1;36m" C_WHITE = "\033[1;37m" C_HIGHLIGHT = "\033[1;33;40m" def load_events(filename): events = {} if not os.path.exists(filename): return events with open(filename, "r", encoding="utf-8", errors="ignore") as f: for line in f: if len(line) < 4 or not line[:4].isdigit(): continue month = int(line[:2]) day = int(line[2:4]) text = line[5:].strip() events.setdefault((month, day), []).append(text) return events def draw_calendar(events, year, month): today = datetime.date.today() cal = calendar.monthcalendar(year, month) print(C_GREEN + f"\n╔══════════════════════════════════════╗") print(f"ā•‘ Calendar - {calendar.month_name[month]} {year} ā•‘") print("ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•" + C_RESET) print(" SU MO TU WE TH FR SA") for week in cal: row = "" for day in week: if day == 0: row += " " continue marker = " " if (month, day) in events: marker = "-" if today.year == year and today.month == month and today.day == day: row += C_HIGHLIGHT + f"{marker}{day:02}{marker}" + C_RESET + " " else: row += f"{marker}{day:02}{marker} " print(row) print("\nUpcoming:\n") count = 0 for (m, d) in sorted(events.keys()): if m < month: continue for event in events[(m, d)]: print(f"{m:02}/{d:02} - {event}") count += 1 if count >= MAX_EVENTS: return def main(): today = datetime.date.today() year = today.year month = today.month mode = "events" if len(sys.argv) > 1 and sys.argv[1].lower() == "bd": mode = "bdays" filename = os.path.join(DATA_PATH, f"cal.bdays.{year}" if mode == "bd" else f"cal.{year}" ) events = load_events(filename) draw_calendar(events, year, month) input("\nPress Enter to continue...") if __name__ == "__main__": main() ===== Birthday Generator ===== //**scripts/generate_birthdays.py**// #!/usr/bin/env python3 import os import datetime import mystic # Mystic's native Python module DATA_PATH = "../calendar_data" def ordinal(n): return str(n) + ( "th" if 11 <= n % 100 <= 13 else {1: "st", 2: "nd", 3: "rd"}.get(n % 10, "th") ) def generate(year): os.makedirs(DATA_PATH, exist_ok=True) filename = os.path.join(DATA_PATH, f"cal.bdays.{year}") users = mystic.user_list() entries = [] for u in users: if not u.birthdate: continue bd = datetime.datetime.strptime(u.birthdate, "%m/%d/%Y") mmdd = bd.strftime("%m%d") line = f"{mmdd} {ordinal(bd.day):<5}- {u.name}'s birthday!" entries.append(line) entries.sort() with open(filename, "w") as f: for e in entries: f.write(e + "\n") print(f"Generated {filename}") if __name__ == "__main__": year = datetime.date.today().year generate(year) generate(year + 1) ===== Holiday Generator ===== **Install requirements:** pip3 install requests //**scripts/generate_holidays.py**// #!/usr/bin/env python3 import requests import datetime import os import sys DATA_PATH = "../calendar_data" def ordinal(n): return str(n) + ( "th" if 11 <= n % 100 <= 13 else {1: "st", 2: "nd", 3: "rd"}.get(n % 10, "th") ) def generate(year, country="US"): os.makedirs(DATA_PATH, exist_ok=True) url = f"https://date.nager.at/api/v3/PublicHolidays/{year}/{country}" r = requests.get(url) holidays = r.json() filename = os.path.join(DATA_PATH, f"cal.{year}") with open(filename, "w") as f: for h in holidays: d = datetime.datetime.strptime(h["date"], "%Y-%m-%d") mmdd = d.strftime("%m%d") f.write(f"{mmdd} {ordinal(d.day):<5}- {h['localName']}\n") print(f"Generated {filename}") if __name__ == "__main__": year = int(sys.argv[1]) if len(sys.argv) > 1 else datetime.date.today().year + 1 generate(year)