channel.py 871 B

12345678910111213141516171819202122232425262728293031323334
  1. from typing import Dict
  2. from websockets import WebSocketServerProtocol
  3. class Subscriber:
  4. player_enabled = False
  5. ws: WebSocketServerProtocol
  6. def __init__(self, ws):
  7. self.ws = ws
  8. class Channel:
  9. subscribers: Dict[WebSocketServerProtocol, Subscriber]
  10. def __init__(self):
  11. self.subscribers = dict()
  12. def subscribe(self, ws: WebSocketServerProtocol):
  13. self.subscribers[ws] = (Subscriber(ws))
  14. def unsubscribe(self, ws: WebSocketServerProtocol):
  15. self.subscribers.pop(ws)
  16. def get_player_enabled_subscribers(self):
  17. return filter(lambda s: s.player_enabled, self.subscribers.values())
  18. async def send(self, message):
  19. for sub in list(self.subscribers.values()):
  20. if sub.ws.open:
  21. await sub.ws.send(message)
  22. else:
  23. self.unsubscribe(sub.ws)