mediaGroup start work

This commit is contained in:
KatykhinAA
2024-07-16 22:25:32 +03:00
parent 3a30edc1ab
commit 88889fe87c
25 changed files with 705 additions and 696 deletions

View File

@@ -1,139 +1,139 @@
import traceback import traceback
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.filters import Command, StateFilter from aiogram.filters import Command, StateFilter
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from helper_bot.filters.main import ChatTypeFilter from helper_bot.filters.main import ChatTypeFilter
from helper_bot.keyboards.main import get_reply_keyboard_admin, create_keyboard_with_pagination, \ from helper_bot.keyboards.main import get_reply_keyboard_admin, create_keyboard_with_pagination, \
create_keyboard_for_ban_days, create_keyboard_for_approve_ban create_keyboard_for_ban_days, create_keyboard_for_approve_ban
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory 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 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 from logs.custom_logger import logger
admin_router = Router() admin_router = Router()
bdf = BaseDependencyFactory() bdf = BaseDependencyFactory()
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
LOGS = bdf.settings['Settings']['logs'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = bdf.get_db() BotDB = bdf.get_db()
@admin_router.message( @admin_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
Command('admin') Command('admin')
) )
async def admin_panel(message: types.Message, state: FSMContext): async def admin_panel(message: types.Message, state: FSMContext):
try: try:
if check_access(message.from_user.id): if check_access(message.from_user.id):
await state.set_state("ADMIN") await state.set_state("ADMIN")
logger.info(f"Запуск админ панели для пользователя: {message.from_user.id}") logger.info(f"Запуск админ панели для пользователя: {message.from_user.id}")
markup = get_reply_keyboard_admin() markup = get_reply_keyboard_admin()
await message.answer("Добро пожаловать в админку. Выбери что хочешь:", await message.answer("Добро пожаловать в админку. Выбери что хочешь:",
reply_markup=markup) reply_markup=markup)
else: else:
await message.answer('Доступ запрещен, досвидания!') await message.answer('Доступ запрещен, досвидания!')
except Exception as e: except Exception as e:
logger.error(f"Ошибка при запуске админ панели: {e}") logger.error(f"Ошибка при запуске админ панели: {e}")
await message.bot.send_message(IMPORTANT_LOGS, await message.bot.send_message(IMPORTANT_LOGS,
f'Ошибка в функции admin_panel {e}. Traceback: {traceback.format_exc()}') f'Ошибка в функции admin_panel {e}. Traceback: {traceback.format_exc()}')
@admin_router.message( @admin_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
StateFilter("ADMIN"), StateFilter("ADMIN"),
F.text == 'Бан (Список)' F.text == 'Бан (Список)'
) )
async def get_last_users(message: types.Message): async def get_last_users(message: types.Message):
logger.info( logger.info(
f"Попытка получения списка последних пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})") f"Попытка получения списка последних пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
list_users = BotDB.get_last_users_from_db() list_users = BotDB.get_last_users_from_db()
keyboard = create_keyboard_with_pagination(1, len(list_users), list_users, 'ban') keyboard = create_keyboard_with_pagination(1, len(list_users), list_users, 'ban')
await message.answer(text="Список пользователей которые последними обращались к боту", await message.answer(text="Список пользователей которые последними обращались к боту",
reply_markup=keyboard) reply_markup=keyboard)
@admin_router.message( @admin_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
StateFilter("ADMIN"), StateFilter("ADMIN"),
F.text == 'Разбан (список)' F.text == 'Разбан (список)'
) )
async def get_banned_users(message): async def get_banned_users(message):
logger.info( logger.info(
f"Попытка получения списка заблокированных пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})") f"Попытка получения списка заблокированных пользователей. Текст сообщения: {message.text} Имя автора сообщения: {message.from_user.full_name})")
message_text = get_banned_users_list(0) message_text = get_banned_users_list(0)
buttons_list = get_banned_users_buttons() buttons_list = get_banned_users_buttons()
if buttons_list: if buttons_list:
k = create_keyboard_with_pagination(1, len(buttons_list), buttons_list, 'unlock') k = create_keyboard_with_pagination(1, len(buttons_list), buttons_list, 'unlock')
await message.answer(text=message_text, reply_markup=k) await message.answer(text=message_text, reply_markup=k)
else: else:
await message.answer(text="В списке забанненых пользователей никого нет") await message.answer(text="В списке забанненых пользователей никого нет")
@admin_router.message( @admin_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
StateFilter("BAN_2") StateFilter("BAN_2")
) )
async def ban_user_step_2(message: types.Message, state: FSMContext): async def ban_user_step_2(message: types.Message, state: FSMContext):
user_data = await state.get_data() user_data = await state.get_data()
logger.info(f"Переход на шаг 2 бана пользователя. Словарь с данными для бана: {user_data})") logger.info(f"Переход на шаг 2 бана пользователя. Словарь с данными для бана: {user_data})")
await state.update_data(message_for_user=message.text) await state.update_data(message_for_user=message.text)
markup = create_keyboard_for_ban_days() markup = create_keyboard_for_ban_days()
await message.answer(f"Выбрана причина: {message.text}. Выбери срок бана в днях или напиши " await message.answer(f"Выбрана причина: {message.text}. Выбери срок бана в днях или напиши "
f"его в чат", reply_markup=markup) f"его в чат", reply_markup=markup)
await state.set_state("BAN_3") await state.set_state("BAN_3")
@admin_router.message( @admin_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
StateFilter("BAN_3") StateFilter("BAN_3")
) )
async def ban_user_step_3(message: types.Message, state: FSMContext): async def ban_user_step_3(message: types.Message, state: FSMContext):
logger.info(f"ban_user_step_3. Расчет даты разбана. Входные данные {message.text}") logger.info(f"ban_user_step_3. Расчет даты разбана. Входные данные {message.text}")
if message.text != 'Навсегда': if message.text != 'Навсегда':
count_days = int(message.text) count_days = int(message.text)
date_to_unban = add_days_to_date(count_days) date_to_unban = add_days_to_date(count_days)
else: else:
date_to_unban = None date_to_unban = None
logger.info(f"ban_user_step_3. Расчет даты разбана. date_to_unban: {date_to_unban}") logger.info(f"ban_user_step_3. Расчет даты разбана. date_to_unban: {date_to_unban}")
await state.update_data(date_to_unban=date_to_unban) await state.update_data(date_to_unban=date_to_unban)
user_data = await state.get_data() user_data = await state.get_data()
markup = create_keyboard_for_approve_ban() markup = create_keyboard_for_approve_ban()
await message.answer( await message.answer(
f"Необходимо подтверждение:\nПользователь:{user_data['user_id']}\nПричина бана:{user_data['message_for_user']}\nСрок бана:{user_data['date_to_unban']}", f"Необходимо подтверждение:\nПользователь:{user_data['user_id']}\nПричина бана:{user_data['message_for_user']}\nСрок бана:{user_data['date_to_unban']}",
reply_markup=markup) reply_markup=markup)
await state.set_state("BAN_FINAL") await state.set_state("BAN_FINAL")
@admin_router.message( @admin_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
StateFilter("BAN_FINAL") StateFilter("BAN_FINAL")
) )
async def approve_ban(message: types.Message, state: FSMContext): async def approve_ban(message: types.Message, state: FSMContext):
user_data = await state.get_data() user_data = await state.get_data()
logger.info(f"Переход на финальный шаг бана пользователя. Словарь с данными для бана: {user_data})") logger.info(f"Переход на финальный шаг бана пользователя. Словарь с данными для бана: {user_data})")
if message.text == 'Подтвердить': if message.text == 'Подтвердить':
exists = BotDB.check_user_in_blacklist(user_data['user_id']) exists = BotDB.check_user_in_blacklist(user_data['user_id'])
if exists: if exists:
await message.reply(f"Пользователь уже был заблокирован ранее.") await message.reply(f"Пользователь уже был заблокирован ранее.")
logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)") logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)")
await state.set_state('ADMIN') await state.set_state('ADMIN')
else: else:
BotDB.set_user_blacklist(user_data['user_id'], BotDB.set_user_blacklist(user_data['user_id'],
user_data['user_name'], user_data['user_name'],
user_data['message_for_user'], user_data['message_for_user'],
user_data['date_to_unban']) user_data['date_to_unban'])
await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.") await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.")
logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)") logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)")
await state.set_state('ADMIN') await state.set_state('ADMIN')
markup = get_reply_keyboard_admin() markup = get_reply_keyboard_admin()
await message.answer('Вернулись в меню', reply_markup=markup) await message.answer('Вернулись в меню', reply_markup=markup)

