rollbot.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import importlib
  2. import db
  3. from config import PLUGINS, ALIASES, RESPONSES, BOTS_LOOKUP
  4. from command_system import RollbotResponse, RollbotFailure
  5. class Rollbot:
  6. def __init__(self, logger):
  7. self.logger = logger
  8. self.commands = {}
  9. self.logger.info("Loading command plugins")
  10. for module, classes in PLUGINS.items():
  11. plugin_module = importlib.import_module("plugins." + module)
  12. for class_name in classes:
  13. plugin_class = getattr(plugin_module, class_name)
  14. plugin_instance = plugin_class(logger)
  15. self.commands[plugin_instance.command] = plugin_instance
  16. self.logger.info(f"Finished loading plugins, {len(self.commands)} commands found")
  17. self.logger.info("Initializing database tables")
  18. db.init_db()
  19. self.logger.info("Finished initializing database")
  20. def start_plugins(self):
  21. self.logger.info("Starting all plugins")
  22. with db.session_scope() as session:
  23. for plugin_instance in self.commands.values():
  24. plugin_instance.on_start(session)
  25. self.logger.info("Finished starting plugins")
  26. def shutdown_plugins(self):
  27. self.logger.info("Shutting down all plugins")
  28. with db.session_scope() as session:
  29. for plugin_instance in self.commands.values():
  30. plugin_instance.on_shutdown(session)
  31. self.logger.info("Finished shutting down plugins")
  32. def run_command(self, message):
  33. if not message.is_command:
  34. self.logger.warn(f"Tried to run non-command message {message.message_id}")
  35. return
  36. # if this command is aliased, resolve that first, otherwise use the literal command
  37. cmd = ALIASES.get(message.command, message.command)
  38. if cmd in RESPONSES:
  39. return RollbotResponse(message, txt=RESPONSES[cmd])
  40. plugin = self.commands.get(cmd, None)
  41. if plugin is None:
  42. self.logger.warn(f"Message {message.message_id} had a command {message.command} (resolved to {cmd}) that could not be run.")
  43. return RollbotResponse(message, failure=RollbotFailure.INVALID_COMMAND)
  44. with db.session_scope() as session:
  45. response = plugin.on_command(session, message)
  46. if not response.is_success:
  47. self.logger.warn(f"Message {message.message_id} caused failure")
  48. self.logger.warn(response.info)
  49. return response