2023-02-24 07:32:42 +09:00
|
|
|
# SPDX-FileCopyrightText: 2022 n9k <https://gitler.moe/ninya9k>
|
2022-03-07 23:51:59 +09:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
2022-02-16 18:55:30 +09:00
|
|
|
import asyncio
|
|
|
|
from quart import current_app, websocket
|
|
|
|
|
2022-06-25 13:21:39 +09:00
|
|
|
from anonstream.user import see, ensure_allowedness, AllowednessException
|
2022-02-16 18:55:30 +09:00
|
|
|
from anonstream.websocket import websocket_outbound, websocket_inbound
|
|
|
|
from anonstream.routes.wrappers import with_user_from
|
|
|
|
|
|
|
|
@current_app.websocket('/live')
|
2022-06-25 13:21:39 +09:00
|
|
|
@with_user_from(websocket, fallback_to_token=True, ignore_allowedness=True)
|
2022-06-22 17:10:42 +09:00
|
|
|
async def live(timestamp, user_or_token):
|
|
|
|
match user_or_token:
|
|
|
|
case str() | None:
|
|
|
|
await websocket.send_json({'type': 'kick'})
|
|
|
|
await websocket.close(1001)
|
|
|
|
case dict() as user:
|
|
|
|
try:
|
2022-06-25 13:21:39 +09:00
|
|
|
ensure_allowedness(user, timestamp=timestamp)
|
|
|
|
except AllowednessException:
|
|
|
|
await websocket.send_json({'type': 'kick'})
|
|
|
|
await websocket.close(1001)
|
|
|
|
else:
|
|
|
|
queue = asyncio.Queue()
|
|
|
|
user['websockets'][queue] = timestamp
|
|
|
|
user['last']['reading'] = timestamp
|
|
|
|
|
|
|
|
producer = websocket_outbound(queue, user)
|
|
|
|
consumer = websocket_inbound(queue, user)
|
|
|
|
try:
|
|
|
|
await asyncio.gather(producer, consumer)
|
|
|
|
finally:
|
|
|
|
see(user)
|
|
|
|
user['websockets'].pop(queue)
|