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 import telebot
from telebot import types from telebot import types
from telebot.apihelper import ApiTelegramException from telebot.apihelper import ApiTelegramException
from telebot.types import InputMediaPhoto
import messages import messages
from logs.custom_logger import Logger from logs.custom_logger import Logger
#Инициализируем логгер #Инициализируем логгер
bot_logger = Logger(name='bot') bot_logger = Logger(name='bot')
class State(Enum): class State(Enum):
START = "START" START = "START"
SUGGEST = "SUGGEST" SUGGEST = "SUGGEST"
@@ -84,7 +87,7 @@ class TelegramHelperBot:
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) отправил непонятное сообщение: {message.text}') self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) отправил непонятное сообщение: {message.text}')
if self.state == State.SUGGEST: 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 self.state = State.START
if message.text == '/start': if message.text == '/start':
self.state = State.START self.state = State.START
@@ -480,11 +483,9 @@ class TelegramHelperBot:
self.bot.send_message(chat_id=self.IMPORTANT_LOGS, self.bot.send_message(chat_id=self.IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
def send_to_suggest(self, message): #TODO: deprecated
markup = types.InlineKeyboardMarkup(row_width=1) def send_to_suggest_2(self, message):
item1 = types.InlineKeyboardButton("Опубликовать", callback_data='publish') markup = self._get_reply_keyboard_for_post()
item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline')
markup.add(item1, item2)
try: try:
if message.content_type == 'text': if message.content_type == 'text':
post_text = message.text.lower() post_text = message.text.lower()
@@ -549,6 +550,113 @@ class TelegramHelperBot:
self.bot.send_message(message.chat.id, success_send_message, parse_mode='html', 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) 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): def get_reply_keyboard(self, message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)