diff --git a/lib/tfw/components/directory_monitor.py b/lib/tfw/components/directory_monitor.py index 1493133..fef9759 100644 --- a/lib/tfw/components/directory_monitor.py +++ b/lib/tfw/components/directory_monitor.py @@ -3,6 +3,7 @@ from watchdog.events import FileSystemEventHandler from tfw.networking.event_handlers.server_connector import ServerUplinkConnector from tfw.components.decorators import RateLimiter +from tfw.event_handler_base import TriggerlessEventHandler from tfw.config.logs import logging log = logging.getLogger(__name__) @@ -65,3 +66,47 @@ class DirectoryMonitor: self.directorymonitor.pause() def __exit__(self, exc_type, exc_val, exc_tb): self.directorymonitor.resume() + + +class DirectoryMonitoringEventHandler(TriggerlessEventHandler): + def __init__(self, key, directory): + super().__init__(key) + self._directory = directory + self._monitor = None + self.reload_monitor() + self.commands = {'pause': self.pause, + 'resume': self.resume, + 'ignore': self.ignore} + + @property + def monitor(self): + return self._monitor + + def reload_monitor(self): + if self._monitor: + try: self._monitor.stop() + except KeyError: logging.debug('Working directory was removed – ignoring...') + self._monitor = DirectoryMonitor(self._directory) + self._monitor.watch() # This runs on a separate thread + + def handle_event(self, key, message): + try: + message['data'] = self.commands[message['data']['command']](message['data']) + return message + except KeyError: + log.error('IGNORING MESSAGE: Invalid message received: {}'.format(message)) + + def pause(self, data): + self.monitor.pause() + return data + + def resume(self, data): + self.monitor.resume() + return data + + def ignore(self, data): + self.monitor.ignore += data['ignore'] + return data + + def cleanup(self): + self.monitor.stop()