rollbot.py 2.0 KB

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