requires.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from functools import wraps
  2. from ...messaging import RollbotResponse, RollbotFailure
  3. def require_min_args(n, alert_response=None):
  4. def decorator(cls):
  5. old_on_command = cls.on_command
  6. @wraps(old_on_command)
  7. def wrapper(self, db, message):
  8. if message.raw_args is None or len(message.arg_list()) < n:
  9. failure = RollbotFailure.INVALID_ARGUMENTS.with_reason(alert_response or f"{self.command.title()} requires at least {n} argument(s)")
  10. return RollbotResponse(message, failure=failure, debugging=failure.get_debugging())
  11. return old_on_command(self, db, message)
  12. setattr(cls, "on_command", wrapper)
  13. return cls
  14. return decorator
  15. # TODO refactor to share code?
  16. def require_args(n, alert_response=None):
  17. def decorator(cls):
  18. old_on_command = cls.on_command
  19. @wraps(old_on_command)
  20. def wrapper(self, db, message):
  21. if message.raw_args is None or len(message.arg_list()) != n:
  22. failure = RollbotFailure.INVALID_ARGUMENTS.with_reason(alert_response or f"{self.command.title()} requires exactly {n} argument(s)")
  23. return RollbotResponse(message, failure=failure, debugging=failure.get_debugging())
  24. return old_on_command(self, db, message)
  25. setattr(cls, "on_command", wrapper)
  26. return cls
  27. return decorator
  28. def require_admin(cls):
  29. old_on_command = cls.on_command
  30. @wraps(old_on_command)
  31. def wrapper(self, db, message):
  32. if not message.from_admin:
  33. return RollbotResponse(message, failure=RollbotFailure.PERMISSIONS)
  34. return old_on_command(self, db, message)
  35. setattr(cls, "on_command", wrapper)
  36. return cls