From f3d987ecbca28652ecc7d8c9d751bdac415125ef Mon Sep 17 00:00:00 2001 From: Lucas Date: Wed, 30 Mar 2022 23:57:47 -0400 Subject: [PATCH] adding full project without the pi sign edits --- calendar_grabber.py | 50 +++++++++++++++++++++++++++++++++++++++++++-- event.py | 17 +++++++++++++++ example.py | 14 +++++++++++++ pi-calendar-sign.py | 45 ++++++++++++++++++++++++++++++++++++++++ run.py | 3 --- 5 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 event.py create mode 100644 example.py create mode 100644 pi-calendar-sign.py delete mode 100644 run.py diff --git a/calendar_grabber.py b/calendar_grabber.py index cdc2a49..60dc07e 100644 --- a/calendar_grabber.py +++ b/calendar_grabber.py @@ -1,8 +1,54 @@ +from datetime import datetime + +from google.oauth2 import service_account +from googleapiclient.discovery import build +from googleapiclient.errors import HttpError + +from event import Event +from time import sleep + class CalGrab(object): - def __init__(self): - print("Hello") + def __init__(self, auth_file, calendars=[], callbacks=[]): + self.calendars = calendars + self.callbacks = callbacks + self.creds = service_account.Credentials.from_service_account_file( + auth_file, scopes=['https://www.googleapis.com/auth/calendar.readonly']) + try: + self.service = build('calendar', 'v3', credentials=self.creds) + except HttpError as error: + raise error + def update_at_interval(self, frequency, time_to_update=-1): + """ + :param frequency: Amount of time to wait between updates in seconds + :param time_to_update: normally set to -1 aka no limit. Time in minutes to continually ping the api for. + :return: None + """ + try: + start = None + while True: + now = datetime.utcnow() # 'Z' indicates UTC time + now_str = now.isoformat() + 'Z' + if start ==None: + start = now + print('Getting the upcoming 10 events') + events_result = self.service.events().list(calendarId='loskorep@productiveedge.com', timeMin=now_str, + maxResults=10, singleEvents=True, + orderBy='startTime').execute() + events = events_result.get('items', []) + if not events: + print('No upcoming events found.') + return + + events = [Event.get_from_gcal_api_json(json) for json in events] + for callback in self.callbacks: + callback(events) + if (now-start).total_seconds() > time_to_update: + return + sleep(frequency) + except HttpError as error: + print('An error occurred: %s' % error) diff --git a/event.py b/event.py new file mode 100644 index 0000000..f713d3a --- /dev/null +++ b/event.py @@ -0,0 +1,17 @@ +from dateutil.parser import parse + +class Event(object): + + def __init__(self, summary, start_time, end_time): + self.summary = summary + self.start_time = start_time + self.end_time = end_time + + def __str__(self): + return f"summary : {self.summary}, end_time : {self.end_time}, start_time : {self.start_time}" + + + @staticmethod + def get_from_gcal_api_json(json): + print(json['start'].get('dateTime') ) + return Event(json['summary'], parse(json['start'].get('dateTime')), parse(json['end'].get('dateTime'))) \ No newline at end of file diff --git a/example.py b/example.py new file mode 100644 index 0000000..1997244 --- /dev/null +++ b/example.py @@ -0,0 +1,14 @@ +from calendar_grabber import CalGrab + +def process_events(events): + print("PROCESSING EVENTS") + for event in events: + print(event) + +def main(): + cg = CalGrab("./.auth.json", "loskorep@productiveedge.com", [process_events]) + cg.update_at_interval(5, 15) + + +if __name__ == '__main__': + main() diff --git a/pi-calendar-sign.py b/pi-calendar-sign.py new file mode 100644 index 0000000..a46f597 --- /dev/null +++ b/pi-calendar-sign.py @@ -0,0 +1,45 @@ +from datetime import datetime, time + +from pytz import timezone + +from calendar_grabber import CalGrab + +TIMEZONE = timezone('US/Eastern') +WORK_START = time(9, 00) +WORK_STOP = time(17, 00) + + +def is_event_active(events, now): + for event in events: + if event.start_time < now and event.end_time > now: + print("EVENT IS ACTIVE") + + +def is_work_time(now): + return now < WORK_STOP and now > WORK_START + + +def process_events(events): + now = datetime.now(tz=TIMEZONE) + print("PROCESSING EVENTS") + is_working_time = is_work_time(now.time()) + print(is_working_time) + if is_event_active(events, now): + if is_working_time: + print("Meeting in Progress") + else: + print("Fuck me -_-") + else: + if is_working_time: + print("Work time - No event") + else: + print("Looks like 420 to me ayooo") + + +def main(): + cg = CalGrab("./.auth.json", "loskorep@productiveedge.com", [process_events]) + cg.update_at_interval(5, 15) + + +if __name__ == '__main__': + main() diff --git a/run.py b/run.py deleted file mode 100644 index 40d3cad..0000000 --- a/run.py +++ /dev/null @@ -1,3 +0,0 @@ -from calendar_grabber import CalGrab - -CalGrab() \ No newline at end of file