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.
 

36 lines
1.2 KiB

from collections import defaultdict
from dataclasses import dataclass, field
from typing import Dict, Set
from paircd.client import Client
from paircd.message import Message
@dataclass
class Channel:
name: str
topic: str = ""
clients_by_nick: Dict[str, Client] = field(default_factory=dict)
modes_by_nick: Dict[str, Set[str]] = field(default_factory=lambda: defaultdict(set))
def add_client(self, client: Client) -> None:
self.clients_by_nick[client.nickname] = client
if len(self.clients_by_nick) == 1:
self.modes_by_nick[client.nickname].add("@")
def remove_client_by_nick(self, nick: str) -> None:
del self.clients_by_nick[nick]
del self.modes_by_nick[nick]
def write_message(self, msg: Message) -> None:
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 get_modes(self) -> Set[str]:
return set()
def get_user_modes_by_nick(self, nick: str) -> Set[str]:
return self.modes_by_nick[nick]