View File

@@ -1,158 +1,162 @@
import traceback import traceback
from aiogram import Router, F from aiogram import Router, F
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery from aiogram.types import CallbackQuery
from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply_keyboard_admin, \ from helper_bot.keyboards.main import create_keyboard_with_pagination, get_reply_keyboard_admin, \
create_keyboard_for_ban_reason create_keyboard_for_ban_reason
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
from helper_bot.utils.helper_func import send_text_message, send_photo_message, get_banned_users_list, \ from helper_bot.utils.helper_func import send_text_message, send_photo_message, get_banned_users_list, \
get_banned_users_buttons, delete_user_blacklist, get_help_message_id, send_media_group_message get_banned_users_buttons, delete_user_blacklist, get_help_message_id, send_media_group_message
from logs.custom_logger import logger from logs.custom_logger import logger
callback_router = Router() callback_router = Router()
bdf = BaseDependencyFactory() bdf = BaseDependencyFactory()
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
LOGS = bdf.settings['Settings']['logs'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = bdf.get_db() BotDB = bdf.get_db()
@callback_router.callback_query( @callback_router.callback_query(
F.data == "publish" F.data == "publish"
) )
async def post_for_group(call: CallbackQuery, state: FSMContext): async def post_for_group(call: CallbackQuery, state: FSMContext):
logger.info( logger.info(
f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})')
if call.data == 'publish' and call.message.content_type == 'text' and call.message.text != "^": if call.data == 'publish' and call.message.content_type == 'text' and call.message.text != "^":
try: try:
await send_text_message(MAIN_PUBLIC, call.message, call.message.text) await send_text_message(MAIN_PUBLIC, call.message, call.message.text)
await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
logger.info(f'Текст сообщения опубликован в канале {MAIN_PUBLIC}.') logger.info(f'Текст сообщения опубликован в канале {MAIN_PUBLIC}.')
await call.answer(text='Выложено!', show_alert=True, cache_time=3) await call.answer(text='Выложено!', show_alert=True, cache_time=3)
except Exception as e: except Exception as e:
await call.bot.send_message(chat_id=IMPORTANT_LOGS, await call.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
logger.error(f'Ошибка при публикации текста в канал {MAIN_PUBLIC}: {str(e)}') logger.error(f'Ошибка при публикации текста в канал {MAIN_PUBLIC}: {str(e)}')
await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3)
elif call.data == 'publish' and call.message.content_type == 'photo': elif call.data == 'publish' and call.message.content_type == 'photo':
try: try:
await send_photo_message(MAIN_PUBLIC, call.message, call.message.photo[-1].file_id, call.message.caption) await send_photo_message(MAIN_PUBLIC, call.message, call.message.photo[-1].file_id, call.message.caption)
await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
logger.info(f'Пост с фото опубликован в канале {MAIN_PUBLIC}.') logger.info(f'Пост с фото опубликован в канале {MAIN_PUBLIC}.')
await call.answer(text='Выложено!', show_alert=True, cache_time=3) await call.answer(text='Выложено!', show_alert=True, cache_time=3)
except Exception as e: except Exception as e:
await call.bot.send_message(chat_id=IMPORTANT_LOGS, await call.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
logger.error(f'Ошибка при публикации фотографии в канал {MAIN_PUBLIC}: {str(e)}') logger.error(f'Ошибка при публикации фотографии в канал {MAIN_PUBLIC}: {str(e)}')
await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3)
elif call.data == 'publish' and call.message.text == "^": elif call.data == 'publish' and call.message.text == "^":
user_data = await state.get_data() print('Попали куда надо')
media_group_message_id = get_help_message_id(call.message.message_id, user_data) user_data = await state.get_data()
await call.bot.copy_message(chat_id=MAIN_PUBLIC, from_chat_id=GROUP_FOR_POST,message_id=media_group_message_id, reply_markup=None) print(f'В CALLBACK ГЕТ ДАТА: {user_data}')
await call.bot.delete_message(chat_id=MAIN_PUBLIC, message_id=media_group_message_id) media_group_message_id = get_help_message_id(call.message.message_id, user_data)
print(user_data['media_group_message_id']) print(f'ПОЛУЧАЮ МЕССАГ ГРУПП АЙДИ ИЗ ГЕТ ДАТЫ: {media_group_message_id}')
print(user_data['help_message_id']) print(f'ИДЕНТИФИКАТОР СООБЩЕНИЯ У КОТОРОГО ЖМУ КОЛЛБЭК: {call.message.message_id}')
await call.answer(text='Выложено!', show_alert=True, cache_time=3) await call.bot.copy_message(chat_id=MAIN_PUBLIC, from_chat_id=GROUP_FOR_POST, message_id=media_group_message_id, reply_markup=None)
await call.bot.delete_message(chat_id=MAIN_PUBLIC, message_id=media_group_message_id)
@callback_router.callback_query( await call.answer(text='Выложено!', show_alert=True, cache_time=3)
F.data == "decline"
)
async def decline_post_for_group(call: CallbackQuery, state: FSMContext): @callback_router.callback_query(
logger.info( F.data == "decline"
f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})') )
try: async def decline_post_for_group(call: CallbackQuery, state: FSMContext):
if call.message.content_type == 'text' and call.message.text != "^" or call.message.content_type == 'photo':
await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) logger.info(
logger.info( f'Получен callback-запрос с данными: {call.data} от пользователя {call.from_user.full_name} (ID: {call.from_user.id})')
f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).') try:
await call.answer(text='Отклонено!', show_alert=True, cache_time=3) if call.message.content_type == 'text' and call.message.text != "^" or call.message.content_type == 'photo':
if call.message.text == '^': await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
user_data = await state.get_data() logger.info(
media_group_message_id = get_help_message_id(call.message.message_id, user_data) f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).')
await call.bot.delete_message(chat_id=MAIN_PUBLIC, message_id=media_group_message_id) await call.answer(text='Отклонено!', show_alert=True, cache_time=3)
except Exception as e: if call.message.text == '^':
await call.bot.send_message(IMPORTANT_LOGS, user_data = await state.get_data()
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") media_group_message_id = get_help_message_id(call.message.message_id, user_data)
logger.error(f'Ошибка при удалении сообщения в группе {GROUP_FOR_POST}: {str(e)}') await call.bot.delete_message(chat_id=MAIN_PUBLIC, message_id=media_group_message_id)
await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) except Exception as e:
await call.bot.send_message(IMPORTANT_LOGS,
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
@callback_router.callback_query( logger.error(f'Ошибка при удалении сообщения в группе {GROUP_FOR_POST}: {str(e)}')
F.data.contains('ban') await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3)
)
async def process_ban_user(call: CallbackQuery, state: FSMContext):
user_id = call.data[4:] @callback_router.callback_query(
logger.info( F.data.contains('ban')
f"Вызов функции process_ban_user. Данные callback: {call.data} пользователь: {user_id}") )
user_name = BotDB.get_username(user_id=user_id) async def process_ban_user(call: CallbackQuery, state: FSMContext):
if user_name: user_id = call.data[4:]
await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None, logger.info(
date_to_unban=None) f"Вызов функции process_ban_user. Данные callback: {call.data} пользователь: {user_id}")
markup = create_keyboard_for_ban_reason() user_name = BotDB.get_username(user_id=user_id)
await call.message.answer( if user_name:
text=f"<b>Выбран пользователь:\nid:</b> {user_id}\n<b>username:</b> {user_name}\nИмя:{call.message.from_user.full_name}\nВыбери причину бана из списка или напиши ее в чат", await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None,
reply_markup=markup) date_to_unban=None)
await state.set_state('BAN_2') markup = create_keyboard_for_ban_reason()
else: await call.message.answer(
markup = get_reply_keyboard_admin() text=f"<b>Выбран пользователь:\nid:</b> {user_id}\n<b>username:</b> {user_name}\nИмя:{call.message.from_user.full_name}\nВыбери причину бана из списка или напиши ее в чат",
await call.message.answer(text='Пользователь с таким ID не найден в базе', markup=markup) reply_markup=markup)
await state.set_state('ADMIN') await state.set_state('BAN_2')
else:
markup = get_reply_keyboard_admin()
@callback_router.callback_query( await call.message.answer(text='Пользователь с таким ID не найден в базе', markup=markup)
F.data.contains('unlock') await state.set_state('ADMIN')
)
async def process_unlock_user(call: CallbackQuery):
user_id = call.data[7:] @callback_router.callback_query(
user_name = BotDB.get_username(user_id=user_id) F.data.contains('unlock')
delete_user_blacklist(user_id) )
logger.info(f"Разблокирован пользователь с ID: {user_id} username:{user_name}") async def process_unlock_user(call: CallbackQuery):
username = BotDB.get_username(user_id) user_id = call.data[7:]
await call.answer(f'Пользователь разблокирован {username}', show_alert=True) user_name = BotDB.get_username(user_id=user_id)
delete_user_blacklist(user_id)
logger.info(f"Разблокирован пользователь с ID: {user_id} username:{user_name}")
@callback_router.callback_query( username = BotDB.get_username(user_id)
F.data == 'return' await call.answer(f'Пользователь разблокирован {username}', show_alert=True)
)
async def return_to_main_menu(call: CallbackQuery):
await call.message.delete() @callback_router.callback_query(
logger.info(f"Запуск админ панели для пользователя: {call.message.from_user.id}") F.data == 'return'
markup = get_reply_keyboard_admin() )
await call.message.answer("Добро пожаловать в админку. Выбери что хочешь:", async def return_to_main_menu(call: CallbackQuery):
reply_markup=markup) await call.message.delete()
logger.info(f"Запуск админ панели для пользователя: {call.message.from_user.id}")
markup = get_reply_keyboard_admin()
@callback_router.callback_query( await call.message.answer("Добро пожаловать в админку. Выбери что хочешь:",
F.data.contains('page') reply_markup=markup)
)
async def change_page(call: CallbackQuery):
page_number = int(call.data[5:]) @callback_router.callback_query(
logger.info(f"Переход на страницу {page_number}") F.data.contains('page')
if call.message.text == 'Список пользователей которые последними обращались к боту': )
list_users = BotDB.get_last_users_from_db() async def change_page(call: CallbackQuery):
#TODO: Здесь где-то надо добавить обработку ошибки IndexError: list index out of range page_number = int(call.data[5:])
keyboard = create_keyboard_with_pagination(int(page_number), len(list_users), list_users, logger.info(f"Переход на страницу {page_number}")
'ban') if call.message.text == 'Список пользователей которые последними обращались к боту':
list_users = BotDB.get_last_users_from_db()
await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id, #TODO: Здесь где-то надо добавить обработку ошибки IndexError: list index out of range
reply_markup=keyboard) keyboard = create_keyboard_with_pagination(int(page_number), len(list_users), list_users,
else: 'ban')
#Готовим сообщения
message_user = get_banned_users_list(int(page_number) * 7 - 7) await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id,
await call.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, reply_markup=keyboard)
text=message_user) else:
#Готовим сообщения
#Готовим клавиатуру message_user = get_banned_users_list(int(page_number) * 7 - 7)
buttons = get_banned_users_buttons() await call.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
keyboard = create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unlock') text=message_user)
await call.bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.message_id,
reply_markup=keyboard) #Готовим клавиатуру
buttons = get_banned_users_buttons()
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)

