51 行
1.5 KiB
Python
51 行
1.5 KiB
Python
|
import asyncio
|
||
|
|
||
|
from quart import websocket
|
||
|
|
||
|
from anonstream.chat import add_chat_message
|
||
|
from anonstream.utils.chat import generate_nonce
|
||
|
from anonstream.utils.websocket import parse
|
||
|
|
||
|
async def websocket_outbound(queue):
|
||
|
payload = {
|
||
|
'type': 'init',
|
||
|
'nonce': generate_nonce(),
|
||
|
'title': 'Stream title',
|
||
|
'uptime': None,
|
||
|
'chat': [],
|
||
|
}
|
||
|
await websocket.send_json(payload)
|
||
|
while True:
|
||
|
payload = await queue.get()
|
||
|
await websocket.send_json(payload)
|
||
|
|
||
|
async def websocket_inbound(secret, connected_websockets, chat, token):
|
||
|
while True:
|
||
|
receipt = await websocket.receive_json()
|
||
|
receipt, error = parse(chat.keys(), secret, receipt)
|
||
|
if error is not None:
|
||
|
payload = {
|
||
|
'type': 'error',
|
||
|
'because': error,
|
||
|
}
|
||
|
else:
|
||
|
text, nonce, message_id = receipt
|
||
|
add_chat_message(chat, message_id, token, text)
|
||
|
payload = {
|
||
|
'type': 'ack',
|
||
|
'nonce': nonce,
|
||
|
'next': generate_nonce(),
|
||
|
}
|
||
|
queue = connected_websockets[token]
|
||
|
await queue.put(payload)
|
||
|
|
||
|
if error is None:
|
||
|
payload = {
|
||
|
'type': 'chat',
|
||
|
'color': '#c7007f',
|
||
|
'name': 'Anonymous',
|
||
|
'text': text,
|
||
|
}
|
||
|
for queue in connected_websockets.values():
|
||
|
await queue.put(payload)
|