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