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