from asyncio import Queue from dataclasses import dataclass, field from typing import Dict, List from paircd.client import Client from paircd.message import Message @dataclass class Channel: name: str clients_by_nick: Dict[str, Client] = field(default_factory=dict) msg_queue: Queue = field(default_factory=Queue) def add_client(self, client: Client) -> None: self.clients_by_nick[client.nickname] = client def remove_client_by_nick(self, nick: str) -> None: del self.clients_by_nick[nick] async def process(self) -> None: while True: msg = await self.msg_queue.get() for client in self.clients_by_nick.values(): # Don't broadcast client's messages back to themselves if msg.cmd == "PRIVMSG" and msg.prefix == client.id(): continue client.write_message(msg) def write_message(self, msg: Message) -> None: self.msg_queue.put_nowait(msg) def get_modes(self) -> List[str]: return []