|
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, create: bool = True) -> Optional[Channel]:
|
|
if name not in self.channels_by_name and create:
|
|
self.channels_by_name[name] = Channel(name=name)
|
|
return self.channels_by_name.get(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]
|