This commit is contained in:
KatykhinAA
2024-07-13 12:42:21 +03:00
parent f2dd9f4b42
commit 24ac638433
6 changed files with 103 additions and 86 deletions

View File

@@ -9,10 +9,10 @@ db_logger = Logger(name='db')
# Получение абсолютного пути к текущей директории # Получение абсолютного пути к текущей директории
current_dir = os.getcwd() current_dir = os.getcwd()
class BotDB:
def __init__(self): class BotDB:
self.db_file = os.path.join(current_dir, 'database/tg-bot-database') def __init__(self, name):
self.db_file = os.path.join(current_dir, name)
self.conn = None self.conn = None
self.cursor = None self.cursor = None
self.logger = db_logger.get_logger() self.logger = db_logger.get_logger()
@@ -155,7 +155,7 @@ class BotDB:
return None return None
except sqlite3.Error as error: except sqlite3.Error as error:
self.logger.error(f"Ошибка при добавлении пользователя в базу: {error}. " self.logger.error(f"Ошибка при добавлении пользователя в базу: {error}. "
f"Данные пользователя: user_id={user_id}, first_name={first_name}") f"Данные пользователя: user_id={user_id}, first_name={first_name}")
raise raise
finally: finally:
self.close() self.close()
@@ -486,7 +486,7 @@ class BotDB:
sqlite3.Error: Если произошла ошибка при выполнении запроса. sqlite3.Error: Если произошла ошибка при выполнении запроса.
""" """
self.logger.info(f"Запуск функции set_user_blacklist: user_id={user_id}, user_name={user_name}," self.logger.info(f"Запуск функции set_user_blacklist: user_id={user_id}, user_name={user_name},"
f" message_for_user={message_for_user}, date_to_unban={date_to_unban}") f" message_for_user={message_for_user}, date_to_unban={date_to_unban}")
try: try:
self.connect() self.connect()
result = self.cursor.execute("INSERT INTO 'blacklist' ('user_id', 'user_name'," result = self.cursor.execute("INSERT INTO 'blacklist' ('user_id', 'user_name',"
@@ -523,7 +523,7 @@ class BotDB:
return True return True
except sqlite3.Error as error: except sqlite3.Error as error:
self.logger.error(f"Ошибка удаления пользователя с идентификатором {user_id} " self.logger.error(f"Ошибка удаления пользователя с идентификатором {user_id} "
f"из таблицы blacklist. Ошибка: {str(error)}") f"из таблицы blacklist. Ошибка: {str(error)}")
return False return False
finally: finally:
self.close() self.close()
@@ -545,7 +545,8 @@ class BotDB:
Raises: Raises:
sqlite3.Error: Если произошла ошибка при выполнении запроса. sqlite3.Error: Если произошла ошибка при выполнении запроса.
""" """
self.logger.info(f"Запуск функции add_new_message_in_db: user_id={user_id}, message_id={message_id}, date={date}") self.logger.info(
f"Запуск функции add_new_message_in_db: user_id={user_id}, message_id={message_id}, date={date}")
try: try:
self.connect() self.connect()
self.cursor.execute( self.cursor.execute(

View File

View File

@@ -44,11 +44,13 @@ class TelegramHelperBot:
# Router for user # Router for user
@self.bot.message_handler(func=lambda message: True, chat_types=['private']) @self.bot.message_handler(func=lambda message: True, chat_types=['private'])
def handle_message(message): def handle_message(message):
self.logger.info(f'Получено сообщение: {message.text} от пользователя: {message.from_user.full_name} id юзера: {message.chat.id}') self.logger.info(
f'Получено сообщение: {message.text} от пользователя: {message.from_user.full_name} id юзера: {message.chat.id}')
if self.BotDB.check_user_in_blacklist(message.from_user.id): if self.BotDB.check_user_in_blacklist(message.from_user.id):
attribute = self.BotDB.get_blacklist_users_by_id(message.from_user.id) attribute = self.BotDB.get_blacklist_users_by_id(message.from_user.id)
self.bot.send_message(message.chat.id, self.bot.send_message(message.chat.id,
f'<b>Ты заблокирован\nПричина блокировки:</b> {attribute[2]}\n<b>Дата разблокировки:</b> {attribute[3]}', parse_mode='HTML') f'<b>Ты заблокирован\nПричина блокировки:</b> {attribute[2]}\n<b>Дата разблокировки:</b> {attribute[3]}',
parse_mode='HTML')
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) заблокирован') self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) заблокирован')
return return
if self.state == State.START: if self.state == State.START:
@@ -73,10 +75,12 @@ class TelegramHelperBot:
if access: if access:
self.admin_panel(message) self.admin_panel(message)
self.state = State.ADMIN self.state = State.ADMIN
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вошел в админ-панель') self.logger.info(
f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вошел в админ-панель')
else: else:
self.bot.send_message(message.chat.id, 'Доступ запрещен, досвидания!') self.bot.send_message(message.chat.id, 'Доступ запрещен, досвидания!')
self.logger.info(f'Пользователю {message.from_user.full_name} (ID: {message.chat.id}) отказано в доступе к админ-панели') self.logger.info(
f'Пользователю {message.from_user.full_name} (ID: {message.chat.id}) отказано в доступе к админ-панели')
elif message.text == '/state': elif message.text == '/state':
self.bot.send_message(message.chat.id, self.bot.send_message(message.chat.id,
f'Твой state == {self.state.value}') f'Твой state == {self.state.value}')
@@ -84,7 +88,8 @@ class TelegramHelperBot:
self.bot.send_message(message.chat.id, self.bot.send_message(message.chat.id,
#TODO: Здесь раньше был /state #TODO: Здесь раньше был /state
"Не понимаю где ты находишься. Нажми /start, и я перезапущусь") "Не понимаю где ты находишься. Нажми /start, и я перезапущусь")
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.suggest_router) self.bot.register_next_step_handler(message, self.suggest_router)
@@ -92,24 +97,28 @@ class TelegramHelperBot:
if message.text == '/start': if message.text == '/start':
self.state = State.START self.state = State.START
self.start_message(message) self.start_message(message)
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню') self.logger.info(
f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню')
if self.state == State.PRE_CHAT: if self.state == State.PRE_CHAT:
self.bot.register_next_step_handler(message, self.resend_message_in_group_for_message) self.bot.register_next_step_handler(message, self.resend_message_in_group_for_message)
self.state = State.START self.state = State.START
if message.text == '/start': if message.text == '/start':
self.state = State.START self.state = State.START
self.start_message(message) self.start_message(message)
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню') self.logger.info(
f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню')
if self.state == State.CHAT: if self.state == State.CHAT:
if message.text == 'Выйти из чата': if message.text == 'Выйти из чата':
self.state = State.START self.state = State.START
self.end_message(message) self.end_message(message)
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вышел из чата') self.logger.info(
f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вышел из чата')
elif message.text == '/start': elif message.text == '/start':
self.state = State.START self.state = State.START
self.start_message(message) self.start_message(message)
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню') self.logger.info(
f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню')
else: else:
self.resend_message_in_group_for_message(message) self.resend_message_in_group_for_message(message)
@@ -118,19 +127,23 @@ class TelegramHelperBot:
access = self.check_access(message.from_user.id) access = self.check_access(message.from_user.id)
if access: if access:
self.admin_panel(message) self.admin_panel(message)
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вошел в админ-панель') self.logger.info(
f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вошел в админ-панель')
else: else:
self.bot.send_message(message.chat.id, 'Доступ запрещен, досвидания!') self.bot.send_message(message.chat.id, 'Доступ запрещен, досвидания!')
self.logger.info(f'Пользователю {message.from_user.full_name} (ID: {message.chat.id}) отказано в доступе к админ-панели') self.logger.info(
f'Пользователю {message.from_user.full_name} (ID: {message.chat.id}) отказано в доступе к админ-панели')
if message.text == '/start': if message.text == '/start':
self.state = State.START self.state = State.START
self.start_message(message) self.start_message(message)
self.logger.info(f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню') self.logger.info(
f'Пользователь {message.from_user.full_name} (ID: {message.chat.id}) вернулся в главное меню')
@self.bot.message_handler(func=lambda message: True, chat_types=['group']) @self.bot.message_handler(func=lambda message: True, chat_types=['group'])
def handle_message(message): def handle_message(message):
"""Функция ответа админа пользователю через закрытый чат""" """Функция ответа админа пользователю через закрытый чат"""
self.logger.info(f'Получено сообщение в группе {message.chat.title} (ID: {message.chat.id}) от пользователя {message.from_user.full_name} (ID: {message.from_user.id}): "{message.text}"') self.logger.info(
f'Получено сообщение в группе {message.chat.title} (ID: {message.chat.id}) от пользователя {message.from_user.full_name} (ID: {message.from_user.id}): "{message.text}"')
self.state = State.CHAT self.state = State.CHAT
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("Выйти из чата") item1 = types.KeyboardButton("Выйти из чата")
@@ -140,7 +153,8 @@ class TelegramHelperBot:
message_id = message.reply_to_message.id message_id = message.reply_to_message.id
except AttributeError: except AttributeError:
self.bot.send_message(message.chat.id, f'Блять, выдели сообщение!') self.bot.send_message(message.chat.id, f'Блять, выдели сообщение!')
self.logger.warning(f'В группе {message.chat.title} (ID: {message.chat.id}) админ не выделил сообщение для ответа.') self.logger.warning(
f'В группе {message.chat.title} (ID: {message.chat.id}) админ не выделил сообщение для ответа.')
message_from_admin = message.text message_from_admin = message.text
try: try:
chat_id = self.BotDB.get_user_by_message_id(message_id) chat_id = self.BotDB.get_user_by_message_id(message_id)
@@ -148,12 +162,14 @@ class TelegramHelperBot:
self.logger.info(f'Ответ админа "{message.text}" отправлен пользователю с ID: {chat_id}.') self.logger.info(f'Ответ админа "{message.text}" отправлен пользователю с ID: {chat_id}.')
except TypeError: except TypeError:
self.bot.send_message(message.chat.id, f'Не могу найти кому ответить в базе, проебали сообщение.') self.bot.send_message(message.chat.id, f'Не могу найти кому ответить в базе, проебали сообщение.')
self.logger.error(f'Ошибка при поиске пользователя в базе для ответа: {message.text} в группе {message.chat.title} (ID: {message.chat.id})') self.logger.error(
f'Ошибка при поиске пользователя в базе для ответа: {message.text} в группе {message.chat.title} (ID: {message.chat.id})')
# Админка # Админка
@self.bot.callback_query_handler(func=lambda call: call.data in ['publish', 'decline']) @self.bot.callback_query_handler(func=lambda call: call.data in ['publish', 'decline'])
def post_for_group(call): def post_for_group(call):
self.logger.info(f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') self.logger.info(
f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})')
if call.data == 'publish' and call.message.content_type == 'text': if call.data == 'publish' and call.message.content_type == 'text':
try: try:
self.bot.send_message(chat_id=self.MAIN_PUBLIC, text=call.message.text) self.bot.send_message(chat_id=self.MAIN_PUBLIC, text=call.message.text)
@@ -181,7 +197,8 @@ class TelegramHelperBot:
elif call.data == 'decline': elif call.data == 'decline':
try: try:
self.bot.delete_message(chat_id=self.GROUP_FOR_POST, message_id=call.message.message_id) self.bot.delete_message(chat_id=self.GROUP_FOR_POST, message_id=call.message.message_id)
self.logger.info(f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).') self.logger.info(
f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).')
except Exception as e: except Exception as e:
if self.LOGS: if self.LOGS:
self.bot.send_message(self.IMPORTANT_LOGS, self.bot.send_message(self.IMPORTANT_LOGS,
@@ -230,9 +247,11 @@ class TelegramHelperBot:
def start(self): def start(self):
while True: while True:
try: try:
print(self.bot.last_update_id)
self.bot.polling(none_stop=True) self.bot.polling(none_stop=True)
except ConnectionError as e: except ConnectionError as e:
self.logger.error(f"Произошла ошибка (потеря коннекта): {str(e)}\n\nTraceback:\n{traceback.format_exc()}") self.logger.error(
f"Произошла ошибка (потеря коннекта): {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
except Exception as e: except Exception as e:
self.logger.error(f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") self.logger.error(f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
@@ -286,7 +305,8 @@ class TelegramHelperBot:
self.admin_panel(message) self.admin_panel(message)
def ban_user(self, message, user_id: int): def ban_user(self, message, user_id: int):
self.logger.info(f"Получена команда от админа на бан пользователя: {message.text} (пользователь: {message.from_user.id})") self.logger.info(
f"Получена команда от админа на бан пользователя: {message.text} (пользователь: {message.from_user.id})")
user_name = self.BotDB.get_username(user_id=user_id) user_name = self.BotDB.get_username(user_id=user_id)
ban_object = {'user_id': user_id, 'user_name': user_name, 'message_for_user': None, 'date_to_unban': None} ban_object = {'user_id': user_id, 'user_name': user_name, 'message_for_user': None, 'date_to_unban': None}
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
@@ -348,14 +368,16 @@ class TelegramHelperBot:
self.admin_panel(message) self.admin_panel(message)
def get_last_users(self, message): def get_last_users(self, message):
self.logger.info(f"Попытка получения списка последних пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})") self.logger.info(
f"Попытка получения списка последних пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
list_users = self.BotDB.get_last_users_from_db() list_users = self.BotDB.get_last_users_from_db()
keyboard = self.create_keyboard_with_pagination(1, len(list_users), list_users, 'ban') keyboard = self.create_keyboard_with_pagination(1, len(list_users), list_users, 'ban')
self.bot.send_message(chat_id=message.chat.id, text="Список пользователей которые последними обращались к боту", self.bot.send_message(chat_id=message.chat.id, text="Список пользователей которые последними обращались к боту",
reply_markup=keyboard) reply_markup=keyboard)
def get_banned_users(self, message): def get_banned_users(self, message):
self.logger.info(f"Попытка получения списка заблокированных пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})") self.logger.info(
f"Попытка получения списка заблокированных пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
message_text = self.get_banned_users_list(0) message_text = self.get_banned_users_list(0)
buttons_list = self.get_banned_users_buttons() buttons_list = self.get_banned_users_buttons()
if buttons_list: if buttons_list:
@@ -367,7 +389,8 @@ class TelegramHelperBot:
def start_message(self, message): def start_message(self, message):
try: try:
self.logger.info(f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name})") self.logger.info(
f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name})")
name_stick_hello = list(Path('Stick').rglob('Hello_*')) name_stick_hello = list(Path('Stick').rglob('Hello_*'))
random_stick_hello = open(random.choice(name_stick_hello), 'rb') random_stick_hello = open(random.choice(name_stick_hello), 'rb')
self.logger.info(f"Стикер успешно получен из БД") self.logger.info(f"Стикер успешно получен из БД")
@@ -385,7 +408,8 @@ class TelegramHelperBot:
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
try: try:
self.logger.info(f"Получение данных для приветственного сообщения пользователю. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name})") self.logger.info(
f"Получение данных для приветственного сообщения пользователю. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name})")
user_id = message.from_user.id user_id = message.from_user.id
first_name = message.from_user.first_name first_name = message.from_user.first_name
full_name = message.from_user.full_name full_name = message.from_user.full_name
@@ -403,13 +427,15 @@ class TelegramHelperBot:
self.bot.send_message(message.chat.id, hello_message, parse_mode='html', reply_markup=markup, self.bot.send_message(message.chat.id, hello_message, parse_mode='html', reply_markup=markup,
disable_web_page_preview=not self.PREVIEW_LINK) disable_web_page_preview=not self.PREVIEW_LINK)
except Exception as e: except Exception as e:
self.logger.error(f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}") self.logger.error(
f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}")
if self.LOGS: if self.LOGS:
self.bot.send_message(self.IMPORTANT_LOGS, self.bot.send_message(self.IMPORTANT_LOGS,
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
def resend_message_in_group_for_message(self, message): def resend_message_in_group_for_message(self, message):
self.logger.info(f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.id})") self.logger.info(
f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.id})")
self.bot.forward_message(chat_id=self.GROUP_FOR_MESSAGE, self.bot.forward_message(chat_id=self.GROUP_FOR_MESSAGE,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id message_id=message.message_id
@@ -419,12 +445,14 @@ class TelegramHelperBot:
self.BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date) self.BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date)
question = messages.get_message(self.__get_first_name(message), 'QUESTION') question = messages.get_message(self.__get_first_name(message), 'QUESTION')
markup = self.get_reply_keyboard(message) markup = self.get_reply_keyboard(message)
self.bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not self.PREVIEW_LINK, self.bot.send_message(message.chat.id, question, parse_mode='html',
disable_web_page_preview=not self.PREVIEW_LINK,
reply_markup=markup) reply_markup=markup)
def suggest_post(self, message): def suggest_post(self, message):
try: try:
self.logger.info(f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.id})") self.logger.info(
f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.id})")
markup = types.ReplyKeyboardRemove() markup = types.ReplyKeyboardRemove()
suggest_news = messages.get_message(self.__get_first_name(message), 'SUGGEST_NEWS') suggest_news = messages.get_message(self.__get_first_name(message), 'SUGGEST_NEWS')
self.bot.send_message(message.chat.id, suggest_news, parse_mode='html') self.bot.send_message(message.chat.id, suggest_news, parse_mode='html')
@@ -436,7 +464,8 @@ class TelegramHelperBot:
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
def stickers(self, message): def stickers(self, message):
self.logger.info(f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") self.logger.info(
f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
self.BotDB.update_info_about_stickers(user_id=message.from_user.id) self.BotDB.update_info_about_stickers(user_id=message.from_user.id)
markup = self.get_reply_keyboard(message) markup = self.get_reply_keyboard(message)
try: try:
@@ -449,10 +478,12 @@ class TelegramHelperBot:
except ApiTelegramException as e: except ApiTelegramException as e:
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()}")
self.logger.error(f"Ошибка функции stickers. Ошибка: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") self.logger.error(
f"Ошибка функции stickers. Ошибка: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
def connect_with_admin(self, message): def connect_with_admin(self, message):
self.logger.info(f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") self.logger.info(
f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
connect_with_admin = messages.get_message(self.__get_first_name(message), 'CONNECT_WITH_ADMIN') connect_with_admin = messages.get_message(self.__get_first_name(message), 'CONNECT_WITH_ADMIN')
self.bot.send_message(message.chat.id, connect_with_admin, parse_mode="html") self.bot.send_message(message.chat.id, connect_with_admin, parse_mode="html")
# logging # logging
@@ -463,12 +494,14 @@ class TelegramHelperBot:
def end_message(self, message): def end_message(self, message):
try: try:
self.logger.info(f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") self.logger.info(
f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
name_stick_bye = list(Path('Stick').rglob('Universal_*')) name_stick_bye = list(Path('Stick').rglob('Universal_*'))
random_stick_bye = open(random.choice(name_stick_bye), 'rb') random_stick_bye = open(random.choice(name_stick_bye), 'rb')
self.bot.send_sticker(message.chat.id, random_stick_bye) self.bot.send_sticker(message.chat.id, random_stick_bye)
except ApiTelegramException as e: except ApiTelegramException as e:
self.logger.error(f"Ошибка в функции stickers при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") self.logger.error(
f"Ошибка в функции stickers при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
if self.LOGS: if self.LOGS:
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()}")
@@ -476,10 +509,12 @@ class TelegramHelperBot:
try: try:
bye_message = messages.get_message(self.__get_first_name(message), 'BYE_MESSAGE') bye_message = messages.get_message(self.__get_first_name(message), 'BYE_MESSAGE')
self.bot.send_message(message.chat.id, bye_message, self.bot.send_message(message.chat.id, bye_message,
parse_mode='html', reply_markup=markup, disable_web_page_preview=not self.PREVIEW_LINK) parse_mode='html', reply_markup=markup,
disable_web_page_preview=not self.PREVIEW_LINK)
except Exception as e: except Exception as e:
if self.LOGS: if self.LOGS:
self.logger.error(f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") self.logger.error(
f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
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()}")
@@ -551,41 +586,45 @@ class TelegramHelperBot:
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): def suggest_router(self, message):
self.logger.info(
f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
try: try:
if message.content_type == 'text': if message.content_type == 'text':
lower_text = message.text.lower() lower_text = message.text.lower()
post_text, is_anonymous = self._get_text_message(lower_text, message.from_user.full_name, message.from_user.id) post_text, is_anonymous = self._get_text_message(lower_text, message.from_user.full_name,
message.from_user.id)
if is_anonymous: if is_anonymous:
self._send_text_message(post_text) self._send_text_message(post_text)
else: else:
self._send_text_message(post_text) self._send_text_message(post_text)
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)
elif message.content_type == 'photo' and message.media_group_id is None: elif message.content_type == 'photo' and message.media_group_id is None:
lower_caption = message.caption.lower() lower_caption = message.caption.lower()
post_caption, is_anonymous = self._get_text_message(lower_caption, message.from_user.full_name, message.from_user.id) post_caption, is_anonymous = self._get_text_message(lower_caption, message.from_user.full_name,
message.from_user.id)
if is_anonymous: if is_anonymous:
self._send_photo_message(message.photo[-1].file_id, post_caption) self._send_photo_message(message.photo[-1].file_id, post_caption)
else: else:
self._send_photo_message(message.photo[-1].file_id, post_caption) self._send_photo_message(message.photo[-1].file_id, post_caption)
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)
elif message.media_group_id is not None: elif message.media_group_id is not None:
#TODO: Остановился здесь, так нихрена не рабоатет self.bot.send_message(message.chat.id,
'Я пока не умею работать с несколькими файлами. Пришли текст и не более одного фото')
self.bot.register_next_step_handler(message, self.suggest_router)
self._get_media_group_from_user(message) else:
media_group = self._prepare_media_group(message.media, message.caption) self.bot.send_message(message.chat.id,
self._send_media_group_message(media_group) 'Я пока не умею работать с таким сообщением. Пришли текст и не более одного фото')
self.bot.register_next_step_handler(message, self.suggest_router)
except Exception as e: except Exception as e:
if self.LOGS: if self.LOGS:
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()}")
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 @staticmethod
def _get_reply_keyboard_for_post(): def _get_reply_keyboard_for_post():
@@ -595,22 +634,6 @@ class TelegramHelperBot:
markup.add(item1, item2) markup.add(item1, item2)
return markup 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 @staticmethod
def _get_text_message(post_text: str, first_name: str, username: str): def _get_text_message(post_text: str, first_name: str, username: str):
""" """
@@ -655,9 +678,6 @@ class TelegramHelperBot:
reply_markup=markup 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)
item1 = types.KeyboardButton("📢Предложить свой пост") item1 = types.KeyboardButton("📢Предложить свой пост")
@@ -731,7 +751,6 @@ class TelegramHelperBot:
keyboard.append(buttons[i:i + 3]) keyboard.append(buttons[i:i + 3])
return types.InlineKeyboardMarkup(keyboard) return types.InlineKeyboardMarkup(keyboard)
def get_banned_users_list(self, offset: int): def get_banned_users_list(self, offset: int):
""" """
Возвращает сообщение со списком пользователей и словарь с ником + идентификатором Возвращает сообщение со списком пользователей и словарь с ником + идентификатором

