refactor suggest, media_group doesn't work

This commit is contained in:
KatykhinAA
2024-07-13 01:23:48 +03:00
parent 47050fd599
commit f2dd9f4b42

View File

@@ -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)