import importlib import db from config import PLUGINS, BOTS_LOOKUP class Rollbot: def __init__(self, logger): self.logger = logger self.commands = {} self.logger.info("Loading command plugins") for module, classes in PLUGINS.items(): plugin_module = importlib.import_module("plugins." + module) for class_name in classes: plugin_class = getattr(plugin_module, class_name) plugin_instance = plugin_class(logger) self.commands[plugin_instance.command] = plugin_instance self.logger.info(f"Finished loading plugins, {len(self.commands)} commands found") self.logger.info("Initializing database tables") db.init_db() self.logger.info("Finished initializing database") def start_plugins(self): self.logger.info("Starting all plugins") with db.session_scope() as session: for plugin_instance in self.commands.values(): plugin_instance.on_start(session) self.logger.info("Finished starting plugins") def shutdown_plugins(self): self.logger.info("Shutting down all plugins") with db.session_scope() as session: for plugin_instance in self.commands.values(): plugin_instance.on_shutdown(session) self.logger.info("Finished shutting down plugins") def run_command(self, message): if not message.is_command: self.logger.warn(f"Tried to run non-command message {message.message_id}") return plugin = self.commands.get(message.command, None) if plugin is None: response = RollbotResponse(message, failure_reason=RollbotFailure.INVALID_COMMAND) else: with db.session_scope() as session: response = plugin.on_command(session, message) if not response.is_success: self.logger.warn(f"Message {message.message_id} caused failure") self.logger.warn(response.info) return response