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.

31 lines
989 B

  1. from asyncio import Queue
  2. from dataclasses import dataclass, field
  3. from typing import Dict
  4. from paircd.client import Client
  5. from paircd.message import Message
  6. @dataclass
  7. class Channel:
  8. name: str
  9. clients_by_nick: Dict[str, Client] = field(default_factory=dict)
  10. msg_queue: Queue = field(default_factory=Queue)
  11. def add_client(self, client: Client) -> None:
  12. self.clients_by_nick[client.nickname] = client
  13. def remove_client_by_nick(self, nick: str) -> None:
  14. del self.clients_by_nick[nick]
  15. async def process(self) -> None:
  16. while True:
  17. msg = await self.msg_queue.get()
  18. for client in self.clients_by_nick.values():
  19. # Don't broadcast client's messages back to themselves
  20. if msg.cmd == "PRIVMSG" and msg.prefix == client.id():
  21. continue
  22. client.write_message(msg)
  23. def write_message(self, msg: Message) -> None:
  24. self.msg_queue.put_nowait(msg)