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

from asyncio import create_task, run, start_server
from asyncio.streams import StreamReader, StreamWriter
from logging import basicConfig, info, INFO
from os import getenv
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
basicConfig(format="%(asctime)s [%(levelname)s] - %(message)s", level=INFO)
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 = getenv("BIND_ADDR") or "0.0.0.0"
port = 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,
)
create_task(read_forever(irc_server, client))
create_task(client.write_forever())
server = await start_server(
register_client,
bind_addr,
port,
reuse_port=True,
)
info(f"Listening on {bind_addr}:{port}")
async with server:
await server.serve_forever()
def main() -> None:
run(serve())
if __name__ == "__main__":
main()