view schedule_server.py @ 21:a90cb6927c7d default tip

fix countdown queries. Display "now" instead of "In -0.4 hours"
author drewp@bigasterisk.com
date Sat, 07 Sep 2024 17:47:36 -0700
parents 4092f674046d
children
line wrap: on
line source

'''
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)