View File

@@ -19,7 +19,7 @@ class BaseDependencyFactory:
config_path = os.path.join(sys.path[0], 'settings.ini') config_path = os.path.join(sys.path[0], 'settings.ini')
self.config = configparser.ConfigParser() self.config = configparser.ConfigParser()
self.config.read(config_path) self.config.read(config_path)
self.BotDB = BotDB() self.BotDB = BotDB('database/tg-bot-database')
self.settings = {} self.settings = {}
for section in self.config.sections(): for section in self.config.sections():
@@ -36,9 +36,6 @@ class BaseDependencyFactory:
def get_settings(self): def get_settings(self):
return self.settings return self.settings
def get_config(self):
return self.config
def get_database(self): def get_database(self):
return self.BotDB return self.BotDB

View File

@@ -1,10 +1,9 @@
import os
from datetime import datetime from datetime import datetime
import pytest import os
import sqlite3 import sqlite3
import pytest
from database.db import BotDB from database.db import BotDB
@pytest.fixture @pytest.fixture
def bot(): def bot():
"""Фикстура для создания объекта BotDB.""" """Фикстура для создания объекта BotDB."""
@@ -234,6 +233,7 @@ def test_update_version_integrity_error(bot):
with pytest.raises(sqlite3.IntegrityError): with pytest.raises(sqlite3.IntegrityError):
bot.update_version(123, "script_2.sql") bot.update_version(123, "script_2.sql")
def test_update_version_error(bot): def test_update_version_error(bot):
__drop_table('migrations') __drop_table('migrations')
with pytest.raises(sqlite3.OperationalError): with pytest.raises(sqlite3.OperationalError):

View File

@@ -30,7 +30,7 @@ TEST = config.getboolean('Settings', 'test')
#Инициализируем бота и базку #Инициализируем бота и базку
bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None) bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None)
BotDB = BotDB('tg-bot-database') BotDB = BotDB('database/tg-bot-database')