mystic_cal:mystic_cal_code
This is an old revision of the document!
Table of Contents
Mystic Calendar Code
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
pip3 install requests
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)
mystic_cal/mystic_cal_code.1771259871.txt.gz · Last modified: by freedomotter
