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

  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. return f"{self.nickname}!{self.username}@{self.hostname}"
  19. def log(self, msg: str, level: int = INFO) -> None:
  20. log(level, f"{self.hostname} ({self.id()}) {msg}")
  21. async def write_forever(self) -> None:
  22. while True:
  23. msg = await self.msg_queue.get()
  24. self.writer.write(msg)
  25. await self.writer.drain()
  26. def write_message(self, message: Message) -> None:
  27. self.msg_queue.put_nowait(message.encode())