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.
 

58 lines
1.4 KiB

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