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