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