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
980 B

from asyncio import StreamReader, StreamWriter, Queue
from dataclasses import dataclass, field
from logging import log, INFO
from paircd.message import Message
from typing import Set
@dataclass
class Client:
hostname: str
reader: StreamReader
writer: StreamWriter
msg_queue: Queue = field(default_factory=Queue)
nickname: str = ""
username: str = ""
realname: str = ""
registered: bool = False
channels: Set[str] = field(default_factory=set)
def id(self) -> str:
return f"{self.nickname}!{self.username}@{self.hostname}"
def log(self, msg: str, level: int = INFO) -> None:
log(level, f"{self.hostname} ({self.id()}) {msg}")
async def write_forever(self) -> None:
while True:
msg = await self.msg_queue.get()
self.writer.write(msg)
await self.writer.drain()
def write_message(self, message: Message) -> None:
self.msg_queue.put_nowait(message.encode())