import importlib import db from config import PLUGINS, ALIASES, RESPONSES, BOTS_LOOKUP from command_system import RollbotResponse, RollbotFailure 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 # if this command is aliased, resolve that first, otherwise use the literal command cmd = ALIASES.get(message.command, message.command) if cmd in RESPONSES: return RollbotResponse(message, txt=RESPONSES[cmd]) plugin = self.commands.get(cmd, None) if plugin is None: self.logger.warn(f"Message {message.message_id} had a command {message.command} (resolved to {cmd}) that could not be run.") return RollbotResponse(message, failure=RollbotFailure.INVALID_COMMAND) 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