from tfw.networking.serialization import deserialize_all from tfw.networking.event_handlers.server_connector import ServerConnector class EventHandlerBase: def __init__(self, key): self.server_connector = ServerConnector() self.key = key self.subscriptions = set() self.subscribe(self.key) self.subscribe('reset') self.server_connector.register_callback(self.event_handler_callback) def event_handler_callback(self, msg_parts): key, message = deserialize_all(*msg_parts) response = self.dispatch_handling(key, message) if response is None: return self.server_connector.send(key, response) def dispatch_handling(self, key, message): raise NotImplementedError def _dispatch_handling(self, key, message): if key != 'reset': return self.handle_event(key, message) else: return self.handle_reset(message) def handle_event(self, key, message): raise NotImplementedError def handle_reset(self, message): return None def cleanup(self): pass def message_other(self, key, data): message = { 'key': key, 'data': data } self.server_connector.send(key, message) def subscribe(self, key): if key not in self.subscriptions: self.subscriptions.add(key) self.server_connector.subscribe(key) def unsubscribe(self, key): try: self.subscriptions.remove(key) self.server_connector.unsubscribe(key) except KeyError: pass def unsubscribe_all(self): for sub in self.subscriptions: self.server_connector.unsubscribe(key=sub) self.subscriptions.clear() class TriggerlessEventHandler(EventHandlerBase): def dispatch_handling(self, key, message): return self._dispatch_handling(key, message) class TriggeredEventHandler(EventHandlerBase): def __init__(self, key, trigger): super().__init__(key) self.trigger = trigger def dispatch_handling(self, key, message): if message.get('trigger') == self.trigger: return self._dispatch_handling(key, message)