from asyncio import StreamReader, StreamWriter, Queue from dataclasses import dataclass, field from typing import Any, 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: return f"{self.nickname}!{self.username}@{self.hostname}" async def write_forever(self) -> None: while True: msg = await self.msg_queue.get() self.writer.write(msg) await self.writer.drain()