from typing import List, Optional from datetime import datetime import os import time import asyncio import random from ircserver.factory import connected_websockets from ircserver.factory import irc_bot as bot import settings msg_queue = asyncio.Queue() messages = [] @bot.on('CLIENT_CONNECT') async def connect(**kwargs): bot.send('NICK', nick=settings.IRC_NICK) bot.send('USER', user=settings.IRC_NICK, realname=settings.IRC_REALNAME) # Don't try to join channels until server sent MOTD done, pending = await asyncio.wait( [bot.wait("RPL_ENDOFMOTD"), bot.wait("ERR_NOMOTD")], loop=bot.loop, return_when=asyncio.FIRST_COMPLETED ) # Cancel whichever waiter's event didn't come in. for future in pending: future.cancel() bot.send('JOIN', channel=settings.IRC_CHANNEL) @bot.on('PING') def keepalive(message, **kwargs): bot.send('PONG', message=message) @bot.on('client_disconnect') def reconnect(**kwargs): from quart import current_app as app app.logger.warning("Lost IRC server connection") time.sleep(3) bot.loop.create_task(bot.connect()) app.logger.warning("Reconnecting to IRC server") @bot.on('PRIVMSG') async def message(nick, target, message, **kwargs): if nick == settings.IRC_NICK: return if target == settings.IRC_NICK: target = nick msg = message now = datetime.now() now = time.mktime(now.timetuple()) data = {"nick": nick, "message": msg, "date": now} for ws in connected_websockets: await ws.put({"data": [data]}) messages.append(data) if len(messages) > 20: messages.pop(0) def start(): bot.loop.create_task(bot.connect())