70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
import json
|
|
import os
|
|
import time
|
|
import sys
|
|
|
|
from watchdog.observers import Observer
|
|
from watchdog.tricks import Trick
|
|
|
|
|
|
class Config(dict):
|
|
def __init__(self, bot, *args, **kwargs):
|
|
self.filename = "config.json"
|
|
self.path = os.path.abspath(self.filename)
|
|
self.bot = bot
|
|
self.logger = bot.logger
|
|
self.update(*args, **kwargs)
|
|
|
|
# populate self with config data
|
|
self.load_config()
|
|
|
|
# start watcher
|
|
self.watcher()
|
|
|
|
def load_config(self):
|
|
"""(re)loads the bot config from the config file"""
|
|
if not os.path.exists(self.path):
|
|
# if there is no config, show an error and die
|
|
self.logger.critical("No config file found, bot shutting down!")
|
|
print "No config file found! Bot shutting down in five seconds."
|
|
print "Copy 'config.default' to 'config.json' for defaults."
|
|
print "For help, see http://git.io/cloudbotirc. Thank you for using CloudBot!"
|
|
time.sleep(5)
|
|
sys.exit()
|
|
|
|
with open(self.path) as f:
|
|
self.update(json.load(f))
|
|
self.logger.info("Config loaded from file.")
|
|
|
|
# reload permissions
|
|
if self.bot.connections:
|
|
for conn in self.bot.connections:
|
|
conn.permissions.reload()
|
|
|
|
|
|
def save_config(self):
|
|
"""saves the contents of the config dict to the config file"""
|
|
json.dump(self, open(self.path, 'w'), sort_keys=True, indent=2)
|
|
self.logger.info("Config saved to file.")
|
|
|
|
|
|
def watcher(self):
|
|
"""starts the watchdog to automatically reload the config when it changes on disk"""
|
|
self.observer = Observer()
|
|
|
|
pattern = "*{}".format(self.filename)
|
|
|
|
self.event_handler = ConfigEventHandler(self, patterns=[pattern])
|
|
self.observer.schedule(self.event_handler, path='.', recursive=False)
|
|
self.observer.start()
|
|
|
|
|
|
class ConfigEventHandler(Trick):
|
|
def __init__(self, config, *args, **kwargs):
|
|
self.config = config
|
|
self.logger = config.logger
|
|
Trick.__init__(self, *args, **kwargs)
|
|
|
|
def on_any_event(self, event):
|
|
self.logger.info("Config changed, triggering reload.")
|
|
self.config.load_config()
|