diff --git a/davtelepot/bot.py b/davtelepot/bot.py index 5bedad2..f24549d 100644 --- a/davtelepot/bot.py +++ b/davtelepot/bot.py @@ -32,6 +32,7 @@ class Bot(TelegramBot): final_state = 0 _maintenance_message = ("I am currently under maintenance!\n" "Please retry later...") + _authorization_denied_message = None def __init__( self, token, hostname='', certificate=None, max_connections=40, @@ -110,6 +111,10 @@ class Bot(TelegramBot): self._under_maintenance = False self._allowed_during_maintenance = [] self._maintenance_message = None + # Message to be returned if user is not allowed to call method + self._authorization_denied_message = None + # Default authorization function (always return True) + self.authorization_function = lambda update, authorization_level: True return @property @@ -221,6 +226,16 @@ class Bot(TelegramBot): return ("I am currently under maintenance!\n" "Please retry later...") + @property + def authorization_denied_message(self): + """Return this text if user is unauthorized to make a request. + + If instance message is not set, class message is returned. + """ + if self._authorization_denied_message: + return self._authorization_denied_message + return self.__class__._authorization_denied_message + async def message_router(self, update): """Route Telegram `message` update to appropriate message handler.""" for key, value in update.items(): @@ -623,6 +638,31 @@ class Bot(TelegramBot): ) return + @classmethod + def set_class_authorization_denied_message(csl, message): + """Set class authorization denied message. + + It will be returned if user is unauthorized to make a request. + """ + csl._authorization_denied_message = message + + def set_authorization_denied_message(self, message): + """Set instance authorization denied message. + + If instance message is None, default class message is used. + """ + self._authorization_denied_message = message + + def set_authorization_function(self, authorization_function): + """Set a custom authorization_function. + + It should evaluate True if user is authorized to perform a specific + action and False otherwise. + It should take update and role and return a Boolean. + Default authorization_function always evaluates True. + """ + self.authorization_function = authorization_function + async def webhook_feeder(self, request): """Handle incoming HTTP `request`s.