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.
 

31 lines
989 B

from asyncio import Queue
from dataclasses import dataclass, field
from typing import Dict
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)