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.

37 lines
1.0 KiB

  1. from asyncio import StreamReader, StreamWriter, Queue
  2. from dataclasses import dataclass, field
  3. from logging import log, INFO
  4. from paircd.message import Message
  5. from typing import Set
  6. @dataclass
  7. class Client:
  8. hostname: str
  9. reader: StreamReader
  10. writer: StreamWriter
  11. msg_queue: Queue = field(default_factory=Queue)
  12. nickname: str = ""
  13. username: str = ""
  14. realname: str = ""
  15. registered: bool = False
  16. channels: Set[str] = field(default_factory=set)
  17. def id(self) -> str:
  18. nickname = self.nickname or "<unknown>"
  19. username = self.username or "<unknown>"
  20. return f"{nickname}!{username}@{self.hostname}"
  21. def log(self, msg: str, level: int = INFO) -> None:
  22. log(level, f"{self.hostname} ({self.id()}) {msg}")
  23. async def write_forever(self) -> None:
  24. while True:
  25. msg = await self.msg_queue.get()
  26. self.writer.write(msg)
  27. await self.writer.drain()
  28. def write_message(self, message: Message) -> None:
  29. self.msg_queue.put_nowait(message.encode())