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.

34 lines
1.0 KiB

  1. from asyncio import Queue
  2. from dataclasses import dataclass, field
  3. from typing import Dict, List
  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)
  25. def get_modes(self) -> List[str]:
  26. return []