are_you_sure

Untitled

Dec 2nd, 2021
796
311 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import traceback
  2. from telegram import ReplyKeyboardRemove as tg_ReplyKeyboardRemove
  3. from telegram import InlineKeyboardButton as tg_InlineKeyboardButton
  4. from telegram import KeyboardButton as tg_KeyboardButton
  5. from telegram.utils import request as tg_utils_request
  6. from telegram import Update
  7. from telegram import Bot
  8. from telegram.ext import CallbackContext
  9. from config import TG_BOT_TOKEN
  10. from postconfig import loguru_logger
  11. from functools import wraps
  12.  
  13.  
  14. class Bot(Bot):
  15.     def __init__(self, token, request):
  16.         super().__init__(token=token, request=request)
  17.  
  18.     @staticmethod
  19.     def check_limit(limit: int):
  20.         def decorator(function):
  21.             @wraps(function)
  22.             def wrapper(*args, **kwargs):
  23.                 update = args[0]
  24.                 len_text = len(update.message.text) if update.message.text else 0  # "0", not False!
  25.                 if len_text < limit:
  26.                     return function(*args, **kwargs)
  27.                 else:
  28.                     update.message.reply_text(f'Слишком много символов.\n'
  29.                                               f'Допустимое количество символов: {limit}.\n'
  30.                                               f'Вы использовали символов: {len_text}')
  31.  
  32.             return wrapper
  33.  
  34.         return decorator
  35.  
  36.     @staticmethod
  37.     def bot_logger(text: str = '', end: bool = False):
  38.         def decorator(function):
  39.             @loguru_logger.catch
  40.             # @wraps(function)
  41.             def wrapper(*args, **kwargs):
  42.                 update = args[0]
  43.                 try:
  44.                     return function(*args, **kwargs)
  45.                 except Exception as e:
  46.                     update.message.reply_text(text=f'Неизвестная ошибка. {text} Попробуйте повторить попытку позднее')
  47.                     loguru_logger.error(e)
  48.                     loguru_logger.error(traceback.format_exc())
  49.                     return -1 if end else None
  50.  
  51.             return wrapper
  52.  
  53.         return decorator
  54.  
  55.     @staticmethod
  56.     def go_back(update: Update, context: CallbackContext):  # repeat last function
  57.         if context.user_data['user'].last_function:
  58.             update.message.text = ''  # Not None because "lower" and "strip" will be applied
  59.             return context.user_data['user'].last_function(update, context)
  60.         else:
  61.             update.message.reply_text(text='На этом шаге нельзя вернуться назад')
  62.  
  63.     @staticmethod  # Maybe move it to user and inherit from bot?
  64.     def end_conversation(update: Update = None, context: CallbackContext = '') -> int:
  65.         if update:
  66.             update.message.reply_text(text='Галя, неси ключ, у нас отмена! Отменено.',
  67.                                       reply_markup=tg_ReplyKeyboardRemove())
  68.         if 'user' in context.user_data:  # TODO setup me
  69.             del context.user_data['user']
  70.         elif 'TargetUser' in context.user_data:
  71.             del context.user_data['TargetUser']
  72.         elif 'Post' in context.user_data:
  73.             del context.user_data['Post']
  74.         return -1
  75.  
  76.     @staticmethod
  77.     def get_original_list_from_keyboard(keyboard: list[list[tg_KeyboardButton]]) -> list[list[str]]:
  78.         result = empty_keyboard = []
  79.         for row_buttons in keyboard:
  80.             empty_row = []
  81.             empty_keyboard.append(empty_row)
  82.             for row_button in row_buttons:
  83.                 empty_row.append(row_button.text)
  84.         return result
  85.  
  86.     @staticmethod
  87.     def get_keyboard_button_by(keyboard: list[list[tg_InlineKeyboardButton]], pattern: str, by: str) -> dict:
  88.         """
  89.        return only first occurrence.
  90.        """
  91.         for x, row_buttons in enumerate(keyboard):  # Iterate over keyboard rows
  92.             for y, row_button in enumerate(row_buttons):  # Iterate over buttons of row
  93.                 if getattr(row_button, by) == pattern:
  94.                     return {'row': x, 'column': y, 'button': row_button}
  95.  
  96.     def get_keyboard_button_by_callback_data(self,
  97.                                              keyboard: list[list[tg_InlineKeyboardButton]],
  98.                                              button_callback_data: str) -> dict:
  99.         return self.get_keyboard_button_by(keyboard=keyboard, pattern=button_callback_data, by='callback_data')
  100.  
  101.  
  102. # TODO move initialization back to main
  103. bot = Bot(token=TG_BOT_TOKEN, request=tg_utils_request.Request(connect_timeout=3, read_timeout=3, con_pool_size=16))
  104.  
RAW Paste Data