| @@ -21,6 +21,7 @@ | |||||
| # SOFTWARE. | # SOFTWARE. | ||||
| import imp | import imp | ||||
| import os | |||||
| from earwigbot.irc import IRCConnection, RC | from earwigbot.irc import IRCConnection, RC | ||||
| @@ -32,9 +33,9 @@ class Watcher(IRCConnection): | |||||
| The IRC watcher runs on a wiki recent-changes server and listens for | The IRC watcher runs on a wiki recent-changes server and listens for | ||||
| edits. Users cannot interact with this part of the bot. When an event | edits. Users cannot interact with this part of the bot. When an event | ||||
| occurs, we run it through some rules stored in our config, which can result | |||||
| in wiki bot tasks being started or messages being sent to channels on the | |||||
| IRC frontend. | |||||
| occurs, we run it through some rules stored in our working directory under | |||||
| :file:`rules.py`, which can result in wiki bot tasks being started or | |||||
| messages being sent to channels on the IRC frontend. | |||||
| """ | """ | ||||
| def __init__(self, bot): | def __init__(self, bot): | ||||
| @@ -78,31 +79,29 @@ class Watcher(IRCConnection): | |||||
| self.join(chan) | self.join(chan) | ||||
| def _prepare_process_hook(self): | def _prepare_process_hook(self): | ||||
| """Create our RC event process hook from information in config. | |||||
| """Create our RC event process hook from information in rules.py. | |||||
| This will get put in the function self._process_hook, which takes the | This will get put in the function self._process_hook, which takes the | ||||
| Bot object and an RC object and returns a list of frontend channels to | Bot object and an RC object and returns a list of frontend channels to | ||||
| report this event to. | report this event to. | ||||
| """ | """ | ||||
| # Set a default RC process hook that does nothing: | # Set a default RC process hook that does nothing: | ||||
| self._process_hook = lambda rc: () | |||||
| try: | |||||
| rules = self.bot.config.data["rules"] | |||||
| except KeyError: | |||||
| return | |||||
| module = imp.new_module("_rc_event_processing_rules") | |||||
| path = self.bot.config.path | |||||
| self._process_hook = lambda bot, rc: () | |||||
| path = os.path.join(self.bot.config.root_dir, "rules.py") | |||||
| f, path, desc = imp.find_module("rules", [path]) | |||||
| try: | try: | ||||
| exec compile(rules, path, "exec") in module.__dict__ | |||||
| module = imp.load_module(name, f, path, desc) | |||||
| except Exception: | except Exception: | ||||
| e = "Could not compile config file's RC event rules:" | |||||
| self.logger.exception(e) | |||||
| return | return | ||||
| finally: | |||||
| f.close() | |||||
| self._process_hook_module = module | self._process_hook_module = module | ||||
| try: | try: | ||||
| self._process_hook = module.process | self._process_hook = module.process | ||||
| except AttributeError: | except AttributeError: | ||||
| e = "RC event rules compiled correctly, but no process(bot, rc) function was found" | |||||
| e = "RC event rules imported correctly, but no process(bot, rc) function was found" | |||||
| self.logger.error(e) | self.logger.error(e) | ||||
| return | return | ||||