Amiga-Z Wiki

“Modern tools for old-school communities.”

User Tools

Site Tools


mystic_cal:mystic_cal_code

This is an old revision of the document!


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)
mystic_cal/mystic_cal_code.1771260110.txt.gz · Last modified: by freedomotter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki