You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.4 KiB

import asyncio
import json
import time
from datetime import datetime
from quart import websocket
from quart import current_app as app
import settings
from ircserver.utils import collect_websocket
@app.websocket('/ws')
@collect_websocket
async def ws(queue):
from ircserver.irc import messages
from ircserver.factory import irc_bot as bot
if messages:
await websocket.send(json.dumps({"data": messages}).encode())
async def rx():
while True:
buffer = await websocket.receive()
try:
if buffer:
bot.send("PRIVMSG", target=settings.IRC_CHANNEL, message=buffer.decode())
now = datetime.now()
now = time.mktime(now.timetuple())
messages.append({"nick": "d4irc", "message": buffer.decode(), "now": now})
if len(messages) > 20:
messages.pop(0)
except Exception as ex:
continue
async def tx():
while True:
data = await queue.get()
payload = json.dumps(data).encode()
await websocket.send(payload)
consumer_task = asyncio.ensure_future(rx())
producer_task = asyncio.ensure_future(tx())
try:
await asyncio.gather(consumer_task, producer_task)
finally:
consumer_task.cancel()
producer_task.cancel()