from asyncio import StreamReader, StreamWriter, Queue from dataclasses import dataclass, field from logging import log, INFO from paircd.message import Message from typing import Set @dataclass class Client: hostname: str reader: StreamReader writer: StreamWriter msg_queue: Queue = field(default_factory=Queue) nickname: str = "" username: str = "" realname: str = "" registered: bool = False channels: Set[str] = field(default_factory=set) def id(self) -> str: nickname = self.nickname or "" username = self.username or "" return f"{nickname}!{username}@{self.hostname}" def log(self, msg: str, level: int = INFO) -> None: log(level, f"{self.hostname} ({self.id()}) {msg}") async def write_forever(self) -> None: while True: msg = await self.msg_queue.get() self.writer.write(msg) await self.writer.drain() def write_message(self, message: Message) -> None: self.msg_queue.put_nowait(message.encode())