View File

@@ -1,50 +1,50 @@
from aiogram import Router, types from aiogram import Router, types
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from helper_bot.filters.main import ChatTypeFilter from helper_bot.filters.main import ChatTypeFilter
from helper_bot.keyboards.main import get_reply_keyboard_leave_chat from helper_bot.keyboards.main import get_reply_keyboard_leave_chat
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
from helper_bot.utils.helper_func import send_text_message from helper_bot.utils.helper_func import send_text_message
from logs.custom_logger import logger from logs.custom_logger import logger
group_router = Router() group_router = Router()
bdf = BaseDependencyFactory() bdf = BaseDependencyFactory()
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
LOGS = bdf.settings['Settings']['logs'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = bdf.get_db() BotDB = bdf.get_db()
@group_router.message( @group_router.message(
ChatTypeFilter(chat_type=["group", "supergroup"]), ChatTypeFilter(chat_type=["group", "supergroup"]),
) )
async def handle_message(message: types.Message, state: FSMContext): async def handle_message(message: types.Message, state: FSMContext):
"""Функция ответа админа пользователю через закрытый чат""" """Функция ответа админа пользователю через закрытый чат"""
logger.info( logger.info(
f'Получено сообщение в группе {message.chat.title} (ID: {message.chat.id}) от пользователя {message.from_user.full_name} (ID: {message.from_user.id}): "{message.text}"') f'Получено сообщение в группе {message.chat.title} (ID: {message.chat.id}) от пользователя {message.from_user.full_name} (ID: {message.from_user.id}): "{message.text}"')
markup = get_reply_keyboard_leave_chat() markup = get_reply_keyboard_leave_chat()
message_id = 0 message_id = 0
try: try:
message_id = message.reply_to_message.message_id message_id = message.reply_to_message.message_id
except AttributeError as e: except AttributeError as e:
await message.answer('Блять, выдели сообщение!') await message.answer('Блять, выдели сообщение!')
logger.warning( logger.warning(
f'В группе {message.chat.title} (ID: {message.chat.id}) админ не выделил сообщение для ответа. Ошибка {str(e)}') f'В группе {message.chat.title} (ID: {message.chat.id}) админ не выделил сообщение для ответа. Ошибка {str(e)}')
message_from_admin = message.text message_from_admin = message.text
try: try:
chat_id = BotDB.get_user_by_message_id(message_id) chat_id = BotDB.get_user_by_message_id(message_id)
await send_text_message(chat_id, message, message_from_admin, markup) await send_text_message(chat_id, message, message_from_admin, markup)
await state.set_state("CHAT") await state.set_state("CHAT")
logger.info(f'Ответ админа "{message.text}" отправлен пользователю с ID: {chat_id} на сообщение {message_id}') logger.info(f'Ответ админа "{message.text}" отправлен пользователю с ID: {chat_id} на сообщение {message_id}')
except TypeError as e: except TypeError as e:
await message.answer('Не могу найти кому ответить в базе, проебали сообщение.') await message.answer('Не могу найти кому ответить в базе, проебали сообщение.')
logger.error( logger.error(
f'Ошибка при поиске пользователя в базе для ответа на сообщение: {message.text} в группе {message.chat.title} (ID сообщения: {message.message_id}) Ошибка: {str(e)}') f'Ошибка при поиске пользователя в базе для ответа на сообщение: {message.text} в группе {message.chat.title} (ID сообщения: {message.message_id}) Ошибка: {str(e)}')

View File

@@ -1,282 +1,284 @@
import random import random
import traceback import traceback
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from time import sleep from time import sleep
from aiogram import types, Router, F from aiogram import types, Router, F
from aiogram.filters import Command, StateFilter from aiogram.filters import Command, StateFilter
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from aiogram.types import FSInputFile from aiogram.types import FSInputFile
from helper_bot.filters.main import ChatTypeFilter from helper_bot.filters.main import ChatTypeFilter
from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post
from helper_bot.keyboards.main import get_reply_keyboard_leave_chat from helper_bot.keyboards.main import get_reply_keyboard_leave_chat
from helper_bot.middlewares.album_middleware import AlbumMiddleware from helper_bot.middlewares.album_middleware import AlbumMiddleware
from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware
from helper_bot.utils import messages from helper_bot.utils import messages
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory 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, \ from helper_bot.utils.helper_func import get_first_name, get_text_message, send_text_message, send_photo_message, \
process_photo_album, send_media_group_message, check_username_and_full_name process_photo_album, send_media_group_message, check_username_and_full_name
from logs.custom_logger import logger from logs.custom_logger import logger
private_router = Router() private_router = Router()
private_router.message.middleware(AlbumMiddleware()) private_router.message.middleware(AlbumMiddleware())
private_router.message.middleware(BlacklistMiddleware()) private_router.message.middleware(BlacklistMiddleware())
bdf = BaseDependencyFactory() bdf = BaseDependencyFactory()
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message'] GROUP_FOR_MESSAGE = bdf.settings['Telegram']['group_for_message']
MAIN_PUBLIC = bdf.settings['Telegram']['main_public'] MAIN_PUBLIC = bdf.settings['Telegram']['main_public']
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs']
PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] PREVIEW_LINK = bdf.settings['Telegram']['preview_link']
LOGS = bdf.settings['Settings']['logs'] LOGS = bdf.settings['Settings']['logs']
TEST = bdf.settings['Settings']['test'] TEST = bdf.settings['Settings']['test']
BotDB = bdf.get_db() BotDB = bdf.get_db()
@private_router.message( @private_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
Command("start") Command("start")
) )
@private_router.message( @private_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
F.text == 'Вернуться в бота' F.text == 'Вернуться в бота'
) )
async def handle_start_message(message: types.Message, state: FSMContext): async def handle_start_message(message: types.Message, state: FSMContext):
try: try:
await message.forward(chat_id=GROUP_FOR_LOGS) await message.forward(chat_id=GROUP_FOR_LOGS)
full_name = message.from_user.full_name full_name = message.from_user.full_name
username = message.from_user.username username = message.from_user.username
first_name = message.from_user.first_name first_name = message.from_user.first_name
is_bot = message.from_user.is_bot is_bot = message.from_user.is_bot
language_code = message.from_user.language_code language_code = message.from_user.language_code
user_id = message.from_user.id user_id = message.from_user.id
current_date = datetime.now() current_date = datetime.now()
date = current_date.strftime("%Y-%m-%d %H:%M:%S") date = current_date.strftime("%Y-%m-%d %H:%M:%S")
if not BotDB.user_exists(user_id): 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, BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date,
date) date)
else: else:
is_need_update = check_username_and_full_name(user_id, username, full_name) is_need_update = check_username_and_full_name(user_id, username, full_name)
if is_need_update: if is_need_update:
BotDB.update_username_and_full_name(user_id, username, full_name) BotDB.update_username_and_full_name(user_id, username, full_name)
await message.answer(f"Давно не виделись! Вижу что ты изменился;) Теперь буду звать тебя: {full_name} и ник @{username}") 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}') await message.bot.send_message(chat_id=GROUP_FOR_LOGS, text=f'Для пользователя: {user_id} обновлены данные в БД.\nНовое имя: {full_name}\nНовый ник:{username}')
sleep(1) sleep(1)
BotDB.update_date_for_user(date, user_id) BotDB.update_date_for_user(date, user_id)
await state.set_state("START") await state.set_state("START")
logger.info( logger.info(
f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} " f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} "
f"Имя автора сообщения: {message.from_user.full_name})") f"Имя автора сообщения: {message.from_user.full_name})")
name_stick_hello = list(Path('Stick').rglob('Hello_*')) name_stick_hello = list(Path('Stick').rglob('Hello_*'))
random_stick_hello = random.choice(name_stick_hello) random_stick_hello = random.choice(name_stick_hello)
random_stick_hello = FSInputFile(path=random_stick_hello) random_stick_hello = FSInputFile(path=random_stick_hello)
logger.info(f"Стикер успешно получен из БД") logger.info(f"Стикер успешно получен из БД")
await message.answer_sticker(random_stick_hello) await message.answer_sticker(random_stick_hello)
sleep(0.3) sleep(0.3)
except Exception as e: except Exception as e:
logger.error(f"Произошла ошибка handle_start_message при получении стикеров. Ошибка:{str(e)}") logger.error(f"Произошла ошибка handle_start_message при получении стикеров. Ошибка:{str(e)}")
await message.bot.send_message(chat_id=IMPORTANT_LOGS, await message.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка при получении стикеров: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") text=f"Произошла ошибка при получении стикеров: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
try: try:
markup = get_reply_keyboard(BotDB, message.from_user.id) markup = get_reply_keyboard(BotDB, message.from_user.id)
hello_message = messages.get_message(get_first_name(message), 'HELLO_MESSAGE') hello_message = messages.get_message(get_first_name(message), 'HELLO_MESSAGE')
await message.answer(hello_message, reply_markup=markup) await message.answer(hello_message, reply_markup=markup)
except Exception as e: except Exception as e:
logger.error( logger.error(
f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}") f"Произошла ошибка при отправке приветственного сообщения для пользователя {message.from_user.id} Имя: {message.from_user.full_name}. Ошибка: {str(e)}")
await message.bot.send_message(IMPORTANT_LOGS, await message.bot.send_message(IMPORTANT_LOGS,
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
@private_router.message( @private_router.message(
StateFilter("START"), StateFilter("START"),
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
F.text == '📢Предложить свой пост' F.text == '📢Предложить свой пост'
) )
async def suggest_post(message: types.Message, state: FSMContext): async def suggest_post(message: types.Message, state: FSMContext):
try: try:
await message.forward(chat_id=GROUP_FOR_LOGS) await message.forward(chat_id=GROUP_FOR_LOGS)
await state.set_state("SUGGEST") await state.set_state("SUGGEST")
current_state = await state.get_state() current_state = await state.get_state()
logger.info( logger.info(
f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id}. State - {current_state}") f"Вызов функции suggest_post. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id}. State - {current_state}")
markup = types.ReplyKeyboardRemove() markup = types.ReplyKeyboardRemove()
suggest_news = messages.get_message(get_first_name(message), 'SUGGEST_NEWS') suggest_news = messages.get_message(get_first_name(message), 'SUGGEST_NEWS')
await message.answer(suggest_news) await message.answer(suggest_news)
sleep(0.3) sleep(0.3)
suggest_news_2 = messages.get_message(get_first_name(message), 'SUGGEST_NEWS_2') suggest_news_2 = messages.get_message(get_first_name(message), 'SUGGEST_NEWS_2')
await message.answer(suggest_news_2, reply_markup=markup) await message.answer(suggest_news_2, reply_markup=markup)
except Exception as e: except Exception as e:
await message.bot.send_message(IMPORTANT_LOGS, await message.bot.send_message(IMPORTANT_LOGS,
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
@private_router.message( @private_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
F.text == '👋🏼Сказать пока!' F.text == '👋🏼Сказать пока!'
) )
@private_router.message( @private_router.message(
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
F.text == 'Выйти из чата' F.text == 'Выйти из чата'
) )
async def end_message(message: types.Message, state: FSMContext): async def end_message(message: types.Message, state: FSMContext):
try: try:
logger.info( logger.info(
f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
name_stick_bye = list(Path('Stick').rglob('Universal_*')) name_stick_bye = list(Path('Stick').rglob('Universal_*'))
random_stick_bye = random.choice(name_stick_bye) random_stick_bye = random.choice(name_stick_bye)
random_stick_bye = FSInputFile(path=random_stick_bye) random_stick_bye = FSInputFile(path=random_stick_bye)
await message.answer_sticker(random_stick_bye) await message.answer_sticker(random_stick_bye)
except Exception as e: except Exception as e:
logger.error( logger.error(
f"Ошибка в функции end_message при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") f"Ошибка в функции end_message при получении стикера: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
await message.bot.send_message(chat_id=IMPORTANT_LOGS, await message.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
try: try:
markup = types.ReplyKeyboardRemove() markup = types.ReplyKeyboardRemove()
bye_message = messages.get_message(get_first_name(message), 'BYE_MESSAGE') bye_message = messages.get_message(get_first_name(message), 'BYE_MESSAGE')
await message.answer(bye_message, reply_markup=markup) await message.answer(bye_message, reply_markup=markup)
await state.set_state("START") await state.set_state("START")
except Exception as e: except Exception as e:
logger.error( logger.error(
f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") f"Ошибка в функции stickers при получении сообщения: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
await message.bot.send_message(chat_id=IMPORTANT_LOGS, await message.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
@private_router.message( @private_router.message(
StateFilter("SUGGEST"), StateFilter("SUGGEST"),
ChatTypeFilter(chat_type=["private"]), ChatTypeFilter(chat_type=["private"]),
) )
async def suggest_router(message: types.Message, state: FSMContext, album: list = None): async def suggest_router(message: types.Message, state: FSMContext, album: list = None):
logger.info( logger.info(
f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") f"Вызов функции suggest_router. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
try: try:
if message.content_type == 'text': if message.content_type == 'text':
lower_text = message.text.lower() lower_text = message.text.lower()
post_text, is_anonymous = get_text_message(lower_text, message.from_user.full_name, post_text, is_anonymous = get_text_message(lower_text, message.from_user.full_name,
message.from_user.username) message.from_user.username)
markup = get_reply_keyboard_for_post() markup = get_reply_keyboard_for_post()
if is_anonymous: if is_anonymous:
await send_text_message(GROUP_FOR_POST, message, post_text, markup) await send_text_message(GROUP_FOR_POST, message, post_text, markup)
else: else:
await send_text_message(GROUP_FOR_POST, message, post_text, markup) await send_text_message(GROUP_FOR_POST, message, post_text, markup)
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE') success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE')
await message.answer(success_send_message, reply_markup=markup_for_user) await message.answer(success_send_message, reply_markup=markup_for_user)
await state.set_state("START") await state.set_state("START")
elif message.content_type == 'photo' and message.media_group_id is None: elif message.content_type == 'photo' and message.media_group_id is None:
lower_caption = message.caption.lower() lower_caption = message.caption.lower()
markup = get_reply_keyboard_for_post() markup = get_reply_keyboard_for_post()
post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name,
message.from_user.username) message.from_user.username)
#TODO: тут какая-то шляпа #TODO: тут какая-то шляпа
if is_anonymous: if is_anonymous:
await send_photo_message(GROUP_FOR_POST, message, await send_photo_message(GROUP_FOR_POST, message,
message.photo[-1].file_id, post_caption, markup) message.photo[-1].file_id, post_caption, markup)
else: else:
await send_photo_message(GROUP_FOR_POST, message, await send_photo_message(GROUP_FOR_POST, message,
message.photo[-1].file_id, post_caption, markup) message.photo[-1].file_id, post_caption, markup)
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE') success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE')
await message.answer(success_send_message, reply_markup=markup_for_user) await message.answer(success_send_message, reply_markup=markup_for_user)
await state.set_state("START") await state.set_state("START")
elif message.media_group_id is not None: elif message.media_group_id is not None:
post_caption = " " post_caption = " "
if album[0].caption: if album[0].caption:
lower_caption = album[0].caption.lower() lower_caption = album[0].caption.lower()
post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name, post_caption, is_anonymous = get_text_message(lower_caption, message.from_user.full_name,
message.from_user.username) message.from_user.username)
media_group = process_photo_album(album, post_caption) media_group = process_photo_album(album, post_caption)
media_group_message_id = await send_media_group_message(GROUP_FOR_POST, message, media_group_message_id = await send_media_group_message(GROUP_FOR_POST, message,
media_group) media_group)
sleep(0.2) print(f'Отправил в чат предложки сообщения, media_group_message_id:{media_group_message_id}\n\n')
markup = get_reply_keyboard_for_post() sleep(0.2)
help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup) markup = get_reply_keyboard_for_post()
await state.update_data(media_group_message_id=media_group_message_id, help_message_id=help_message_id) help_message_id = await send_text_message(GROUP_FOR_POST, message, "^", markup)
await state.update_data(media_group_message_id=media_group_message_id, help_message_id=help_message_id)
markup_for_user = get_reply_keyboard(BotDB, message.from_user.id) d = await state.get_data()
success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE') print(f'ЗАПИСАЛ В state.update_data {d}')
await message.answer(success_send_message, reply_markup=markup_for_user) markup_for_user = get_reply_keyboard(BotDB, message.from_user.id)
await state.set_state("START") success_send_message = messages.get_message(get_first_name(message), 'SUCCESS_SEND_MESSAGE')
else: await message.answer(success_send_message, reply_markup=markup_for_user)
await message.bot.send_message(message.chat.id, await state.set_state("START")
'Я пока не умею работать с таким сообщением. Пришли текст и фото/фоты(ы)') else:
except Exception as e: await message.bot.send_message(message.chat.id,
await message.bot.send_message(chat_id=IMPORTANT_LOGS, 'Я пока не умею работать с таким сообщением. Пришли текст и фото/фоты(ы)')
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") 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 == '🤪Хочу стикеры' @private_router.message(
) ChatTypeFilter(chat_type=["private"]),
async def stickers(message: types.Message, state: FSMContext): F.text == '🤪Хочу стикеры'
logger.info( )
f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") async def stickers(message: types.Message, state: FSMContext):
markup = get_reply_keyboard(BotDB, message.from_user.id) logger.info(
try: f"Вызов функции stickers. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
BotDB.update_info_about_stickers(user_id=message.from_user.id) markup = get_reply_keyboard(BotDB, message.from_user.id)
await message.forward(chat_id=GROUP_FOR_LOGS) try:
await message.answer(text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk', BotDB.update_info_about_stickers(user_id=message.from_user.id)
reply_markup=markup) await message.forward(chat_id=GROUP_FOR_LOGS)
await state.set_state("START") await message.answer(text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk',
except Exception as e: reply_markup=markup)
await message.bot.send_message(chat_id=IMPORTANT_LOGS, await state.set_state("START")
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") except Exception as e:
logger.error( await message.bot.send_message(chat_id=IMPORTANT_LOGS,
f"Ошибка функции stickers. Ошибка: {str(e)} Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") 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"]), @private_router.message(
F.text == '📩Связаться с админами' StateFilter("START"),
) ChatTypeFilter(chat_type=["private"]),
async def connect_with_admin(message: types.Message, state: FSMContext): F.text == '📩Связаться с админами'
logger.info( )
f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") async def connect_with_admin(message: types.Message, state: FSMContext):
admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN') logger.info(
await message.answer(admin_message, parse_mode="html") f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
await message.forward(chat_id=GROUP_FOR_LOGS) admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN')
await state.set_state("PRE_CHAT") 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("PRE_CHAT"),
@private_router.message( ChatTypeFilter(chat_type=["private"]),
StateFilter("CHAT"), )
ChatTypeFilter(chat_type=["private"]), @private_router.message(
) StateFilter("CHAT"),
async def resend_message_in_group_for_message(message: types.Message, state: FSMContext): ChatTypeFilter(chat_type=["private"]),
logger.info( )
f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})") async def resend_message_in_group_for_message(message: types.Message, state: FSMContext):
await message.forward(chat_id=GROUP_FOR_MESSAGE) logger.info(
current_date = datetime.now() f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})")
date = current_date.strftime("%Y-%m-%d %H:%M:%S") await message.forward(chat_id=GROUP_FOR_MESSAGE)
BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date) current_date = datetime.now()
question = messages.get_message(get_first_name(message), 'QUESTION') date = current_date.strftime("%Y-%m-%d %H:%M:%S")
user_state = await state.get_state() BotDB.add_new_message_in_db(message.text, message.from_user.id, message.message_id + 1, date)
if user_state == "PRE_CHAT": question = messages.get_message(get_first_name(message), 'QUESTION')
markup = get_reply_keyboard(BotDB, message.from_user.id) user_state = await state.get_state()
await message.answer(question, reply_markup=markup) if user_state == "PRE_CHAT":
await state.set_state("START") markup = get_reply_keyboard(BotDB, message.from_user.id)
elif user_state == "CHAT": await message.answer(question, reply_markup=markup)
markup = get_reply_keyboard_leave_chat() await state.set_state("START")
await message.answer(question, reply_markup=markup) elif user_state == "CHAT":
markup = get_reply_keyboard_leave_chat()
# @private_router.message( await message.answer(question, reply_markup=markup)
# ChatTypeFilter(chat_type=["private"])
# ) # @private_router.message(
# async def default(message: types.Message, state: FSMContext): # ChatTypeFilter(chat_type=["private"])
# markup = get_reply_keyboard(BotDB, message.from_user.id) # )
# await message.answer('Кажется ты заблудился. Держи клавиатуру, твое состояние сброшено на начало', reply_markup=markup) # async def default(message: types.Message, state: FSMContext):
# await state.set_state("START") # markup = get_reply_keyboard(BotDB, message.from_user.id)
# await message.answer('Кажется ты заблудился. Держи клавиатуру, твое состояние сброшено на начало', reply_markup=markup)
# await state.set_state("START")

View File

@@ -1,21 +1,21 @@
from typing import Dict, Any from typing import Dict, Any
from aiogram import BaseMiddleware, types from aiogram import BaseMiddleware, types
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
from logs.custom_logger import logger from logs.custom_logger import logger
bdf = BaseDependencyFactory() bdf = BaseDependencyFactory()
BotDB = bdf.get_db() BotDB = bdf.get_db()
class BlacklistMiddleware(BaseMiddleware): class BlacklistMiddleware(BaseMiddleware):
async def __call__(self, handler, event: types.Message, data: Dict[str, Any]) -> Any: async def __call__(self, handler, event: types.Message, data: Dict[str, Any]) -> Any:
logger.info(f'Вызов BlacklistMiddleware для пользователя {event.from_user.username}') logger.info(f'Вызов BlacklistMiddleware для пользователя {event.from_user.username}')
if BotDB.check_user_in_blacklist(user_id=event.from_user.id): if BotDB.check_user_in_blacklist(user_id=event.from_user.id):
logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} заблокирован!') logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} заблокирован!')
user_info = BotDB.get_blacklist_users_by_id(event.from_user.id) user_info = BotDB.get_blacklist_users_by_id(event.from_user.id)
await event.answer( await event.answer(
f"<b>Ты заблокирован.</b>\n<b>Причина блокировки:</b> {user_info[2]}\n<b>Дата разбана:</b> {user_info[3]}") f"<b>Ты заблокирован.</b>\n<b>Причина блокировки:</b> {user_info[2]}\n<b>Дата разбана:</b> {user_info[3]}")
return False return False
logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} доступ разрешен') logger.info(f'BlacklistMiddleware результат для пользователя: {event.from_user.username} доступ разрешен')
return await handler(event, data) return await handler(event, data)

View File

@@ -52,6 +52,7 @@ def process_photo_album(album, post_caption: str = ''):
""" """
photo_media = [] photo_media = []
for i, message in enumerate(album): for i, message in enumerate(album):
print(f'message_id в функции process_photo_album: {message.message_id}\n\n')
if i == 0: if i == 0:
photo_media.append(InputMediaPhoto(media=message.photo[-1].file_id, caption=post_caption)) photo_media.append(InputMediaPhoto(media=message.photo[-1].file_id, caption=post_caption))
else: else:
@@ -64,7 +65,9 @@ async def send_media_group_message(chat_id: int, message: types.Message, media_g
chat_id=chat_id, chat_id=chat_id,
media=media_group, media=media_group,
) )
print(f'ПОЛНЫЙ ОБЪЕКТ ОТПРАВЛЕННЫХ СООБЩЕНИЙ : {sent_message}\n\n')
message_id = sent_message[-1].message_id message_id = sent_message[-1].message_id
print(f'ИДЕНТИФИКАТОР ПОСЛЕДНГО СООБЩЕНИЯ: {message_id}')
return message_id return message_id

View File

@@ -1,25 +1,25 @@
import datetime import datetime
import os import os
from loguru import logger from loguru import logger
logger = logger.bind(name='main_log') logger = logger.bind(name='main_log')
# Получение сегодняшней даты для имени файла # Получение сегодняшней даты для имени файла
today = datetime.date.today().strftime('%Y-%m-%d') today = datetime.date.today().strftime('%Y-%m-%d')
# Создание папки для логов # Создание папки для логов
current_dir = os.path.dirname(os.path.abspath(__file__)) current_dir = os.path.dirname(os.path.abspath(__file__))
if not os.path.exists(current_dir): if not os.path.exists(current_dir):
# Если не существует, создаем ее # Если не существует, создаем ее
os.makedirs(current_dir) os.makedirs(current_dir)
filename = f'{current_dir}/helper_bot_{today}.log' filename = f'{current_dir}/helper_bot_{today}.log'
# Настройка формата логов # Настройка формата логов
logger.add( logger.add(
filename, filename,
rotation="00:00", rotation="00:00",
retention="5 days", retention="5 days",
compression="zip", compression="zip",
format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {name} | {line} | {message}", format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {name} | {line} | {message}",
) )

View File

@@ -1,22 +1,22 @@
APScheduler==3.10.4 APScheduler==3.10.4
certifi~=2024.6.2 certifi~=2024.6.2
charset-normalizer==3.3.2 charset-normalizer==3.3.2
coverage==7.5.4 coverage==7.5.4
exceptiongroup==1.2.1 exceptiongroup==1.2.1
idna==3.7 idna==3.7
iniconfig==2.0.0 iniconfig==2.0.0
loguru==0.7.2 loguru==0.7.2
packaging==24.1 packaging==24.1
pluggy==1.5.0 pluggy==1.5.0
pytest==8.2.2 pytest==8.2.2
pytz==2024.1 pytz==2024.1
requests==2.32.3 requests==2.32.3
six==1.16.0 six==1.16.0
tomli==2.0.1 tomli==2.0.1
tzlocal==5.2 tzlocal==5.2
urllib3~=2.2.1 urllib3~=2.2.1
pip~=23.2.1 pip~=23.2.1
attrs~=23.2.0 attrs~=23.2.0
typing_extensions~=4.12.2 typing_extensions~=4.12.2
aiohttp~=3.9.5 aiohttp~=3.9.5
aiogram~=3.10.0 aiogram~=3.10.0