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 []
|