diff --git a/helper_bot/helper_bot.py b/helper_bot/helper_bot.py index 5753dec..0232f14 100644 --- a/helper_bot/helper_bot.py +++ b/helper_bot/helper_bot.py @@ -7,12 +7,15 @@ from time import sleep import telebot from telebot import types from telebot.apihelper import ApiTelegramException +from telebot.types import InputMediaPhoto + import messages from logs.custom_logger import Logger #Инициализируем логгер bot_logger = Logger(name='bot') + class State(Enum): START = "START" SUGGEST = "SUGGEST" @@ -84,7 +87,7 @@ class TelegramHelperBot: self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) отправил непонятное сообщение: {message.text}') if self.state == State.SUGGEST: - self.bot.register_next_step_handler(message, self.send_to_suggest) + self.bot.register_next_step_handler(message, self.suggest_router) self.state = State.START if message.text == '/start': self.state = State.START @@ -480,11 +483,9 @@ class TelegramHelperBot: self.bot.send_message(chat_id=self.IMPORTANT_LOGS, text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - def send_to_suggest(self, message): - markup = types.InlineKeyboardMarkup(row_width=1) - item1 = types.InlineKeyboardButton("Опубликовать", callback_data='publish') - item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline') - markup.add(item1, item2) + #TODO: deprecated + def send_to_suggest_2(self, message): + markup = self._get_reply_keyboard_for_post() try: if message.content_type == 'text': post_text = message.text.lower() @@ -549,6 +550,113 @@ class TelegramHelperBot: self.bot.send_message(message.chat.id, success_send_message, parse_mode='html', disable_web_page_preview=not self.PREVIEW_LINK, reply_markup=markup_for_user) + def suggest_router(self, message): + try: + if message.content_type == 'text': + lower_text = message.text.lower() + post_text, is_anonymous = self._get_text_message(lower_text, message.from_user.full_name, message.from_user.id) + if is_anonymous: + self._send_text_message(post_text) + else: + self._send_text_message(post_text) + elif message.content_type == 'photo' and message.media_group_id is None: + lower_caption = message.caption.lower() + post_caption, is_anonymous = self._get_text_message(lower_caption, message.from_user.full_name, message.from_user.id) + if is_anonymous: + self._send_photo_message(message.photo[-1].file_id, post_caption) + else: + self._send_photo_message(message.photo[-1].file_id, post_caption) + elif message.media_group_id is not None: + #TODO: Остановился здесь, так нихрена не рабоатет + + + self._get_media_group_from_user(message) + media_group = self._prepare_media_group(message.media, message.caption) + self._send_media_group_message(media_group) + except Exception as e: + if self.LOGS: + self.bot.send_message(chat_id=self.IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + markup_for_user = self.get_reply_keyboard(message) + success_send_message = messages.get_message(self.__get_first_name(message), 'SUCCESS_SEND_MESSAGE') + self.bot.send_message(message.chat.id, success_send_message, parse_mode='html', + disable_web_page_preview=not self.PREVIEW_LINK, reply_markup=markup_for_user) + + def _get_media_group_from_user(self, message): + if message.media_group_id is not None: + print(message) + + + @staticmethod + def _get_reply_keyboard_for_post(): + markup = types.InlineKeyboardMarkup(row_width=1) + item1 = types.InlineKeyboardButton("Опубликовать", callback_data='publish') + item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline') + markup.add(item1, item2) + return markup + + def _prepare_media_group(self, message, post_caption): + post_content = message.photo + media_group = [] + if len(post_caption) > 1021: + #TODO: Выключил обработку таких сообщений. Позднее нужно будет подумать что делать с длинными сообщениями + pass + else: + for idx, photo in enumerate(post_content): + if idx == 0: + media_group.append(InputMediaPhoto(photo.file_id, + caption=post_caption)) + else: + media_group.append(InputMediaPhoto(photo.file_id, + caption='')) + return media_group + + @staticmethod + def _get_text_message(post_text: str, first_name: str, username: str): + """ + Форматирует текст сообщения для публикации в зависимости от наличия ключевых слов "анон" и "неанон". + + Args: + post_text: Текст сообщения + first_name: Имя автора поста + username: Юзернейм автора поста + + Returns: + Кортеж из двух элементов: + - Сформированный текст сообщения. + - Флаг, указывающий, является ли пост анонимным (True - анонимный, False - не анонимный). + """ + if "неанон" in post_text or "не анон" in post_text: + is_anonymous = False + return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}', is_anonymous + elif "анон" in post_text: + is_anonymous = True + return f'Пост из ТГ:\n{post_text}\n\nПост опубликован анонимно', is_anonymous + else: + is_anonymous = False + return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}', is_anonymous + + def _send_text_message(self, post_text: str): + markup = self._get_reply_keyboard_for_post() + self.bot.send_message( + chat_id=self.GROUP_FOR_POST, + text=post_text, + parse_mode='html', + disable_web_page_preview=not self.PREVIEW_LINK, + reply_markup=markup + ) + + def _send_photo_message(self, photo: str, post_text: str): + markup = self._get_reply_keyboard_for_post() + self.bot.send_photo( + chat_id=self.GROUP_FOR_POST, + caption=post_text, + photo=photo, + reply_markup=markup + ) + + def _send_media_group_message(self, media_group: list[InputMediaPhoto]): + self.bot.send_media_group(chat_id=self.GROUP_FOR_POST, media=media_group) def get_reply_keyboard(self, message): markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)