view schedule_server.py @ 19:6960c172f1a9

update py, pnpm, etc
author drewp@bigasterisk.com
date Mon, 26 Aug 2024 16:17:21 -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)