WIP: Temporary commit for branch move
This commit is contained in:
Binary file not shown.
@@ -1,179 +1,304 @@
|
||||
import traceback
|
||||
|
||||
from aiogram import Router, types, F
|
||||
from aiogram.filters import Command, StateFilter
|
||||
from aiogram.fsm.context import FSMContext
|
||||
|
||||
from helper_bot.filters.main import ChatTypeFilter
|
||||
from helper_bot.keyboards.keyboards import get_reply_keyboard_admin, create_keyboard_with_pagination, \
|
||||
create_keyboard_for_ban_days, create_keyboard_for_approve_ban, create_keyboard_for_ban_reason
|
||||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||||
from helper_bot.utils.helper_func import check_access, add_days_to_date, get_banned_users_buttons, get_banned_users_list
|
||||
from logs.custom_logger import logger
|
||||
|
||||
admin_router = Router()
|
||||
|
||||
bdf = BaseDependencyFactory()
|
||||
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
|
||||
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
|
||||
MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
|
||||
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
|
||||
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
|
||||
PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
|
||||
LOGS = bdf.settings['Settings']['logs']
|
||||
TEST = bdf.settings['Settings']['test']
|
||||
|
||||
BotDB = bdf.get_db()
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
Command('admin')
|
||||
)
|
||||
async def admin_panel(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
if check_access(message.from_user.id):
|
||||
await state.set_state("ADMIN")
|
||||
logger.info(f"Запуск админ панели для пользователя: {message.from_user.id}")
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer("Добро пожаловать в админку. Выбери что хочешь:",
|
||||
reply_markup=markup)
|
||||
else:
|
||||
await message.answer('Доступ запрещен, досвидания!')
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при запуске админ панели: {e}")
|
||||
await message.bot.send_message(IMPORTANT_LOGS,
|
||||
f'Ошибка в функции admin_panel {e}. Traceback: {traceback.format_exc()}')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Бан (Список)'
|
||||
)
|
||||
async def get_last_users(message: types.Message):
|
||||
logger.info(
|
||||
f"Попытка получения списка последних пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
|
||||
list_users = BotDB.get_last_users_from_db()
|
||||
keyboard = create_keyboard_with_pagination(1, len(list_users), list_users, 'ban')
|
||||
await message.answer(text="Список пользователей которые последними обращались к боту",
|
||||
reply_markup=keyboard)
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Бан по нику'
|
||||
)
|
||||
async def ban_by_nickname(message: types.Message, state: FSMContext):
|
||||
await message.answer('Пришли мне username блокируемого пользователя')
|
||||
await state.set_state('PRE_BAN')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == 'Отменить'
|
||||
)
|
||||
async def decline_ban(message: types.Message, state: FSMContext):
|
||||
await state.set_data({})
|
||||
await state.set_state("ADMIN")
|
||||
logger.info(f"Отмена процедуры блокировки")
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("PRE_BAN")
|
||||
)
|
||||
async def ban_by_nickname_step_2(message: types.Message, state: FSMContext):
|
||||
logger.info(
|
||||
f"Функция ban_by_nickname_2. Получен никнейм пользователя: {message.text}")
|
||||
user_name = message.text
|
||||
user_id = BotDB.get_user_id_by_username(user_name)
|
||||
await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None,
|
||||
date_to_unban=None)
|
||||
full_name = BotDB.get_full_name_by_id(user_id)
|
||||
markup = create_keyboard_for_ban_reason()
|
||||
await message.answer(
|
||||
text=f"<b>Выбран пользователь:\nid:</b> {user_id}\n<b>username:</b> {user_name}\n"
|
||||
f"Имя:{full_name}\nВыбери причину бана из списка или напиши ее в чат",
|
||||
reply_markup=markup)
|
||||
await state.set_state('BAN_2')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Разбан (список)'
|
||||
)
|
||||
async def get_banned_users(message):
|
||||
logger.info(
|
||||
f"Попытка получения списка заблокированных пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
|
||||
message_text = get_banned_users_list(0)
|
||||
buttons_list = get_banned_users_buttons()
|
||||
if buttons_list:
|
||||
k = create_keyboard_with_pagination(1, len(buttons_list), buttons_list, 'unlock')
|
||||
await message.answer(text=message_text, reply_markup=k)
|
||||
else:
|
||||
await message.answer(text="В списке забанненых пользователей никого нет")
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("BAN_2")
|
||||
)
|
||||
async def ban_user_step_2(message: types.Message, state: FSMContext):
|
||||
user_data = await state.get_data()
|
||||
logger.info(f"Переход на шаг 2 бана пользователя. Словарь с данными для бана: {user_data})")
|
||||
await state.update_data(message_for_user=message.text)
|
||||
markup = create_keyboard_for_ban_days()
|
||||
await message.answer(f"Выбрана причина: {message.text}. Выбери срок бана в днях или напиши "
|
||||
f"его в чат", reply_markup=markup)
|
||||
await state.set_state("BAN_3")
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("BAN_3")
|
||||
)
|
||||
async def ban_user_step_3(message: types.Message, state: FSMContext):
|
||||
logger.info(f"ban_user_step_3. Расчет даты разбана. Входные данные {message.text}")
|
||||
if message.text != 'Навсегда':
|
||||
count_days = int(message.text)
|
||||
date_to_unban = add_days_to_date(count_days)
|
||||
else:
|
||||
date_to_unban = None
|
||||
logger.info(f"ban_user_step_3. Расчет даты разбана. date_to_unban: {date_to_unban}")
|
||||
await state.update_data(date_to_unban=date_to_unban)
|
||||
user_data = await state.get_data()
|
||||
markup = create_keyboard_for_approve_ban()
|
||||
await message.answer(
|
||||
f"Необходимо подтверждение:\nПользователь:{user_data['user_id']}\nПричина бана:{user_data['message_for_user']}\nСрок бана:{user_data['date_to_unban']}",
|
||||
reply_markup=markup)
|
||||
await state.set_state("BAN_FINAL")
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("BAN_FINAL"),
|
||||
F.text == 'Подтвердить'
|
||||
)
|
||||
async def approve_ban(message: types.Message, state: FSMContext):
|
||||
user_data = await state.get_data()
|
||||
logger.info(f"Переход на финальный шаг бана пользователя. Словарь с данными для бана: {user_data})")
|
||||
exists = BotDB.check_user_in_blacklist(user_data['user_id'])
|
||||
if exists:
|
||||
await message.reply(f"Пользователь уже был заблокирован ранее.")
|
||||
logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)")
|
||||
await state.set_state('ADMIN')
|
||||
else:
|
||||
BotDB.set_user_blacklist(user_data['user_id'],
|
||||
user_data['user_name'],
|
||||
user_data['message_for_user'],
|
||||
user_data['date_to_unban'])
|
||||
await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.")
|
||||
logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)")
|
||||
await state.set_state('ADMIN')
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
import traceback
|
||||
|
||||
from aiogram import Router, types, F
|
||||
from aiogram.filters import Command, StateFilter
|
||||
from aiogram.fsm.context import FSMContext
|
||||
|
||||
from helper_bot.filters.main import ChatTypeFilter
|
||||
from helper_bot.keyboards.keyboards import get_reply_keyboard_admin, create_keyboard_with_pagination, \
|
||||
create_keyboard_for_ban_days, create_keyboard_for_approve_ban, create_keyboard_for_ban_reason
|
||||
from helper_bot.utils.base_dependency_factory import get_global_instance
|
||||
from helper_bot.utils.helper_func import check_access, add_days_to_date, get_banned_users_buttons, get_banned_users_list
|
||||
from logs.custom_logger import logger
|
||||
|
||||
admin_router = Router()
|
||||
|
||||
bdf = get_global_instance()
|
||||
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
|
||||
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
|
||||
MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
|
||||
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
|
||||
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
|
||||
PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
|
||||
LOGS = bdf.settings['Settings']['logs']
|
||||
TEST = bdf.settings['Settings']['test']
|
||||
|
||||
BotDB = bdf.get_db()
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
Command('admin')
|
||||
)
|
||||
async def admin_panel(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
if check_access(message.from_user.id, BotDB):
|
||||
await state.set_state("ADMIN")
|
||||
logger.info(f"Запуск админ панели для пользователя: {message.from_user.id}")
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer("Добро пожаловать в админку. Выбери что хочешь:",
|
||||
reply_markup=markup)
|
||||
else:
|
||||
await message.answer('Доступ запрещен, досвидания!')
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при запуске админ панели: {e}")
|
||||
await message.bot.send_message(IMPORTANT_LOGS,
|
||||
f'Ошибка в функции admin_panel {e}. Traceback: {traceback.format_exc()}')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Бан (Список)'
|
||||
)
|
||||
async def get_last_users(message: types.Message):
|
||||
logger.info(
|
||||
f"Попытка получения списка последних пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
|
||||
list_users = BotDB.get_last_users_from_db()
|
||||
keyboard = create_keyboard_with_pagination(1, len(list_users), list_users, 'ban')
|
||||
await message.answer(text="Список пользователей которые последними обращались к боту",
|
||||
reply_markup=keyboard)
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Бан по нику'
|
||||
)
|
||||
async def ban_by_nickname(message: types.Message, state: FSMContext):
|
||||
await message.answer('Пришли мне username блокируемого пользователя')
|
||||
await state.set_state('PRE_BAN')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Бан по ID'
|
||||
)
|
||||
async def ban_by_id(message: types.Message, state: FSMContext):
|
||||
await message.answer('Пришли мне ID блокируемого пользователя')
|
||||
await state.set_state('PRE_BAN_ID')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Тестовый бан'
|
||||
)
|
||||
async def ban_by_forward(message: types.Message, state: FSMContext):
|
||||
await message.answer('Перешлите мне сообщение от пользователя, которого хотите заблокировать')
|
||||
await state.set_state('PRE_BAN_FORWARD')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == 'Отменить'
|
||||
)
|
||||
async def decline_ban(message: types.Message, state: FSMContext):
|
||||
current_state = await state.get_state()
|
||||
await state.set_data({})
|
||||
await state.set_state("ADMIN")
|
||||
logger.info(f"Отмена процедуры блокировки из состояния: {current_state}")
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("PRE_BAN")
|
||||
)
|
||||
async def ban_by_nickname_step_2(message: types.Message, state: FSMContext):
|
||||
logger.info(
|
||||
f"Функция ban_by_nickname_2. Получен никнейм пользователя: {message.text}")
|
||||
user_name = message.text
|
||||
user_id = BotDB.get_user_id_by_username(user_name)
|
||||
await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None,
|
||||
date_to_unban=None)
|
||||
full_name = BotDB.get_full_name_by_id(user_id)
|
||||
markup = create_keyboard_for_ban_reason()
|
||||
await message.answer(
|
||||
text=f"<b>Выбран пользователь:\nid:</b> {user_id}\n<b>username:</b> {user_name}\n"
|
||||
f"Имя:{full_name}\nВыбери причину бана из списка или напиши ее в чат",
|
||||
reply_markup=markup)
|
||||
await state.set_state('BAN_2')
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("PRE_BAN_ID")
|
||||
)
|
||||
async def ban_by_id_step_2(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
user_id = int(message.text)
|
||||
logger.info(f"Функция ban_by_id_step_2. Получен ID пользователя: {user_id}")
|
||||
|
||||
# Проверяем, существует ли пользователь в базе
|
||||
user_info = BotDB.get_user_info_by_id(user_id)
|
||||
if not user_info:
|
||||
await message.answer(f"Пользователь с ID {user_id} не найден в базе данных.")
|
||||
await state.set_state('ADMIN')
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
return
|
||||
|
||||
user_name = user_info.get('username', 'Неизвестно')
|
||||
full_name = user_info.get('full_name', 'Неизвестно')
|
||||
|
||||
await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None,
|
||||
date_to_unban=None)
|
||||
|
||||
markup = create_keyboard_for_ban_reason()
|
||||
await message.answer(
|
||||
text=f"<b>Выбран пользователь:\nid:</b> {user_id}\n<b>username:</b> {user_name}\n"
|
||||
f"Имя:{full_name}\nВыбери причину бана из списка или напиши ее в чат",
|
||||
reply_markup=markup)
|
||||
await state.set_state('BAN_2')
|
||||
|
||||
except ValueError:
|
||||
await message.answer("Пожалуйста, введите корректный числовой ID пользователя.")
|
||||
await state.set_state('ADMIN')
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("PRE_BAN_FORWARD"),
|
||||
F.forward_from
|
||||
)
|
||||
async def ban_by_forward_step_2(message: types.Message, state: FSMContext):
|
||||
"""Обработчик пересланных сообщений для бана пользователя"""
|
||||
try:
|
||||
# Получаем информацию о пользователе из пересланного сообщения
|
||||
forwarded_user = message.forward_from
|
||||
|
||||
if not forwarded_user:
|
||||
await message.answer("Не удалось получить информацию о пользователе из пересланного сообщения. Возможно, пользователь скрыл возможность пересылки своих сообщений.")
|
||||
await state.set_state('ADMIN')
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
return
|
||||
|
||||
user_id = forwarded_user.id
|
||||
user_name = forwarded_user.username or "private_username"
|
||||
full_name = forwarded_user.full_name or "Неизвестно"
|
||||
|
||||
logger.info(f"Функция ban_by_forward_step_2. Получен пользователь из пересланного сообщения: ID={user_id}, username={user_name}, full_name={full_name}")
|
||||
|
||||
# Проверяем, существует ли пользователь в базе
|
||||
user_info = BotDB.get_user_info_by_id(user_id)
|
||||
if not user_info:
|
||||
# Если пользователя нет в базе, используем информацию из пересланного сообщения
|
||||
logger.info(f"Пользователь с ID {user_id} не найден в базе данных, используем данные из пересланного сообщения")
|
||||
user_name = user_name
|
||||
full_name = full_name
|
||||
else:
|
||||
# Если пользователь есть в базе, используем данные из базы
|
||||
user_name = user_info.get('username', user_name)
|
||||
full_name = user_info.get('full_name', full_name)
|
||||
|
||||
await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None,
|
||||
date_to_unban=None)
|
||||
|
||||
markup = create_keyboard_for_ban_reason()
|
||||
await message.answer(
|
||||
text=f"<b>Выбран пользователь из пересланного сообщения:\nid:</b> {user_id}\n<b>username:</b> {user_name}\n"
|
||||
f"Имя:{full_name}\nВыбери причину бана из списка или напиши ее в чат",
|
||||
reply_markup=markup)
|
||||
await state.set_state('BAN_2')
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при обработке пересланного сообщения: {e}")
|
||||
await message.answer("Произошла ошибка при обработке пересланного сообщения.")
|
||||
await state.set_state('ADMIN')
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("PRE_BAN_FORWARD")
|
||||
)
|
||||
async def ban_by_forward_invalid(message: types.Message, state: FSMContext):
|
||||
"""Обработчик для случаев, когда сообщение не является пересланным или не содержит информацию о пользователе"""
|
||||
if message.forward_from_chat:
|
||||
await message.answer("Пересланное сообщение из канала или группы не содержит информацию о конкретном пользователе. Пожалуйста, перешлите сообщение из приватного чата.")
|
||||
else:
|
||||
await message.answer("Пожалуйста, перешлите сообщение от пользователя, которого хотите заблокировать. Обычное сообщение не подходит.")
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("ADMIN"),
|
||||
F.text == 'Разбан (список)'
|
||||
)
|
||||
async def get_banned_users(message):
|
||||
logger.info(
|
||||
f"Попытка получения списка заблокированных пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
|
||||
message_text = get_banned_users_list(0, BotDB)
|
||||
buttons_list = get_banned_users_buttons(BotDB)
|
||||
if buttons_list:
|
||||
k = create_keyboard_with_pagination(1, len(buttons_list), buttons_list, 'unlock')
|
||||
await message.answer(text=message_text, reply_markup=k)
|
||||
else:
|
||||
await message.answer(text="В списке забанненых пользователей никого нет")
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("BAN_2")
|
||||
)
|
||||
async def ban_user_step_2(message: types.Message, state: FSMContext):
|
||||
user_data = await state.get_data()
|
||||
logger.info(f"Переход на шаг 2 бана пользователя. Словарь с данными для бана: {user_data})")
|
||||
await state.update_data(message_for_user=message.text)
|
||||
markup = create_keyboard_for_ban_days()
|
||||
await message.answer(f"Выбрана причина: {message.text}. Выбери срок бана в днях или напиши "
|
||||
f"его в чат", reply_markup=markup)
|
||||
await state.set_state("BAN_3")
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("BAN_3")
|
||||
)
|
||||
async def ban_user_step_3(message: types.Message, state: FSMContext):
|
||||
logger.info(f"ban_user_step_3. Расчет даты разбана. Входные данные {message.text}")
|
||||
if message.text != 'Навсегда':
|
||||
count_days = int(message.text)
|
||||
date_to_unban = add_days_to_date(count_days)
|
||||
else:
|
||||
date_to_unban = None
|
||||
logger.info(f"ban_user_step_3. Расчет даты разбана. date_to_unban: {date_to_unban}")
|
||||
await state.update_data(date_to_unban=date_to_unban)
|
||||
user_data = await state.get_data()
|
||||
markup = create_keyboard_for_approve_ban()
|
||||
await message.answer(
|
||||
f"Необходимо подтверждение:\nПользователь:{user_data['user_id']}\nПричина бана:{user_data['message_for_user']}\nСрок бана:{user_data['date_to_unban']}",
|
||||
reply_markup=markup)
|
||||
await state.set_state("BAN_FINAL")
|
||||
|
||||
|
||||
@admin_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
StateFilter("BAN_FINAL"),
|
||||
F.text == 'Подтвердить'
|
||||
)
|
||||
async def approve_ban(message: types.Message, state: FSMContext):
|
||||
user_data = await state.get_data()
|
||||
logger.info(f"Переход на финальный шаг бана пользователя. Словарь с данными для бана: {user_data})")
|
||||
exists = BotDB.check_user_in_blacklist(user_data['user_id'])
|
||||
if exists:
|
||||
await message.reply(f"Пользователь уже был заблокирован ранее.")
|
||||
logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)")
|
||||
await state.set_state('ADMIN')
|
||||
else:
|
||||
BotDB.set_user_blacklist(user_data['user_id'],
|
||||
user_data['user_name'],
|
||||
user_data['message_for_user'],
|
||||
user_data['date_to_unban'])
|
||||
await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.")
|
||||
logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)")
|
||||
await state.set_state('ADMIN')
|
||||
markup = get_reply_keyboard_admin()
|
||||
await message.answer('Вернулись в меню', reply_markup=markup)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -7,7 +7,7 @@ from aiogram.types import CallbackQuery
|
||||
|
||||
from helper_bot.keyboards.keyboards import create_keyboard_with_pagination, get_reply_keyboard_admin, \
|
||||
create_keyboard_for_ban_reason
|
||||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||||
from helper_bot.utils.base_dependency_factory import get_global_instance
|
||||
from helper_bot.utils.helper_func import send_text_message, send_photo_message, get_banned_users_list, \
|
||||
get_banned_users_buttons, delete_user_blacklist, send_media_group_to_channel, \
|
||||
send_video_message, send_video_note_message, send_audio_message, send_voice_message
|
||||
@@ -15,7 +15,7 @@ from logs.custom_logger import logger
|
||||
|
||||
callback_router = Router()
|
||||
|
||||
bdf = BaseDependencyFactory()
|
||||
bdf = get_global_instance()
|
||||
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
|
||||
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
|
||||
MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
|
||||
@@ -237,7 +237,7 @@ async def process_ban_user(call: CallbackQuery, state: FSMContext):
|
||||
async def process_unlock_user(call: CallbackQuery):
|
||||
user_id = call.data[7:]
|
||||
user_name = BotDB.get_username(user_id=user_id)
|
||||
delete_user_blacklist(user_id)
|
||||
delete_user_blacklist(user_id, BotDB)
|
||||
logger.info(f"Разблокирован пользователь с ID: {user_id} username:{user_name}")
|
||||
username = BotDB.get_username(user_id)
|
||||
await call.answer(f'Пользователь разблокирован {username}', show_alert=True)
|
||||
@@ -270,12 +270,12 @@ async def change_page(call: CallbackQuery):
|
||||
reply_markup=keyboard)
|
||||
else:
|
||||
# Готовим сообщения
|
||||
message_user = get_banned_users_list(int(page_number) * 7 - 7)
|
||||
message_user = get_banned_users_list(int(page_number) * 7 - 7, BotDB)
|
||||
await call.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
|
||||
text=message_user)
|
||||
|
||||
# Готовим клавиатуру
|
||||
buttons = get_banned_users_buttons()
|
||||
buttons = get_banned_users_buttons(BotDB)
|
||||
keyboard = create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unlock')
|
||||
await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id,
|
||||
reply_markup=keyboard)
|
||||
|
||||
Binary file not shown.
@@ -3,13 +3,13 @@ from aiogram.fsm.context import FSMContext
|
||||
|
||||
from helper_bot.filters.main import ChatTypeFilter
|
||||
from helper_bot.keyboards.keyboards import get_reply_keyboard_leave_chat
|
||||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||||
from helper_bot.utils.base_dependency_factory import get_global_instance
|
||||
from helper_bot.utils.helper_func import send_text_message
|
||||
from logs.custom_logger import logger
|
||||
|
||||
group_router = Router()
|
||||
|
||||
bdf = BaseDependencyFactory()
|
||||
bdf = get_global_instance()
|
||||
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
|
||||
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
|
||||
MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,407 +1,440 @@
|
||||
import random
|
||||
import traceback
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from time import sleep
|
||||
|
||||
from aiogram import types, Router, F
|
||||
from aiogram.filters import Command, StateFilter
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.types import FSInputFile
|
||||
|
||||
from helper_bot.filters.main import ChatTypeFilter
|
||||
from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post
|
||||
from helper_bot.keyboards.keyboards import get_reply_keyboard_leave_chat
|
||||
from helper_bot.middlewares.album_middleware import AlbumMiddleware
|
||||
from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware
|
||||
from helper_bot.utils import messages
|
||||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||||
from helper_bot.utils.helper_func import get_first_name, get_text_message, send_text_message, send_photo_message, \
|
||||
send_media_group_message_to_private_chat, prepare_media_group_from_middlewares, check_username_and_full_name, \
|
||||
send_video_message, send_video_note_message, send_audio_message, send_voice_message, add_in_db_media
|
||||
from logs.custom_logger import logger
|
||||
|
||||
private_router = Router()
|
||||
|
||||
private_router.message.middleware(AlbumMiddleware())
|
||||
private_router.message.middleware(BlacklistMiddleware())
|
||||
|
||||
bdf = BaseDependencyFactory()
|
||||
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
|
||||
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
|
||||
MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
|
||||
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
|
||||
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
|
||||
PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
|
||||
LOGS = bdf.settings['Settings']['logs']
|
||||
TEST = bdf.settings['Settings']['test']
|
||||
|
||||
BotDB = bdf.get_db()
|
||||
|
||||
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
Command("start")
|
||||
)
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == 'Вернуться в бота'
|
||||
)
|
||||
async def handle_start_message(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
full_name = message.from_user.full_name
|
||||
username = message.from_user.username
|
||||
first_name = get_first_name(message)
|
||||
is_bot = message.from_user.is_bot
|
||||
language_code = message.from_user.language_code
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
if not BotDB.user_exists(user_id):
|
||||
BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date,
|
||||
date)
|
||||
else:
|
||||
is_need_update = check_username_and_full_name(user_id, username, full_name)
|
||||
if is_need_update:
|
||||
BotDB.update_username_and_full_name(user_id, username, full_name)
|
||||
await message.answer(
|
||||
f"Давно не виделись! Вижу что ты изменился;) Теперь буду звать тебя: {full_name} и ник @{username}")
|
||||
await message.bot.send_message(chat_id=GROUP_FOR_LOGS,
|
||||
text=f'Для пользователя: {user_id} обновлены данные в БД.\nНовое имя: {full_name}\nНовый ник:{username}')
|
||||
sleep(1)
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
await state.set_state("START")
|
||||
logger.info(
|
||||
f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} "
|
||||
f"Имя автора сообщения: {message.from_user.full_name})")
|
||||
name_stick_hello = list(Path('Stick').rglob('Hello_*'))
|
||||
random_stick_hello = random.choice(name_stick_hello)
|
||||
random_stick_hello = FSInputFile(path=random_stick_hello)
|
||||
logger.info(f"Стикер успешно получен из БД")
|
||||
await message.answer_sticker(random_stick_hello)
|
||||
sleep(0.3)
|
||||
except Exception as e:
|
||||
logger.error(f"Произошла ошибка handle_start_message при получении стикеров. Ошибка:{str(e)}")
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка при получении стикеров: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
try:
|
||||
markup = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
hello_message = messages.get_message(get_first_name(message), 'HELLO_MESSAGE')
|
||||
await message.answer(hello_message, reply_markup=markup, parse_mode='HTML')
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}")
|
||||
await message.bot.send_message(IMPORTANT_LOGS,
|
||||
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("START"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '📢Предложить свой пост'
|
||||
)
|
||||
async def suggest_post(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
await state.set_state("SUGGEST")
|
||||
current_state = await state.get_state()
|
||||
logger.info(
|
||||
f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id}. State - {current_state}")
|
||||
markup = types.ReplyKeyboardRemove()
|
||||
suggest_news = messages.get_message(get_first_name(message), 'SUGGEST_NEWS')
|
||||
await message.answer(suggest_news)
|
||||
sleep(0.3)
|
||||
suggest_news_2 = messages.get_message(get_first_name(message), 'SUGGEST_NEWS_2')
|
||||
await message.answer(suggest_news_2, reply_markup=markup)
|
||||
except Exception as e:
|
||||
await message.bot.send_message(IMPORTANT_LOGS,
|
||||
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '👋🏼Сказать пока!'
|
||||
)
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == 'Выйти из чата'
|
||||
)
|
||||
async def end_message(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
logger.info(
|
||||
f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
name_stick_bye = list(Path('Stick').rglob('Universal_*'))
|
||||
random_stick_bye = random.choice(name_stick_bye)
|
||||
random_stick_bye = FSInputFile(path=random_stick_bye)
|
||||
await message.answer_sticker(random_stick_bye)
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"Ошибка в функции end_message при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
try:
|
||||
markup = types.ReplyKeyboardRemove()
|
||||
bye_message = messages.get_message(get_first_name(message), 'BYE_MESSAGE')
|
||||
await message.answer(bye_message, reply_markup=markup)
|
||||
await state.set_state("START")
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("SUGGEST"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
)
|
||||
async def suggest_router(message: types.Message, state: FSMContext, album: list = None):
|
||||
logger.info(
|
||||
f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
first_name = get_first_name(message)
|
||||
try:
|
||||
post_caption = ''
|
||||
if message.media_group_id is not None:
|
||||
await send_text_message(GROUP_FOR_LOGS, message,
|
||||
f'Закинул медиагруппу, пользователь: имя - {first_name}, ник - {message.from_user.username}')
|
||||
else:
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
if message.content_type == 'text':
|
||||
lower_text = message.text.lower()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
post_text = get_text_message(lower_text, first_name,
|
||||
message.from_user.username)
|
||||
# Получаем клавиатуру для поста
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем сообщение в приватный канал
|
||||
sent_message_id = await send_text_message(GROUP_FOR_POST, message, post_text, markup)
|
||||
|
||||
# Записываем в базу пост
|
||||
BotDB.add_post_in_db(sent_message_id, message.text, message.from_user.id)
|
||||
|
||||
# Отправляем юзеру ответ, что сообщение отравлено и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'photo' and message.media_group_id is None:
|
||||
if message.caption:
|
||||
lower_caption = message.caption.lower()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем фото и текст в приватный канал
|
||||
sent_message = await send_photo_message(GROUP_FOR_POST, message,
|
||||
message.photo[-1].file_id, post_caption, markup)
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'video' and message.media_group_id is None:
|
||||
if message.caption:
|
||||
lower_caption = message.caption.lower()
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
markup = get_reply_keyboard_for_post()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
|
||||
# Отправляем видео и текст в приватный канал
|
||||
sent_message = await send_video_message(GROUP_FOR_POST, message,
|
||||
message.video.file_id, post_caption, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'video_note' and message.media_group_id is None:
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем видеокружок в приватный канал
|
||||
sent_message = await send_video_note_message(GROUP_FOR_POST, message,
|
||||
message.video_note.file_id, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'audio' and message.media_group_id is None:
|
||||
if message.caption:
|
||||
lower_caption = message.caption.lower()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем аудио и текст в приватный канал
|
||||
sent_message = await send_audio_message(GROUP_FOR_POST, message,
|
||||
message.audio.file_id, post_caption, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'voice' and message.media_group_id is None:
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем войс и текст в приватный канал
|
||||
sent_message = await send_voice_message(GROUP_FOR_POST, message,
|
||||
message.voice.file_id, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.media_group_id is not None:
|
||||
post_caption = " "
|
||||
|
||||
# Получаем сообщение и проверяем есть ли подпись. Если подпись есть, то преобразуем ее через функцию
|
||||
if album[0].caption:
|
||||
lower_caption = album[0].caption.lower()
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
|
||||
# Иначе обрабатываем фото и получаем медиагруппу
|
||||
media_group = await prepare_media_group_from_middlewares(album, post_caption)
|
||||
|
||||
# Отправляем медиагруппу в секретный чат
|
||||
media_group_message_id = await send_media_group_message_to_private_chat(GROUP_FOR_POST, message,
|
||||
media_group)
|
||||
sleep(0.2)
|
||||
|
||||
# Получаем клавиатуру и отправляем еще одно текстовое сообщение с кнопками
|
||||
markup = get_reply_keyboard_for_post()
|
||||
help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup)
|
||||
|
||||
# Записываем в state идентификаторы текстового сообщения И последнего сообщения медиагруппы
|
||||
BotDB.update_helper_message_in_db(message_id=media_group_message_id, helper_message_id=help_message_id)
|
||||
|
||||
# Получаем клавиатуру для пользователя, благодарим за пост, и возвращаем в дефолтное сообщение
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
else:
|
||||
await message.bot.send_message(message.chat.id,
|
||||
'Я пока не умею работать с таким сообщением. '
|
||||
'Пришли текст и фото/фоты(ы). А лучше перешли это сообщение админу @kerrad1\n'
|
||||
'Мы добавим его к обработке если необходимо')
|
||||
except Exception as e:
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '🤪Хочу стикеры'
|
||||
)
|
||||
async def stickers(message: types.Message, state: FSMContext):
|
||||
logger.info(
|
||||
f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
markup = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
try:
|
||||
BotDB.update_info_about_stickers(user_id=message.from_user.id)
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
await message.answer(text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk',
|
||||
reply_markup=markup)
|
||||
await state.set_state("START")
|
||||
except Exception as e:
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
logger.error(
|
||||
f"Ошибка функции stickers. Ошибка: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("START"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '📩Связаться с админами'
|
||||
)
|
||||
async def connect_with_admin(message: types.Message, state: FSMContext):
|
||||
logger.info(
|
||||
f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN')
|
||||
await message.answer(admin_message, parse_mode="html")
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
await state.set_state("PRE_CHAT")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("PRE_CHAT"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
)
|
||||
@private_router.message(
|
||||
StateFilter("CHAT"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
)
|
||||
async def resend_message_in_group_for_message(message: types.Message, state: FSMContext):
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
logger.info(
|
||||
f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})")
|
||||
await message.forward(chat_id=GROUP_FOR_MESSAGE)
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date)
|
||||
question = messages.get_message(get_first_name(message), 'QUESTION')
|
||||
user_state = await state.get_state()
|
||||
if user_state == "PRE_CHAT":
|
||||
markup = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
await message.answer(question, reply_markup=markup)
|
||||
await state.set_state("START")
|
||||
elif user_state == "CHAT":
|
||||
markup = get_reply_keyboard_leave_chat()
|
||||
await message.answer(question, reply_markup=markup)
|
||||
import random
|
||||
import traceback
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from time import sleep
|
||||
|
||||
from aiogram import types, Router, F
|
||||
from aiogram.filters import Command, StateFilter
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.types import FSInputFile
|
||||
|
||||
from helper_bot.filters.main import ChatTypeFilter
|
||||
from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post
|
||||
from helper_bot.keyboards.keyboards import get_reply_keyboard_leave_chat
|
||||
from helper_bot.middlewares.album_middleware import AlbumMiddleware
|
||||
from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware
|
||||
from helper_bot.utils import messages
|
||||
from helper_bot.utils.base_dependency_factory import get_global_instance
|
||||
from helper_bot.utils.helper_func import get_first_name, get_text_message, send_text_message, send_photo_message, \
|
||||
send_media_group_message_to_private_chat, prepare_media_group_from_middlewares, check_username_and_full_name, \
|
||||
send_video_message, send_video_note_message, send_audio_message, send_voice_message, add_in_db_media
|
||||
from logs.custom_logger import logger
|
||||
|
||||
private_router = Router()
|
||||
|
||||
private_router.message.middleware(AlbumMiddleware())
|
||||
private_router.message.middleware(BlacklistMiddleware())
|
||||
|
||||
bdf = get_global_instance()
|
||||
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
|
||||
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
|
||||
MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
|
||||
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
|
||||
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
|
||||
PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
|
||||
LOGS = bdf.settings['Settings']['logs']
|
||||
TEST = bdf.settings['Settings']['test']
|
||||
|
||||
BotDB = bdf.get_db()
|
||||
|
||||
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
Command("start")
|
||||
)
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == 'Вернуться в бота'
|
||||
)
|
||||
async def handle_start_message(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
full_name = message.from_user.full_name
|
||||
username = message.from_user.username
|
||||
first_name = get_first_name(message)
|
||||
is_bot = message.from_user.is_bot
|
||||
language_code = message.from_user.language_code
|
||||
user_id = message.from_user.id
|
||||
|
||||
# Проверяем наличие username для логирования
|
||||
if not username:
|
||||
await message.bot.send_message(chat_id=GROUP_FOR_LOGS,
|
||||
text=f'Пользователь {user_id} ({full_name}) обратился к боту без username')
|
||||
logger.warning(f"Пользователь {user_id} ({full_name}) обратился к боту без username")
|
||||
# Устанавливаем значение по умолчанию для username
|
||||
username = "private_username"
|
||||
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
if not BotDB.user_exists(user_id):
|
||||
BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date,
|
||||
date)
|
||||
else:
|
||||
is_need_update = check_username_and_full_name(user_id, username, full_name, BotDB)
|
||||
if is_need_update:
|
||||
BotDB.update_username_and_full_name(user_id, username, full_name)
|
||||
await message.answer(
|
||||
f"Давно не виделись! Вижу что ты изменился;) Теперь буду звать тебя: {full_name} и ник @{username}")
|
||||
await message.bot.send_message(chat_id=GROUP_FOR_LOGS,
|
||||
text=f'Для пользователя: {user_id} обновлены данные в БД.\nНовое имя: {full_name}\nНовый ник:{username}')
|
||||
sleep(1)
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
await state.set_state("START")
|
||||
logger.info(
|
||||
f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} "
|
||||
f"Имя автора сообщения: {message.from_user.full_name})")
|
||||
name_stick_hello = list(Path('Stick').rglob('Hello_*'))
|
||||
random_stick_hello = random.choice(name_stick_hello)
|
||||
random_stick_hello = FSInputFile(path=random_stick_hello)
|
||||
logger.info(f"Стикер успешно получен из БД")
|
||||
await message.answer_sticker(random_stick_hello)
|
||||
sleep(0.3)
|
||||
except Exception as e:
|
||||
logger.error(f"Произошла ошибка handle_start_message при получении стикеров. Ошибка:{str(e)}")
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка при получении стикеров: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
try:
|
||||
markup = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
hello_message = messages.get_message(get_first_name(message), 'HELLO_MESSAGE')
|
||||
await message.answer(hello_message, reply_markup=markup, parse_mode='HTML')
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}")
|
||||
await message.bot.send_message(IMPORTANT_LOGS,
|
||||
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
Command("restart")
|
||||
)
|
||||
async def restart_function(message: types.Message, state: FSMContext):
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
full_name = message.from_user.full_name
|
||||
username = message.from_user.username
|
||||
user_id = message.from_user.id
|
||||
|
||||
# Проверяем наличие username для логирования
|
||||
if not username:
|
||||
await message.bot.send_message(chat_id=GROUP_FOR_LOGS,
|
||||
text=f'Пользователь {user_id} ({full_name}) обратился к боту без username')
|
||||
logger.warning(f"Пользователь {user_id} ({full_name}) обратился к боту без username")
|
||||
# Устанавливаем значение по умолчанию для username
|
||||
username = "private_username"
|
||||
|
||||
markup = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
await message.answer(text='Я перезапущен!',
|
||||
reply_markup=markup)
|
||||
await state.set_state('START')
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("START"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '📢Предложить свой пост'
|
||||
)
|
||||
async def suggest_post(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
await state.set_state("SUGGEST")
|
||||
current_state = await state.get_state()
|
||||
logger.info(
|
||||
f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id}. State - {current_state}")
|
||||
markup = types.ReplyKeyboardRemove()
|
||||
suggest_news = messages.get_message(get_first_name(message), 'SUGGEST_NEWS')
|
||||
await message.answer(suggest_news)
|
||||
sleep(0.3)
|
||||
suggest_news_2 = messages.get_message(get_first_name(message), 'SUGGEST_NEWS_2')
|
||||
await message.answer(suggest_news_2, reply_markup=markup)
|
||||
except Exception as e:
|
||||
await message.bot.send_message(IMPORTANT_LOGS,
|
||||
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '👋🏼Сказать пока!'
|
||||
)
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == 'Выйти из чата'
|
||||
)
|
||||
async def end_message(message: types.Message, state: FSMContext):
|
||||
try:
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
logger.info(
|
||||
f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
name_stick_bye = list(Path('Stick').rglob('Universal_*'))
|
||||
random_stick_bye = random.choice(name_stick_bye)
|
||||
random_stick_bye = FSInputFile(path=random_stick_bye)
|
||||
await message.answer_sticker(random_stick_bye)
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"Ошибка в функции end_message при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
try:
|
||||
markup = types.ReplyKeyboardRemove()
|
||||
bye_message = messages.get_message(get_first_name(message), 'BYE_MESSAGE')
|
||||
await message.answer(bye_message, reply_markup=markup)
|
||||
await state.set_state("START")
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("SUGGEST"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
)
|
||||
async def suggest_router(message: types.Message, state: FSMContext, album: list = None):
|
||||
logger.info(
|
||||
f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
first_name = get_first_name(message)
|
||||
try:
|
||||
post_caption = ''
|
||||
if message.media_group_id is not None:
|
||||
await send_text_message(GROUP_FOR_LOGS, message,
|
||||
f'Закинул медиагруппу, пользователь: имя - {first_name}, ник - {message.from_user.username}')
|
||||
else:
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
if message.content_type == 'text':
|
||||
lower_text = message.text.lower()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
post_text = get_text_message(lower_text, first_name,
|
||||
message.from_user.username)
|
||||
# Получаем клавиатуру для поста
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем сообщение в приватный канал
|
||||
sent_message_id = await send_text_message(GROUP_FOR_POST, message, post_text, markup)
|
||||
|
||||
# Записываем в базу пост
|
||||
BotDB.add_post_in_db(sent_message_id, message.text, message.from_user.id)
|
||||
|
||||
# Отправляем юзеру ответ, что сообщение отравлено и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'photo' and message.media_group_id is None:
|
||||
if message.caption:
|
||||
lower_caption = message.caption.lower()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем фото и текст в приватный канал
|
||||
sent_message = await send_photo_message(GROUP_FOR_POST, message,
|
||||
message.photo[-1].file_id, post_caption, markup)
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message, BotDB)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'video' and message.media_group_id is None:
|
||||
if message.caption:
|
||||
lower_caption = message.caption.lower()
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
markup = get_reply_keyboard_for_post()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
|
||||
# Отправляем видео и текст в приватный канал
|
||||
sent_message = await send_video_message(GROUP_FOR_POST, message,
|
||||
message.video.file_id, post_caption, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message, BotDB)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'video_note' and message.media_group_id is None:
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем видеокружок в приватный канал
|
||||
sent_message = await send_video_note_message(GROUP_FOR_POST, message,
|
||||
message.video_note.file_id, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message, BotDB)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'audio' and message.media_group_id is None:
|
||||
if message.caption:
|
||||
lower_caption = message.caption.lower()
|
||||
# Получаем текст сообщения и преобразовываем его по правилам
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем аудио и текст в приватный канал
|
||||
sent_message = await send_audio_message(GROUP_FOR_POST, message,
|
||||
message.audio.file_id, post_caption, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message, BotDB)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.content_type == 'voice' and message.media_group_id is None:
|
||||
markup = get_reply_keyboard_for_post()
|
||||
|
||||
# Отправляем войс и текст в приватный канал
|
||||
sent_message = await send_voice_message(GROUP_FOR_POST, message,
|
||||
message.voice.file_id, markup)
|
||||
|
||||
# Записываем в базу пост и контент
|
||||
BotDB.add_post_in_db(sent_message.message_id, sent_message.caption, message.from_user.id)
|
||||
await add_in_db_media(sent_message, BotDB)
|
||||
|
||||
# Отправляем юзеру ответ и возвращаем его в меню
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
|
||||
elif message.media_group_id is not None:
|
||||
post_caption = " "
|
||||
|
||||
# Получаем сообщение и проверяем есть ли подпись. Если подпись есть, то преобразуем ее через функцию
|
||||
if album[0].caption:
|
||||
lower_caption = album[0].caption.lower()
|
||||
post_caption = get_text_message(lower_caption, first_name,
|
||||
message.from_user.username)
|
||||
|
||||
# Иначе обрабатываем фото и получаем медиагруппу
|
||||
media_group = await prepare_media_group_from_middlewares(album, post_caption)
|
||||
|
||||
# Отправляем медиагруппу в секретный чат
|
||||
media_group_message_id = await send_media_group_message_to_private_chat(GROUP_FOR_POST, message,
|
||||
media_group, BotDB)
|
||||
sleep(0.2)
|
||||
|
||||
# Получаем клавиатуру и отправляем еще одно текстовое сообщение с кнопками
|
||||
markup = get_reply_keyboard_for_post()
|
||||
help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup)
|
||||
|
||||
# Записываем в state идентификаторы текстового сообщения И последнего сообщения медиагруппы
|
||||
BotDB.update_helper_message_in_db(message_id=media_group_message_id, helper_message_id=help_message_id)
|
||||
|
||||
# Получаем клавиатуру для пользователя, благодарим за пост, и возвращаем в дефолтное сообщение
|
||||
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
success_send_message = messages.get_message(first_name, 'SUCCESS_SEND_MESSAGE')
|
||||
await message.answer(success_send_message, reply_markup=markup_for_user)
|
||||
await state.set_state("START")
|
||||
else:
|
||||
await message.bot.send_message(message.chat.id,
|
||||
'Я пока не умею работать с таким сообщением. '
|
||||
'Пришли текст и фото/фоты(ы). А лучше перешли это сообщение админу @kerrad1\n'
|
||||
'Мы добавим его к обработке если необходимо')
|
||||
except Exception as e:
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '🤪Хочу стикеры'
|
||||
)
|
||||
async def stickers(message: types.Message, state: FSMContext):
|
||||
logger.info(
|
||||
f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
markup = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
try:
|
||||
BotDB.update_info_about_stickers(user_id=message.from_user.id)
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
await message.answer(text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk',
|
||||
reply_markup=markup)
|
||||
await state.set_state("START")
|
||||
except Exception as e:
|
||||
await message.bot.send_message(chat_id=IMPORTANT_LOGS,
|
||||
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
|
||||
logger.error(
|
||||
f"Ошибка функции stickers. Ошибка: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("START"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
F.text == '📩Связаться с админами'
|
||||
)
|
||||
async def connect_with_admin(message: types.Message, state: FSMContext):
|
||||
logger.info(
|
||||
f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN')
|
||||
await message.answer(admin_message, parse_mode="html")
|
||||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||||
await state.set_state("PRE_CHAT")
|
||||
|
||||
|
||||
@private_router.message(
|
||||
StateFilter("PRE_CHAT"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
)
|
||||
@private_router.message(
|
||||
StateFilter("CHAT"),
|
||||
ChatTypeFilter(chat_type=["private"]),
|
||||
)
|
||||
async def resend_message_in_group_for_message(message: types.Message, state: FSMContext):
|
||||
user_id = message.from_user.id
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.update_date_for_user(date, user_id)
|
||||
logger.info(
|
||||
f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})")
|
||||
await message.forward(chat_id=GROUP_FOR_MESSAGE)
|
||||
current_date = datetime.now()
|
||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date)
|
||||
question = messages.get_message(get_first_name(message), 'QUESTION')
|
||||
user_state = await state.get_state()
|
||||
if user_state == "PRE_CHAT":
|
||||
markup = get_reply_keyboard(BotDB, message.from_user.id)
|
||||
await message.answer(question, reply_markup=markup)
|
||||
await state.set_state("START")
|
||||
elif user_state == "CHAT":
|
||||
markup = get_reply_keyboard_leave_chat()
|
||||
await message.answer(question, reply_markup=markup)
|
||||
|
||||
Binary file not shown.
@@ -36,6 +36,8 @@ def get_reply_keyboard_admin():
|
||||
builder = ReplyKeyboardBuilder()
|
||||
builder.add(types.KeyboardButton(text="Бан (Список)"))
|
||||
builder.add(types.KeyboardButton(text="Бан по нику"))
|
||||
builder.add(types.KeyboardButton(text="Бан по ID"))
|
||||
builder.add(types.KeyboardButton(text="Тестовый бан"))
|
||||
builder.add(types.KeyboardButton(text="Разбан (список)"))
|
||||
builder.add(types.KeyboardButton(text="Вернуться в бота"))
|
||||
markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,10 +1,10 @@
|
||||
from typing import Dict, Any
|
||||
|
||||
from aiogram import BaseMiddleware, types
|
||||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||||
from helper_bot.utils.base_dependency_factory import get_global_instance
|
||||
from logs.custom_logger import logger
|
||||
|
||||
bdf = BaseDependencyFactory()
|
||||
bdf = get_global_instance()
|
||||
BotDB = bdf.get_db()
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,35 +1,46 @@
|
||||
import configparser
|
||||
import os
|
||||
import sys
|
||||
|
||||
from database.db import BotDB
|
||||
|
||||
current_dir = os.getcwd()
|
||||
|
||||
|
||||
class BaseDependencyFactory:
|
||||
def __init__(self):
|
||||
# Загрузка настроек из settings.ini
|
||||
config_path = os.path.join(sys.path[0], 'settings.ini')
|
||||
self.config = configparser.ConfigParser()
|
||||
self.config.read(config_path)
|
||||
self.settings = {}
|
||||
self.database = BotDB(current_dir, 'database/tg-bot-database')
|
||||
|
||||
for section in self.config.sections():
|
||||
self.settings[section] = {}
|
||||
for key in self.config[section]:
|
||||
# Преобразование значений в соответствующий тип
|
||||
if key == 'PREVIEW_LINK':
|
||||
self.settings[section][key] = self.config.getboolean(section, key)
|
||||
elif key == 'LOGS' or key == 'TEST':
|
||||
self.settings[section][key] = self.config.getboolean(section, key)
|
||||
else:
|
||||
self.settings[section][key] = self.config.get(section, key)
|
||||
|
||||
def get_settings(self):
|
||||
return self.settings
|
||||
|
||||
def get_db(self) -> BotDB:
|
||||
"""Возвращает подключение к базе данных."""
|
||||
return self.database
|
||||
import configparser
|
||||
import os
|
||||
import sys
|
||||
|
||||
from database.db import BotDB
|
||||
|
||||
current_dir = os.getcwd()
|
||||
|
||||
|
||||
class BaseDependencyFactory:
|
||||
def __init__(self):
|
||||
# Загрузка настроек из settings.ini
|
||||
config_path = os.path.join(sys.path[0], 'settings.ini')
|
||||
self.config = configparser.ConfigParser()
|
||||
self.config.read(config_path)
|
||||
self.settings = {}
|
||||
self.database = BotDB(current_dir, 'tg-bot-database.db')
|
||||
|
||||
for section in self.config.sections():
|
||||
self.settings[section] = {}
|
||||
for key in self.config[section]:
|
||||
# Преобразование значений в соответствующий тип
|
||||
if key == 'PREVIEW_LINK':
|
||||
self.settings[section][key] = self.config.getboolean(section, key)
|
||||
elif key == 'LOGS' or key == 'TEST':
|
||||
self.settings[section][key] = self.config.getboolean(section, key)
|
||||
else:
|
||||
self.settings[section][key] = self.config.get(section, key)
|
||||
|
||||
def get_settings(self):
|
||||
return self.settings
|
||||
|
||||
def get_db(self) -> BotDB:
|
||||
"""Возвращает подключение к базе данных."""
|
||||
return self.database
|
||||
|
||||
|
||||
# Создаем единый экземпляр для всего приложения
|
||||
_global_instance = None
|
||||
|
||||
def get_global_instance():
|
||||
"""Возвращает глобальный экземпляр BaseDependencyFactory."""
|
||||
global _global_instance
|
||||
if _global_instance is None:
|
||||
_global_instance = BaseDependencyFactory()
|
||||
return _global_instance
|
||||
|
||||
@@ -1,389 +1,394 @@
|
||||
import html
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from aiogram import types
|
||||
from aiogram.types import InputMediaPhoto, FSInputFile, InputMediaVideo, InputMediaAudio
|
||||
|
||||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||||
from logs.custom_logger import logger
|
||||
|
||||
bdf = BaseDependencyFactory()
|
||||
|
||||
BotDB = bdf.get_db()
|
||||
|
||||
|
||||
def get_first_name(message: types.Message) -> str:
|
||||
first_name = html.escape(message.from_user.first_name)
|
||||
return first_name
|
||||
|
||||
|
||||
def get_text_message(post_text: str, first_name: str, username: str):
|
||||
"""
|
||||
Форматирует текст сообщения для публикации в зависимости от наличия ключевых слов "анон" и "неанон".
|
||||
|
||||
Args:
|
||||
post_text: Текст сообщения
|
||||
first_name: Имя автора поста
|
||||
username: Юзернейм автора поста
|
||||
|
||||
Returns:
|
||||
str: - Сформированный текст сообщения.
|
||||
"""
|
||||
if "неанон" in post_text or "не анон" in post_text:
|
||||
return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}'
|
||||
elif "анон" in post_text:
|
||||
return f'Пост из ТГ:\n{post_text}\n\nПост опубликован анонимно'
|
||||
else:
|
||||
return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {first_name} @{username}'
|
||||
|
||||
|
||||
async def download_file(message: types.Message, file_id: str):
|
||||
"""
|
||||
Скачивает файл по file_id из Telegram.
|
||||
|
||||
Args:
|
||||
message: сообщение
|
||||
file_id: File ID фотографии
|
||||
filename: Имя файла, под которым будет сохранено фото
|
||||
|
||||
Returns:
|
||||
Путь к сохраненному файлу, если файл был скачан успешно, иначе None
|
||||
"""
|
||||
try:
|
||||
os.makedirs("files", exist_ok=True)
|
||||
os.makedirs("files/photos", exist_ok=True)
|
||||
os.makedirs("files/videos", exist_ok=True)
|
||||
os.makedirs("files/music", exist_ok=True)
|
||||
os.makedirs("files/voice", exist_ok=True)
|
||||
os.makedirs("files/video_notes", exist_ok=True)
|
||||
file = await message.bot.get_file(file_id)
|
||||
file_path = os.path.join("files", file.file_path)
|
||||
await message.bot.download_file(file_path=file.file_path, destination=file_path)
|
||||
return file_path
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка скачивания фотографии: {e}")
|
||||
return None
|
||||
|
||||
|
||||
async def prepare_media_group_from_middlewares(album, post_caption: str = ''):
|
||||
"""
|
||||
Создает MediaGroup.
|
||||
|
||||
Args:
|
||||
album: Album объект из Telegram API.
|
||||
post_caption: Текст подписи к первому фото.
|
||||
|
||||
Returns:
|
||||
Список InputMediaPhoto (MediaGroup).
|
||||
"""
|
||||
media_group = []
|
||||
|
||||
for i, message in enumerate(album):
|
||||
if message.photo:
|
||||
file_id = message.photo[-1].file_id
|
||||
media_type = 'photo'
|
||||
elif message.video:
|
||||
file_id = message.video.file_id
|
||||
media_type = 'video'
|
||||
elif message.audio:
|
||||
file_id = message.audio.file_id
|
||||
media_type = 'audio'
|
||||
else:
|
||||
# Если нет фото, видео или аудио, пропускаем сообщение
|
||||
continue
|
||||
|
||||
# Формируем объект MediaGroup с учетом типа медиа
|
||||
if i == len(album) - 1:
|
||||
if media_type == 'photo':
|
||||
media_group.append(InputMediaPhoto(media=file_id, caption=post_caption))
|
||||
elif media_type == 'video':
|
||||
media_group.append(InputMediaVideo(media=file_id, caption=post_caption))
|
||||
elif media_type == 'audio':
|
||||
media_group.append(InputMediaAudio(media=file_id, caption=post_caption))
|
||||
else:
|
||||
if media_type == 'photo':
|
||||
media_group.append(InputMediaPhoto(media=file_id))
|
||||
elif media_type == 'video':
|
||||
media_group.append(InputMediaVideo(media=file_id))
|
||||
elif media_type == 'audio':
|
||||
media_group.append(InputMediaAudio(media=file_id))
|
||||
|
||||
return media_group # Возвращаем MediaGroup
|
||||
|
||||
|
||||
async def add_in_db_media_mediagroup(sent_message):
|
||||
"""
|
||||
Идентификатор медиа-группы
|
||||
|
||||
Args:
|
||||
sent_message: sent_message объект из Telegram API
|
||||
|
||||
Returns:
|
||||
Список InputFile (FSInputFile).
|
||||
"""
|
||||
media_group_message_id = sent_message[-1].message_id # Получаем идентификатор медиа-группы
|
||||
for i, message in enumerate(sent_message):
|
||||
if message.photo:
|
||||
file_id = message.photo[-1].file_id
|
||||
file_path = await download_file(message, file_id=file_id)
|
||||
BotDB.add_post_content_in_db(media_group_message_id, message.message_id, file_path, 'photo')
|
||||
elif message.video:
|
||||
file_id = message.video.file_id
|
||||
file_path = await download_file(message, file_id=file_id)
|
||||
BotDB.add_post_content_in_db(media_group_message_id, message.message_id, file_path, 'video')
|
||||
else:
|
||||
# Если нет фото, видео или аудио, или другой контент, пропускаем сообщение
|
||||
continue
|
||||
|
||||
|
||||
async def add_in_db_media(sent_message):
|
||||
"""
|
||||
Args:
|
||||
sent_message: sent_message объект из Telegram API
|
||||
|
||||
Returns:
|
||||
Список InputFile (FSInputFile).
|
||||
"""
|
||||
if sent_message.photo:
|
||||
file_id = sent_message.photo[-1].file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'photo')
|
||||
elif sent_message.video:
|
||||
file_id = sent_message.video.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'video')
|
||||
elif sent_message.voice:
|
||||
file_id = sent_message.voice.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'voice')
|
||||
elif sent_message.audio:
|
||||
file_id = sent_message.audio.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'audio')
|
||||
elif sent_message.video_note:
|
||||
file_id = sent_message.video_note.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
BotDB.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'video_note')
|
||||
|
||||
|
||||
async def send_media_group_message_to_private_chat(chat_id: int, message: types.Message,
|
||||
media_group: list[InputMediaPhoto]):
|
||||
sent_message = await message.bot.send_media_group(
|
||||
chat_id=chat_id,
|
||||
media=media_group,
|
||||
)
|
||||
BotDB.add_post_in_db(sent_message[-1].message_id, sent_message[-1].caption, message.from_user.id)
|
||||
await add_in_db_media_mediagroup(sent_message)
|
||||
message_id = sent_message[-1].message_id
|
||||
return message_id
|
||||
|
||||
|
||||
async def send_media_group_to_channel(bot, chat_id: int, post_content: list[tuple[str]], post_text: str):
|
||||
"""
|
||||
Отправляет медиа-группу с подписью к последнему файлу.
|
||||
|
||||
Args:
|
||||
bot: Экземпляр бота aiogram.
|
||||
chat_id: ID чата для отправки.
|
||||
post_content: Список кортежей с путями к файлам.
|
||||
post_text: Текст подписи.
|
||||
"""
|
||||
media = []
|
||||
for file_path in post_content:
|
||||
try:
|
||||
file = FSInputFile(path=file_path[0])
|
||||
type = file_path[1]
|
||||
if type == 'video':
|
||||
media.append(types.InputMediaVideo(media=file))
|
||||
if type == 'photo':
|
||||
media.append(types.InputMediaPhoto(media=file))
|
||||
except FileNotFoundError:
|
||||
logger.error(f"Файл не найден: {file_path[0]}")
|
||||
return
|
||||
|
||||
# Добавляем подпись к последнему файлу
|
||||
if media:
|
||||
media[-1].caption = post_text
|
||||
|
||||
await bot.send_media_group(chat_id=chat_id, media=media)
|
||||
|
||||
|
||||
async def send_text_message(chat_id, message: types.Message, post_text: str, markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_message(
|
||||
chat_id=chat_id,
|
||||
text=post_text
|
||||
)
|
||||
message_id = sent_message.message_id
|
||||
return message_id
|
||||
else:
|
||||
sent_message = await message.bot.send_message(
|
||||
chat_id=chat_id,
|
||||
text=post_text,
|
||||
reply_markup=markup
|
||||
)
|
||||
message_id = sent_message.message_id
|
||||
return message_id
|
||||
|
||||
|
||||
async def send_photo_message(chat_id, message: types.Message, photo: str, post_text: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_photo(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
photo=photo
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_photo(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
photo=photo,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_video_message(chat_id, message: types.Message, video: str, post_text: str = "",
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_video(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
video=video
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_video(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
video=video,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_video_note_message(chat_id, message: types.Message, video_note: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_video_note(
|
||||
chat_id=chat_id,
|
||||
video_note=video_note
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_video_note(
|
||||
chat_id=chat_id,
|
||||
video_note=video_note,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_audio_message(chat_id, message: types.Message, audio: str, post_text: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_audio(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
audio=audio
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_audio(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
audio=audio,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_voice_message(chat_id, message: types.Message, voice: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_voice(
|
||||
chat_id=chat_id,
|
||||
voice=voice
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_voice(
|
||||
chat_id=chat_id,
|
||||
voice=voice,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
def check_access(user_id: int):
|
||||
"""Проверка прав на совершение действий"""
|
||||
return BotDB.is_admin(user_id)
|
||||
|
||||
|
||||
def add_days_to_date(days: int):
|
||||
"""Прибавляет указанное количество дней к текущей дате и возвращает дату в формате DD-MM-YYYY."""
|
||||
current_date = datetime.now()
|
||||
future_date = current_date + timedelta(days=days)
|
||||
formatted_date = future_date.strftime("%d-%m-%Y")
|
||||
return formatted_date
|
||||
|
||||
|
||||
def get_banned_users_list(offset: int):
|
||||
"""
|
||||
Возвращает сообщение со списком пользователей и словарь с ником + идентификатором
|
||||
|
||||
Args:
|
||||
offset: отступ для запроса в базу данных
|
||||
|
||||
Returns:
|
||||
message - текст сообщения
|
||||
user_ids - лист кортежей [(user_name: user_id)]
|
||||
"""
|
||||
users = BotDB.get_banned_users_from_db_with_limits(limit=7, offset=offset)
|
||||
message = "Список заблокированных пользователей:\n"
|
||||
|
||||
for user in users:
|
||||
message += f"Пользователь: {user[0]}\n"
|
||||
message += f"Причина бана: {user[2]}\n"
|
||||
message += f"Дата разбана: {user[3]}\n\n"
|
||||
return message
|
||||
|
||||
|
||||
def get_banned_users_buttons():
|
||||
"""
|
||||
Возвращает сообщение со списком пользователей и словарь с ником + идентификатором
|
||||
|
||||
Args:
|
||||
offset: отступ для запроса в базу данных
|
||||
|
||||
Returns:
|
||||
message - текст сообщения
|
||||
user_ids - лист кортежей [(user_name: user_id)]
|
||||
"""
|
||||
users = BotDB.get_banned_users_from_db()
|
||||
user_ids = []
|
||||
|
||||
for user in users:
|
||||
user_ids.append((user[0], user[1]))
|
||||
return user_ids
|
||||
|
||||
|
||||
def delete_user_blacklist(user_id: int):
|
||||
return BotDB.delete_user_blacklist(user_id=user_id)
|
||||
|
||||
|
||||
def check_username_and_full_name(user_id: int, username: str, full_name: str):
|
||||
username_db, full_name_db = BotDB.get_username_and_full_name(user_id=user_id)
|
||||
return username != username_db or full_name != full_name_db
|
||||
|
||||
|
||||
def unban_notifier(self):
|
||||
# Получение сегодняшней даты в формате DD-MM-YYYY
|
||||
current_date = datetime.now()
|
||||
today = current_date.strftime("%d-%m-%Y")
|
||||
# Получение списка разблокированных пользователей
|
||||
unblocked_users = self.BotDB.get_users_for_unblock_today(today)
|
||||
message = "Разблокированные пользователи:\n"
|
||||
for user_id, user_name in unblocked_users.items():
|
||||
message += f"ID: {user_id}, Имя: {user_name}\n"
|
||||
|
||||
# Отправка сообщения в канал
|
||||
self.bot.send_message(self.GROUP_FOR_MESSAGE, message)
|
||||
import html
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from aiogram import types
|
||||
from aiogram.types import InputMediaPhoto, FSInputFile, InputMediaVideo, InputMediaAudio
|
||||
|
||||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||||
from logs.custom_logger import logger
|
||||
|
||||
|
||||
def get_first_name(message: types.Message) -> str:
|
||||
first_name = html.escape(message.from_user.first_name)
|
||||
return first_name
|
||||
|
||||
|
||||
def get_text_message(post_text: str, first_name: str, username: str = None):
|
||||
"""
|
||||
Форматирует текст сообщения для публикации в зависимости от наличия ключевых слов "анон" и "неанон".
|
||||
|
||||
Args:
|
||||
post_text: Текст сообщения
|
||||
first_name: Имя автора поста
|
||||
username: Юзернейм автора поста (может быть None)
|
||||
|
||||
Returns:
|
||||
str: - Сформированный текст сообщения.
|
||||
"""
|
||||
# Формируем строку с информацией об авторе
|
||||
if username:
|
||||
author_info = f"{first_name} @{username}"
|
||||
else:
|
||||
author_info = f"{first_name} (Ник не указан)"
|
||||
|
||||
if "неанон" in post_text or "не анон" in post_text:
|
||||
return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {author_info}'
|
||||
elif "анон" in post_text:
|
||||
return f'Пост из ТГ:\n{post_text}\n\nПост опубликован анонимно'
|
||||
else:
|
||||
return f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {author_info}'
|
||||
|
||||
|
||||
async def download_file(message: types.Message, file_id: str):
|
||||
"""
|
||||
Скачивает файл по file_id из Telegram.
|
||||
|
||||
Args:
|
||||
message: сообщение
|
||||
file_id: File ID фотографии
|
||||
filename: Имя файла, под которым будет сохранено фото
|
||||
|
||||
Returns:
|
||||
Путь к сохраненному файлу, если файл был скачан успешно, иначе None
|
||||
"""
|
||||
try:
|
||||
os.makedirs("files", exist_ok=True)
|
||||
os.makedirs("files/photos", exist_ok=True)
|
||||
os.makedirs("files/videos", exist_ok=True)
|
||||
os.makedirs("files/music", exist_ok=True)
|
||||
os.makedirs("files/voice", exist_ok=True)
|
||||
os.makedirs("files/video_notes", exist_ok=True)
|
||||
file = await message.bot.get_file(file_id)
|
||||
file_path = os.path.join("files", file.file_path)
|
||||
await message.bot.download_file(file_path=file.file_path, destination=file_path)
|
||||
return file_path
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка скачивания фотографии: {e}")
|
||||
return None
|
||||
|
||||
|
||||
async def prepare_media_group_from_middlewares(album, post_caption: str = ''):
|
||||
"""
|
||||
Создает MediaGroup.
|
||||
|
||||
Args:
|
||||
album: Album объект из Telegram API.
|
||||
post_caption: Текст подписи к первому фото.
|
||||
|
||||
Returns:
|
||||
Список InputMediaPhoto (MediaGroup).
|
||||
"""
|
||||
media_group = []
|
||||
|
||||
for i, message in enumerate(album):
|
||||
if message.photo:
|
||||
file_id = message.photo[-1].file_id
|
||||
media_type = 'photo'
|
||||
elif message.video:
|
||||
file_id = message.video.file_id
|
||||
media_type = 'video'
|
||||
elif message.audio:
|
||||
file_id = message.audio.file_id
|
||||
media_type = 'audio'
|
||||
else:
|
||||
# Если нет фото, видео или аудио, пропускаем сообщение
|
||||
continue
|
||||
|
||||
# Формируем объект MediaGroup с учетом типа медиа
|
||||
if i == len(album) - 1:
|
||||
if media_type == 'photo':
|
||||
media_group.append(InputMediaPhoto(media=file_id, caption=post_caption))
|
||||
elif media_type == 'video':
|
||||
media_group.append(InputMediaVideo(media=file_id, caption=post_caption))
|
||||
elif media_type == 'audio':
|
||||
media_group.append(InputMediaAudio(media=file_id, caption=post_caption))
|
||||
else:
|
||||
if media_type == 'photo':
|
||||
media_group.append(InputMediaPhoto(media=file_id))
|
||||
elif media_type == 'video':
|
||||
media_group.append(InputMediaVideo(media=file_id))
|
||||
elif media_type == 'audio':
|
||||
media_group.append(InputMediaAudio(media=file_id))
|
||||
|
||||
return media_group # Возвращаем MediaGroup
|
||||
|
||||
|
||||
async def add_in_db_media_mediagroup(sent_message, bot_db):
|
||||
"""
|
||||
Идентификатор медиа-группы
|
||||
|
||||
Args:
|
||||
sent_message: sent_message объект из Telegram API
|
||||
bot_db: Экземпляр базы данных
|
||||
|
||||
Returns:
|
||||
Список InputFile (FSInputFile).
|
||||
"""
|
||||
media_group_message_id = sent_message[-1].message_id # Получаем идентификатор медиа-группы
|
||||
for i, message in enumerate(sent_message):
|
||||
if message.photo:
|
||||
file_id = message.photo[-1].file_id
|
||||
file_path = await download_file(message, file_id=file_id)
|
||||
bot_db.add_post_content_in_db(media_group_message_id, message.message_id, file_path, 'photo')
|
||||
elif message.video:
|
||||
file_id = message.video.file_id
|
||||
file_path = await download_file(message, file_id=file_id)
|
||||
bot_db.add_post_content_in_db(media_group_message_id, message.message_id, file_path, 'video')
|
||||
else:
|
||||
# Если нет фото, видео или аудио, или другой контент, пропускаем сообщение
|
||||
continue
|
||||
|
||||
|
||||
async def add_in_db_media(sent_message, bot_db):
|
||||
"""
|
||||
Args:
|
||||
sent_message: sent_message объект из Telegram API
|
||||
bot_db: Экземпляр базы данных
|
||||
|
||||
Returns:
|
||||
Список InputFile (FSInputFile).
|
||||
"""
|
||||
if sent_message.photo:
|
||||
file_id = sent_message.photo[-1].file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
bot_db.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'photo')
|
||||
elif sent_message.video:
|
||||
file_id = sent_message.video.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
bot_db.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'video')
|
||||
elif sent_message.voice:
|
||||
file_id = sent_message.voice.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
bot_db.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'voice')
|
||||
elif sent_message.audio:
|
||||
file_id = sent_message.audio.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
bot_db.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'audio')
|
||||
elif sent_message.video_note:
|
||||
file_id = sent_message.video_note.file_id
|
||||
file_path = await download_file(sent_message, file_id=file_id)
|
||||
bot_db.add_post_content_in_db(sent_message.message_id, sent_message.message_id, file_path, 'video_note')
|
||||
|
||||
|
||||
async def send_media_group_message_to_private_chat(chat_id: int, message: types.Message,
|
||||
media_group: list[InputMediaPhoto], bot_db):
|
||||
sent_message = await message.bot.send_media_group(
|
||||
chat_id=chat_id,
|
||||
media=media_group,
|
||||
)
|
||||
bot_db.add_post_in_db(sent_message[-1].message_id, sent_message[-1].caption, message.from_user.id)
|
||||
await add_in_db_media_mediagroup(sent_message, bot_db)
|
||||
message_id = sent_message[-1].message_id
|
||||
return message_id
|
||||
|
||||
|
||||
async def send_media_group_to_channel(bot, chat_id: int, post_content: list[tuple[str]], post_text: str):
|
||||
"""
|
||||
Отправляет медиа-группу с подписью к последнему файлу.
|
||||
|
||||
Args:
|
||||
bot: Экземпляр бота aiogram.
|
||||
chat_id: ID чата для отправки.
|
||||
post_content: Список кортежей с путями к файлам.
|
||||
post_text: Текст подписи.
|
||||
"""
|
||||
media = []
|
||||
for file_path in post_content:
|
||||
try:
|
||||
file = FSInputFile(path=file_path[0])
|
||||
type = file_path[1]
|
||||
if type == 'video':
|
||||
media.append(types.InputMediaVideo(media=file))
|
||||
if type == 'photo':
|
||||
media.append(types.InputMediaPhoto(media=file))
|
||||
except FileNotFoundError:
|
||||
logger.error(f"Файл не найден: {file_path[0]}")
|
||||
return
|
||||
|
||||
# Добавляем подпись к последнему файлу
|
||||
if media:
|
||||
media[-1].caption = post_text
|
||||
|
||||
await bot.send_media_group(chat_id=chat_id, media=media)
|
||||
|
||||
|
||||
async def send_text_message(chat_id, message: types.Message, post_text: str, markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_message(
|
||||
chat_id=chat_id,
|
||||
text=post_text
|
||||
)
|
||||
message_id = sent_message.message_id
|
||||
return message_id
|
||||
else:
|
||||
sent_message = await message.bot.send_message(
|
||||
chat_id=chat_id,
|
||||
text=post_text,
|
||||
reply_markup=markup
|
||||
)
|
||||
message_id = sent_message.message_id
|
||||
return message_id
|
||||
|
||||
|
||||
async def send_photo_message(chat_id, message: types.Message, photo: str, post_text: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_photo(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
photo=photo
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_photo(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
photo=photo,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_video_message(chat_id, message: types.Message, video: str, post_text: str = "",
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_video(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
video=video
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_video(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
video=video,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_video_note_message(chat_id, message: types.Message, video_note: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_video_note(
|
||||
chat_id=chat_id,
|
||||
video_note=video_note
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_video_note(
|
||||
chat_id=chat_id,
|
||||
video_note=video_note,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_audio_message(chat_id, message: types.Message, audio: str, post_text: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_audio(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
audio=audio
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_audio(
|
||||
chat_id=chat_id,
|
||||
caption=post_text,
|
||||
audio=audio,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
async def send_voice_message(chat_id, message: types.Message, voice: str,
|
||||
markup: types.ReplyKeyboardMarkup = None):
|
||||
if markup is None:
|
||||
sent_message = await message.bot.send_voice(
|
||||
chat_id=chat_id,
|
||||
voice=voice
|
||||
)
|
||||
else:
|
||||
sent_message = await message.bot.send_voice(
|
||||
chat_id=chat_id,
|
||||
voice=voice,
|
||||
reply_markup=markup
|
||||
)
|
||||
return sent_message
|
||||
|
||||
|
||||
def check_access(user_id: int, bot_db):
|
||||
"""Проверка прав на совершение действий"""
|
||||
return bot_db.is_admin(user_id)
|
||||
|
||||
|
||||
def add_days_to_date(days: int):
|
||||
"""Прибавляет указанное количество дней к текущей дате и возвращает дату в формате DD-MM-YYYY."""
|
||||
current_date = datetime.now()
|
||||
future_date = current_date + timedelta(days=days)
|
||||
formatted_date = future_date.strftime("%d-%m-%Y")
|
||||
return formatted_date
|
||||
|
||||
|
||||
def get_banned_users_list(offset: int, bot_db):
|
||||
"""
|
||||
Возвращает сообщение со списком пользователей и словарь с ником + идентификатором
|
||||
|
||||
Args:
|
||||
offset: отступ для запроса в базу данных
|
||||
bot_db: Экземпляр базы данных
|
||||
|
||||
Returns:
|
||||
message - текст сообщения
|
||||
user_ids - лист кортежей [(user_name: user_id)]
|
||||
"""
|
||||
users = bot_db.get_banned_users_from_db_with_limits(limit=7, offset=offset)
|
||||
message = "Список заблокированных пользователей:\n"
|
||||
|
||||
for user in users:
|
||||
message += f"Пользователь: {user[0]}\n"
|
||||
message += f"Причина бана: {user[2]}\n"
|
||||
message += f"Дата разбана: {user[3]}\n\n"
|
||||
return message
|
||||
|
||||
|
||||
def get_banned_users_buttons(bot_db):
|
||||
"""
|
||||
Возвращает сообщение со списком пользователей и словарь с ником + идентификатором
|
||||
|
||||
Args:
|
||||
bot_db: Экземпляр базы данных
|
||||
|
||||
Returns:
|
||||
message - текст сообщения
|
||||
user_ids - лист кортежей [(user_name: user_id)]
|
||||
"""
|
||||
users = bot_db.get_banned_users_from_db()
|
||||
user_ids = []
|
||||
|
||||
for user in users:
|
||||
user_ids.append((user[0], user[1]))
|
||||
return user_ids
|
||||
|
||||
|
||||
def delete_user_blacklist(user_id: int, bot_db):
|
||||
return bot_db.delete_user_blacklist(user_id=user_id)
|
||||
|
||||
|
||||
def check_username_and_full_name(user_id: int, username: str, full_name: str, bot_db):
|
||||
username_db, full_name_db = bot_db.get_username_and_full_name(user_id=user_id)
|
||||
return username != username_db or full_name != full_name_db
|
||||
|
||||
|
||||
def unban_notifier(self):
|
||||
# Получение сегодняшней даты в формате DD-MM-YYYY
|
||||
current_date = datetime.now()
|
||||
today = current_date.strftime("%d-%m-%Y")
|
||||
# Получение списка разблокированных пользователей
|
||||
unblocked_users = self.BotDB.get_users_for_unblock_today(today)
|
||||
message = "Разблокированные пользователи:\n"
|
||||
for user_id, user_name in unblocked_users.items():
|
||||
message += f"ID: {user_id}, Имя: {user_name}\n"
|
||||
|
||||
# Отправка сообщения в канал
|
||||
self.bot.send_message(self.GROUP_FOR_MESSAGE, message)
|
||||
|
||||
@@ -8,6 +8,8 @@ class StateUser(StatesGroup):
|
||||
CHAT = State()
|
||||
PRE_CHAT = State()
|
||||
PRE_BAN = State()
|
||||
PRE_BAN_ID = State()
|
||||
PRE_BAN_FORWARD = State()
|
||||
BAN_2 = State()
|
||||
BAN_3 = State()
|
||||
BAN_4 = State()
|
||||
|
||||
Reference in New Issue
Block a user