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.
 

62 lines
1.7 KiB

import asyncio
from asyncio.streams import StreamReader, StreamWriter
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() -> None:
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: 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()
if __name__ == "__main__":
asyncio.run(main())