routes.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import websockets
  2. import json
  3. from storage import Storage
  4. class Routes():
  5. __connections = set()
  6. __storages = {}
  7. def __init__(self):
  8. self.__commands = {
  9. "add": self._add_entity,
  10. "get": self._get_entity,
  11. "mod": self._mod_entity,
  12. "del": self._del_entity,
  13. "describe": self._describe
  14. }
  15. def __storage(self, name):
  16. if not name in self.__storages:
  17. self.__storages[name] = Storage(name)
  18. return self.__storages[name]
  19. def __get_entity(self, event):
  20. return event.get("entity", None)
  21. def __get_data(self, event):
  22. return event.get("data", {})
  23. def __get_event(self, name, event, data):
  24. return { "entity": name, "event": event, "data": data }
  25. async def _add_entity(self, websocket, event):
  26. name = self.__get_entity(event)
  27. data = self.__get_data(event)
  28. if name and data:
  29. self.__storage(name).create(data)
  30. await self._broadcast(websocket, self.__get_event(name, "created", data))
  31. async def _get_entity(self, websocket, event):
  32. name = self.__get_entity(event)
  33. ts = self.__get_data(event).get("ts", 0)
  34. data = self.__storage(name).read(ts)
  35. await websocket.send(json.dumps(self.__get_event(name, "received", data )))
  36. async def _mod_entity(self, websocket, event):
  37. name = self.__get_entity(event)
  38. data = self.__get_data(event)
  39. if name and data:
  40. self.__storage(name).update(data)
  41. await self._broadcast(websocket, self.__get_event(name, "modified", data))
  42. async def _del_entity(self, websocket, event):
  43. name = self.__get_entity(event)
  44. entity_id = self.__get_data(event).get("id", None)
  45. if self.__storage(name).delete(entity_id):
  46. await self._broadcast(websocket, self.__get_event(name, "deleted", entity_id ))
  47. async def _describe(self, websocket, event):
  48. data = {}
  49. for connection in self.__connections:
  50. user_id = connection.user["id"]
  51. data[user_id] = data[user_id] + 1 if user_id in data else 1
  52. await websocket.send(json.dumps(self.__get_event("connections", "described", data)))
  53. async def _broadcast(self, _, event):
  54. websockets.broadcast(self.__connections, json.dumps(event))
  55. async def add_connection(self, connection):
  56. self.__connections.add(connection)
  57. await self._broadcast(connection, self.__get_event("users", "connected", connection.user))
  58. async def remove_connection(self, connection):
  59. self.__connections.remove(connection)
  60. await self._broadcast(connection, self.__get_event("users", "disconnected", connection.user))
  61. async def call(self, command, websocket, event):
  62. handler = self.__commands.get(command, self._broadcast)
  63. await handler(websocket, event)
  64. def users(self):
  65. return self.__storage("users").read()