python ircd using asyncio
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

34 lines
1.0 KiB

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