bl2tools/bl2tools/watcher.py
2022-04-23 16:27:48 -04:00

128 lines
2.3 KiB
Python

import os
import shlex
import subprocess
import time
from bl2_save_edit import Bl2Save
from datetime import datetime
from izzylib import Path, logging
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer
class SaveWatcher(Observer):
def __init__(self, server):
Observer.__init__(self)
self.server = server
self.schedule(SaveHandler(server), self.server.save_path, recursive=False)
self._running = False
def __enter__(self):
self.start()
def __exit__(self, *args):
self.stop()
def start(self):
if self._running:
return
logging.info('Starting save watcher')
Observer.start(self)
self._running = True
def stop(self):
if not self._running:
return
logging.info('Stopping save watcher')
Observer.stop(self)
self.join()
self._running = False
class SaveHandler(FileSystemEventHandler):
#patterns = [f'*.{ext}' for ext in config.watch_ext]
proc = None
last_restart = None
def __init__(self, server):
super().__init__()
self.server = server
self.modified_times = dict()
for save in self.server.saves:
self.modified_times[save.path.name] = save.last_save
def on_any_event(self, event):
if event.event_type not in ['modified', 'created', 'deleted', 'moved']:
logging.debug(f'Ignored event: {event.event_type}')
return
src = Path(event.src_path)
try:
dest = Path(event.dest_path) if event.dest_path else None
except:
dest = None
if not src.suffix == 'sav' or (dest and not dest.suffix == 'sav'):
return
try:
save = self.server.get_save_by_filename(src.name)
if dest:
save.path = dest
except KeyError:
save = None
self.handle_save_change(save, src, dest, event.event_type)
def handle_save_change(self, save, src, dest, event):
if event == 'modified':
if not save:
return
try:
if self.modified_times[save.path.name] == save.last_save:
return
except KeyError:
self.modified_times[save.path.name] = save.last_save
return
elif event == 'created':
save = Bl2Save(src)
self.server.saves.append(save)
self.modified_times[save.path.name] = save.last_save
return
elif event == 'deleted':
if not save:
return
try:
del self.modified_times[save.path.name]
except KeyError:
pass
self.server.saves.remove(save)
return
print(event, save)