diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..0a30a12 --- /dev/null +++ b/.env.sample @@ -0,0 +1 @@ +HAS_TOKEN=xxx \ No newline at end of file diff --git a/.gitignore b/.gitignore index 60aecd6..6a65419 100644 --- a/.gitignore +++ b/.gitignore @@ -175,4 +175,7 @@ cython_debug/ *.bmp -*.png \ No newline at end of file +*.png +credentials.json + +.env \ No newline at end of file diff --git a/building-out.py b/building-out.py index 5b25bba..1869d3a 100644 --- a/building-out.py +++ b/building-out.py @@ -1,7 +1,10 @@ from inky import InkyWHAT from inky.auto import auto +from dotenv import load_dotenv from building import draw_image +load_dotenv() + display = auto(verbose = True) image = draw_image() display.set_image(image) diff --git a/building.py b/building.py index 71a1098..2a68e9c 100644 --- a/building.py +++ b/building.py @@ -1,9 +1,14 @@ from PIL import Image from PIL import ImageDraw from PIL import ImageFont -from datetime import datetime +from datetime import datetime, timedelta from time import gmtime, strftime import time +from googleCalendar import get_events +from itertools import groupby +from hasApi import get_calendar_events +import dateutil.parser +from dotenv import load_dotenv black = '#000000' white = '#ffffff' @@ -15,6 +20,8 @@ fontLarge = ImageFont.truetype ("Nunito-ExtraLight.ttf", 18) fontSmall = ImageFont.truetype ("Nunito-ExtraLight.ttf", 16) fontVerySmall = ImageFont.truetype("Nunito-ExtraLight.ttf", 10) +class Space(Exception): pass + def getsize(font, text): _, _, right, bottom = font.getbbox(text) return (right, bottom) @@ -60,7 +67,7 @@ def draw_image(): draw.rounded_rectangle(((400/2) + ep, 30+ep, 400-ep, 300-ep), 10, outline=black, width=2) # Add tasks - draw.text((15, 50), 'Tasks', black, fontTitle) + draw.text((15, 40), 'Tasks', black, fontTitle) tasks = [ {'done': False, 'title': 'Something'}, @@ -69,12 +76,12 @@ def draw_image(): {'done': False, 'title': 'Call locksmith'}, ] - taskStart = 90 + taskStart = 80 for task in tasks: if task['done']: - draw.text((15, taskStart), '󰄵', black, fontSymbols) + draw.text((15, taskStart-2), '󰄵', black, fontSymbols) else: - draw.text((15, taskStart), '󰄱', black, fontSymbols) + draw.text((15, taskStart-2), '󰄱', black, fontSymbols) reflowedTitle = reflow_quote(task['title'], 170, fontLarge) titleSizeW, titleSizeH = getsize(fontLarge, reflowedTitle) @@ -83,8 +90,54 @@ def draw_image(): draw.text((35, taskStart - 3), reflowedTitle, black, fontLarge) taskStart += titleSizeH + (2*ep) + # Add cal + draw.text((215, 40), 'Calendar', black, fontTitle) + events = get_calendar_events() + def get_start_date(x): + start = x['start'] + if 'date' in start: + startDate = datetime.strptime(start['date'], '%Y-%m-%d').date() + elif 'dateTime' in start: + startDate = datetime.strptime(start['dateTime'][:10], '%Y-%m-%d').date() + else: + print('Error') + print(start) + return None + if startDate < datetime.today().date(): + return datetime.today().date() + else: return startDate + + itemStart = 80 + try: + for key, group in groupby(events, get_start_date): + if key == datetime.today().date(): + dateStr = 'Today' + elif key == (datetime.today() + timedelta(days = 1)).date(): + dateStr = 'Tomorrow' + else: + dateStr = key.strftime('%d %b') + + draw.text((215, itemStart), dateStr, black, fontLarge) + w, h = getsize(fontLarge, 'Today') + itemStart += h + (ep) + + for thing in list(group): + reflowedItem = reflow_quote(thing['summary'], 170, fontSmall) + w, h = getsize(fontLarge, 'Today') + h *= (reflowedItem.count('\n') + 1) + # print(f'After {reflowedItem}, {itemStart + h}') + if itemStart + h > 270: raise Space + draw.text((230, itemStart), reflowedItem, black, fontSmall) + itemStart += h + (ep) + + if itemStart > 250: raise Space + except Space: + pass + + return image if __name__ == "__main__": + load_dotenv() img = draw_image() img.save('built.bmp') \ No newline at end of file diff --git a/hasApi.py b/hasApi.py new file mode 100644 index 0000000..0f1529e --- /dev/null +++ b/hasApi.py @@ -0,0 +1,22 @@ +import requests +import datetime +from dotenv import load_dotenv +import os + +def get_calendar_events(): + token = os.getenv('HAS_TOKEN') + if not token: + raise Exception('Missing HAS token') + + headers = {"Authorization": f"Bearer {token}"} + payload = { + 'start': datetime.datetime.now().strftime('%Y-%m-%d'), + 'end': (datetime.datetime.now() + datetime.timedelta(days=14)).strftime('%Y-%m-%d')} + response = requests.get('https://has.nozzy.online/api/calendars/calendar.romosborne_gmail_com', + headers=headers, + params=payload) + return response.json() + +if __name__ == "__main__": + load_dotenv() + events = get_calendar_events() diff --git a/requirements.txt b/requirements.txt index 6eab459..8bf634d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ pillow inky imgkit +requests +python-dotenv \ No newline at end of file