1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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
|