import asyncio from asyncio.streams import StreamReader, StreamWriter import logging import os from paircd.client import Client from paircd.handlers import handle_cmd, register_cmd_handlers 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 serve() -> None: bind_addr = os.getenv("BIND_ADDR") or "0.0.0.0" port = os.getenv("PORT") or 6667 irc_server = Server() register_cmd_handlers() async def register_client(reader: StreamReader, writer: StreamWriter) -> None: 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() def main() -> None: asyncio.run(serve()) if __name__ == "__main__": main()