changeset 12:4092f674046d

+ schedule_server.py
author drewp@bigasterisk.com
date Thu, 06 Jun 2024 14:49:34 -0700
parents affb3c8f3f58
children deb0c25655eb
files schedule_server.py
diffstat 1 files changed, 79 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schedule_server.py	Thu Jun 06 14:49:34 2024 -0700
@@ -0,0 +1,79 @@
+'''
+GET /data
+
+fetch https://bigasterisk.com/gcalendarwatch/graph/calendar/countdown/events
+{
+    countdown: [
+        {'label': 'asher birthday', 'when': '6 days 🌞🌞🌞🌞🌞🌞'}.
+    ]
+}
+
+fetch iphone location events service in /my/serv/icloud-sync
+{
+    map: {
+        image: 'bayarea.png',
+        locations: [
+            {'label':'K', x: px, y: px}
+        ]
+    }
+}
+
+fetch calendar upcoming
+{
+    time: {
+        label: "23:30",
+        daySec: 20000,
+        scheduleRanges: [
+            {label: 'youtube',   startDaySec: 59400, endDaySec: 63000},
+            {label: 'minecraft', startDaySec: 64800, endDaySec: 68400},
+            {label: 'roblox',    startDaySec: 64800, endDaySec: 68400},
+        ]
+    }
+}
+'''
+
+import asyncio
+import datetime
+import json
+
+from sse_starlette.sse import EventSourceResponse
+from starlette.applications import Starlette
+from starlette.routing import Route
+
+
+def daySec(t: datetime.datetime):
+    return (
+        t -
+        t.replace(hour=0, minute=0, second=0, microsecond=0)).total_seconds()
+
+
+async def updates():
+    while True:
+        now = datetime.datetime.now()
+        yield json.dumps({
+            'time': {
+                'label': now.strftime("%H:%M"),
+                'daySec': daySec(now),
+
+            },
+            'map': {},
+            'countdown': {},
+        })
+        await asyncio.sleep(60)
+
+
+async def events(request) -> EventSourceResponse:
+    generator = updates()
+    return EventSourceResponse(generator,
+                               headers={
+                                   'Access-Control-Allow-Origin': '*',
+                               })
+
+
+app = Starlette(routes=[
+    Route("/events", events),
+])
+
+if __name__ == "__main__":
+    import uvicorn
+    uvicorn.run(app, host="0.0.0.0", port=8005)