Files
calendar_bot/my_project_name/caldav_handler.py
2021-08-02 22:12:33 +02:00

106 lines
3.9 KiB
Python

import sys
import time
import logging
import collections
from os.path import exists
import json
import dateutil.rrule as rrule
import caldav
import pytz
from icalendar import Calendar, Event
import datetime
import caldav
class CaldavHandler:
def get_config(self, path):
with open("./config.json") as f:
return json.load(f)
def __init__(self):
self._config_path = "./config.json"
if not exists(self._config_path):
print("No config file found. Aborting.")
self._config = self.get_config(self._config_path)
self._caldavclient = caldav.DAVClient(self._config["caldav"]["url"],
username=self._config["caldav"]["username"],
password=self._config["caldav"]["password"])
def get_event_map(self, events, time_span):
result = {}
for event in events:
event.load()
e = event.instance.vevent
list_of_occurences = []
if e.getChildValue('rrule') == None:
list_of_occurences.append(e.getChildValue('dtstart'))
else:
#recurring events only return with the date of the first recurring event ever created
#we have to use rrule manually to expand the dates to display them correctly
rule = rrule.rrulestr(e.getChildValue('rrule'), dtstart=e.getChildValue('dtstart'))
list_of_occurences = rule.between(datetime.datetime.now(datetime.timezone.utc),
datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=time_span),
inc=True)
for datetime_of_event in list_of_occurences:
datestr = datetime_of_event.strftime("%x")
eventstr = str( "(" + e.dtstart.value.strftime("%H:%M") + " - " + e.dtend.value.strftime("%H:%M") + ") " + e.summary.value)
if datestr in result:
result[datestr].append(eventstr)
else:
result[datestr] = [ eventstr ]
#sort start times
for key in result:
result[key].sort()
od = collections.OrderedDict(sorted(result.items()))
return od
def event_map_to_string(self, event_map):
result = ""
for k, v in event_map.items():
dt_string = k
format = "%x"
dt_object = datetime.datetime.strptime(dt_string, format)
result += "##### " + dt_object.strftime("%A, %d. of %B") + ":\n"
for event in v:
result += "* " + event + "\n"
print(result)
return result
def event_to_string(self, event):
event.load()
e = event.instance.vevent
datestr = e.dtstart.value.strftime("%X")
return str( "(" + e.dtstart.value.strftime("%a, %-d. %b - %H:%M") + " - " + e.dtend.value.strftime("%H:%M") + ") " + e.summary.value)
def get_events(self, start_time, end_time):
cal = self._caldavclient.principal().calendars()
for ca in cal:
events = ca.date_search(start=start_time, end=end_time, expand=True)
return events
def send_events(self, events, time_span):
return self.event_map_to_string(self.get_event_map(events, time_span))
def print_month(self):
events = self.get_events(datetime.date.today(), datetime.date.today() + datetime.timedelta(days=30))
return self.send_events(events, 30)
def print_week(self):
events = self.get_events(datetime.date.today(), datetime.date.today() + datetime.timedelta(days=7))
return self.send_events(events, 7)
def print_today(self):
events = self.get_events(datetime.date.today(), datetime.date.today() + datetime.timedelta(days=1))
return self.send_events(events, 1)