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.

61 lines
1.6 KiB

  1. import asyncio
  2. import logging
  3. import os
  4. from paircd.client import Client
  5. from paircd.handle import handle_cmd, register_cmd_handler
  6. from paircd.handler.join import handle_join
  7. from paircd.handler.nick import handle_nick
  8. from paircd.handler.privmsg import handle_privmsg
  9. from paircd.handler.user import handle_user
  10. from paircd.message import parse_message
  11. from paircd.server import Server
  12. logging.basicConfig(
  13. format="%(asctime)s [%(levelname)s] - %(message)s", level=logging.INFO
  14. )
  15. logger = logging.getLogger()
  16. async def read_forever(server: Server, client: Client) -> None:
  17. while True:
  18. raw_msg = await client.reader.readuntil(b"\r\n")
  19. msg = parse_message(raw_msg)
  20. await handle_cmd(server, client, msg)
  21. async def main():
  22. bind_addr = os.getenv("BIND_ADDR") or "0.0.0.0"
  23. port = os.getenv("PORT") or 6667
  24. register_cmd_handler("JOIN", 1, handle_join)
  25. register_cmd_handler("NICK", 1, handle_nick)
  26. register_cmd_handler("PRIVMSG", 2, handle_privmsg)
  27. register_cmd_handler("USER", 4, handle_user)
  28. irc_server = Server()
  29. async def register_client(reader, writer):
  30. client = Client(
  31. hostname=writer.get_extra_info("peername")[0],
  32. reader=reader,
  33. writer=writer,
  34. )
  35. asyncio.create_task(read_forever(irc_server, client))
  36. asyncio.create_task(client.write_forever())
  37. server = await asyncio.start_server(
  38. register_client,
  39. bind_addr,
  40. port,
  41. reuse_port=True,
  42. )
  43. logger.info(f"Listening on {bind_addr}:{port}...")
  44. async with server:
  45. await server.serve_forever()
  46. if __name__ == "__main__":
  47. asyncio.run(main())