|
|
- 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 "<unknown>"
- username = self.username or "<unknown>"
- 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())
|