python ircd using asyncio
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.

54 lines
1.4 KiB

  1. from asyncio import create_task, run, start_server
  2. from asyncio.streams import StreamReader, StreamWriter
  3. from logging import basicConfig, info, INFO
  4. from os import getenv
  5. from paircd.client import Client
  6. from paircd.handlers import handle_cmd, register_cmd_handlers
  7. from paircd.message import parse_message
  8. from paircd.server import Server
  9. basicConfig(format="%(asctime)s [%(levelname)s] - %(message)s", level=INFO)
  10. async def read_forever(server: Server, client: Client) -> None:
  11. while True:
  12. raw_msg = await client.reader.readuntil(b"\r\n")
  13. msg = parse_message(raw_msg)
  14. await handle_cmd(server, client, msg)
  15. async def serve() -> None:
  16. bind_addr = getenv("BIND_ADDR") or "0.0.0.0"
  17. port = getenv("PORT") or 6667
  18. irc_server = Server()
  19. register_cmd_handlers()
  20. async def register_client(reader: StreamReader, writer: StreamWriter) -> None:
  21. client = Client(
  22. hostname=writer.get_extra_info("peername")[0],
  23. reader=reader,
  24. writer=writer,
  25. )
  26. create_task(read_forever(irc_server, client))
  27. create_task(client.write_forever())
  28. server = await start_server(
  29. register_client,
  30. bind_addr,
  31. port,
  32. reuse_port=True,
  33. )
  34. info(f"Listening on {bind_addr}:{port}")
  35. async with server:
  36. await server.serve_forever()
  37. def main() -> None:
  38. run(serve())
  39. if __name__ == "__main__":
  40. main()