Skip to content

Instantly share code, notes, and snippets.

@jakob-lj
Last active February 5, 2025 08:26
Show Gist options
  • Save jakob-lj/1bcba63b957394724f223c90481e6e2a to your computer and use it in GitHub Desktop.
Save jakob-lj/1bcba63b957394724f223c90481e6e2a to your computer and use it in GitHub Desktop.
xbar plugin for skjer
#! <python execuatble .. make python env and use it>
import sys
import requests
from ics import Calendar
from datetime import datetime, timedelta, timezone
import humanize
from pytz import timezone as t
## Customize to your needs
menu_bar_item = "📅"
day_of_month_map = {
0: "man",
1: "tirs",
2: "ons",
3: "tor",
4: "fre",
5: "lør",
6: "søn",
}
USE_NAME_OF_NEXT_EVENT_IN_MENU_BAR = False
ical_url = "<ask>"
now = datetime.now(timezone.utc)
def is_today(event):
return event.begin.datetime.date() == now.date() and event.end.datetime > now
def dt_is_today(dt):
return dt.weekday() >= now.weekday() and (dt - now).days < 6
def is_this_week(event):
return dt_is_today(event.begin.datetime)
def color(event):
if is_today(event):
return "#ffc815"
if is_this_week(event):
return "#00c89e"
return "#ba26fe"
def format_time(time, include_date=False):
time.datetime.astimezone(t("Europe/Oslo")).strftime("%H:%M")
timediff_seconds = (time - now).total_seconds()
if timediff_seconds < 0:
return "skjer nå"
elif timediff_seconds < 3599:
return f"om {round((timediff_seconds / 60))} min "
elif dt_is_today(time.datetime):
return time.datetime.astimezone(t("Europe/Oslo")).strftime("%H:%M")
else:
pattern = "%H:%M"
if include_date:
if now + timedelta(days=7) < time:
pattern = f"%d.%m {pattern}"
pattern = f"{day_of_month_map[time.weekday()]} {pattern}"
return time.datetime.astimezone(t("Europe/Oslo")).strftime(pattern)
def location(event):
if event.location.lower() != "hq":
return f" @ {event.location}"
return ""
def header(next_event, events_today):
if (
next_event is not None and USE_NAME_OF_NEXT_EVENT_IN_MENU_BAR
): # feature toggled off by default. See settigs-section
print(f"{next_event.name} {format_time(next_event.begin)}")
else:
if len(events_today) > 0:
print(f"{menu_bar_item} ({len(events_today)})")
else:
print(f"{menu_bar_item}")
def dropdown(upcomming_events):
for event in upcomming_events:
print(
f"{event.name} ({format_time(event.begin, include_date=True)}{location(event)}) | href={event.url} | color={color(event)}"
)
def output(next_event, events_today, upcomming_events):
header(next_event, events_today)
print("---")
dropdown(
upcomming_events=upcomming_events,
)
def main():
# URL of the iCalendar file
# Fetch the iCalendar file
response = requests.get(ical_url)
response.raise_for_status() # Raise an error if the request fails
# Parse the calendar
calendar = Calendar(response.text)
# Define time range: next 7 days
one_week_later = now + timedelta(days=14)
# Filter events for today
events_today = sorted(
[event for event in calendar.events if is_today(event)],
key=lambda event: event.begin.datetime,
)
if len(events_today) > 0:
next_event_today = events_today[0]
else:
next_event_today = None
# Filter events for the next 7 days
upcoming_events = sorted(
[
event
for event in calendar.events
if now <= event.end.datetime <= one_week_later
],
key=lambda event: event.begin.datetime,
)
output(next_event_today, events_today, upcoming_events)
if __name__ == "__main__":
# print("Skjer")
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment