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.
 

35 lines
1.3 KiB

from dataclasses import dataclass, field
from datetime import datetime
from typing import Dict, Optional
from paircd.client import Client
from paircd.channel import Channel
@dataclass
class Server:
clients_by_nick: Dict[str, Client] = field(default_factory=dict)
channels_by_name: Dict[str, Channel] = field(default_factory=dict)
create_time: datetime = field(default_factory=datetime.utcnow)
def add_client(self, client: Client) -> None:
self.clients_by_nick[client.nickname] = client
def get_channel_by_name(self, name: str) -> Channel:
if name not in self.channels_by_name:
self.channels_by_name[name] = Channel(name=name)
return self.channels_by_name[name]
def get_client_by_name(self, name: str) -> Optional[Client]:
return self.clients_by_nick.get(name)
def remove_client_by_name(self, name: str) -> None:
del self.clients_by_nick[name]
def rename_client(self, name: str, new_name: str) -> None:
if name not in self.clients_by_nick:
raise KeyError(f"No client on server with nick {name}")
if new_name in self.clients_by_nick:
raise KeyError(f"Client already exists with nick {new_name}")
self.clients_by_nick[new_name] = self.clients_by_nick[name]
del self.clients_by_nick[name]