128 lines
2.3 KiB
Python
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)
|