58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
import threading
|
|
import logging
|
|
from pathlib import Path
|
|
from watchdog.observers import Observer
|
|
from watchdog.events import FileSystemEventHandler
|
|
|
|
from tool_loader import load_tools
|
|
from bot_loader import load_bots
|
|
|
|
class ReloadableRegistry:
|
|
def __init__(self, base_dir):
|
|
self.base_dir = Path(base_dir)
|
|
self.lock = threading.Lock()
|
|
|
|
self.tools = {}
|
|
self.bots = {}
|
|
|
|
self.reload_all()
|
|
|
|
def reload_all(self):
|
|
with self.lock:
|
|
logging.info("Reloading bots and tools...")
|
|
self.tools = load_tools(self.base_dir / "tools")
|
|
self.bots = load_bots(self.base_dir / "bots")
|
|
|
|
def get_tools(self):
|
|
with self.lock:
|
|
return self.tools.copy()
|
|
|
|
def get_bots(self):
|
|
with self.lock:
|
|
return self.bots.copy()
|
|
|
|
|
|
class ReloadHandler(FileSystemEventHandler):
|
|
def __init__(self, registry):
|
|
self.registry = registry
|
|
|
|
def on_any_event(self, event):
|
|
if event.is_directory:
|
|
return
|
|
if event.src_path.endswith(".py"):
|
|
logging.info(f"Detected change: {event.src_path}")
|
|
self.registry.reload_all()
|
|
|
|
|
|
def start_hot_reload(registry):
|
|
observer = Observer()
|
|
handler = ReloadHandler(registry)
|
|
|
|
observer.schedule(handler, str(registry.base_dir / "tools"), recursive=True)
|
|
observer.schedule(handler, str(registry.base_dir / "bots"), recursive=True)
|
|
|
|
observer.daemon = True
|
|
observer.start()
|
|
|
|
logging.info("🔥 Hot reload enabled (tools + bots)")
|