import asyncio import logging import os from paircd.client import Client from paircd.handle import handle_cmd, register_cmd_handler from paircd.handler.join import handle_join from paircd.handler.nick import handle_nick from paircd.handler.privmsg import handle_privmsg from paircd.handler.user import handle_user from paircd.message import parse_message from paircd.server import Server logging.basicConfig( format="%(asctime)s [%(levelname)s] - %(message)s", level=logging.INFO ) logger = logging.getLogger() async def read_forever(server: Server, client: Client) -> None: while True: raw_msg = await client.reader.readuntil(b"\r\n") msg = parse_message(raw_msg) await handle_cmd(server, client, msg) async def main(): bind_addr = os.getenv("BIND_ADDR") or "0.0.0.0" port = os.getenv("PORT") or 6667 register_cmd_handler("JOIN", 1, handle_join) register_cmd_handler("NICK", 1, handle_nick) register_cmd_handler("PRIVMSG", 2, handle_privmsg) register_cmd_handler("USER", 4, handle_user) irc_server = Server() async def register_client(reader, writer): client = Client( hostname=writer.get_extra_info("peername")[0], reader=reader, writer=writer, ) asyncio.create_task(read_forever(irc_server, client)) asyncio.create_task(client.write_forever()) server = await asyncio.start_server( register_client, bind_addr, port, reuse_port=True, ) logger.info(f"Listening on {bind_addr}:{port}...") async with server: await server.serve_forever() if __name__ == "__main__": asyncio.run(main())