diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 2004810..65afaca 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -1,3 +1,4 @@ +import html import traceback from aiogram import Router, F @@ -33,109 +34,121 @@ BotDB = bdf.get_db() async def post_for_group(call: CallbackQuery, state: FSMContext): logger.info( f'Получен callback-запрос с действием: {call.data} от пользователя {call.from_user.full_name} (ID сообщения: {call.message.message_id})') + text_post = html.escape(str(call.message.text)) + text_post_with_photo = html.escape(str(call.message.caption)) if call.message.content_type == 'text' and call.message.text != "^": try: # Пересылаем сообщение в канал - await send_text_message(MAIN_PUBLIC, call.message, call.message.text) + await send_text_message(MAIN_PUBLIC, call.message, text_post) - # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + # Получаем из базы автора author_id = BotDB.get_author_id_by_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') # Очищаем предложку и удаляем оттуда пост await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) logger.info(f'Текст сообщения опубликован в канале {MAIN_PUBLIC}.') - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + await call.answer(text='Выложено!', cache_time=3) + + # Отвечаем пользователю + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') except Exception as e: - await call.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при публикации текста в канал {MAIN_PUBLIC}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + if e.message != 'Forbidden: bot was blocked by the user': + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации текста в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.content_type == 'photo': 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, text_post_with_photo) # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') # Удаляем пост из предложки await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) logger.info(f'Пост с фото опубликован в канале {MAIN_PUBLIC}.') - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + await call.answer(text='Выложено!', cache_time=3) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') except Exception as e: - await call.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при публикации фотографии в канал {MAIN_PUBLIC}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + if e.message != 'Forbidden: bot was blocked by the user': + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации фотографии в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.content_type == 'video': try: - await send_video_message(MAIN_PUBLIC, call.message, call.message.video.file_id, call.message.caption) + await send_video_message(MAIN_PUBLIC, call.message, call.message.video.file_id, text_post_with_photo) # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) logger.info(f'Пост с видео опубликован в канале {MAIN_PUBLIC}.') - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + await call.answer(text='Выложено!', cache_time=3) + + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') except Exception as e: - await call.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при публикации видео в канал {MAIN_PUBLIC}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + if e.message != 'Forbidden: bot was blocked by the user': + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации видео в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.content_type == 'video_note': try: await send_video_note_message(MAIN_PUBLIC, call.message, call.message.video_note.file_id) # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) logger.info(f'Пост с кружком опубликован в канале {MAIN_PUBLIC}.') - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + await call.answer(text='Выложено!', cache_time=3) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') except Exception as e: - await call.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при публикации кружка в канал {MAIN_PUBLIC}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + if e.message != 'Forbidden: bot was blocked by the user': + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации кружка в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.content_type == 'audio': try: - await send_audio_message(MAIN_PUBLIC, call.message, call.message.audio.file_id, call.message.caption) + await send_audio_message(MAIN_PUBLIC, call.message, call.message.audio.file_id, text_post_with_photo) # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) logger.info(f'Пост с аудио опубликован в канале {MAIN_PUBLIC}.') - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + await call.answer(text='Выложено!', cache_time=3) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') except Exception as e: - await call.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при публикации аудио в канал {MAIN_PUBLIC}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + if e.message != 'Forbidden: bot was blocked by the user': + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации аудио в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.content_type == 'voice': try: await send_voice_message(MAIN_PUBLIC, call.message, call.message.voice.file_id) # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) logger.info(f'Пост с войсом опубликован в канале {MAIN_PUBLIC}.') - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + await call.answer(text='Выложено!', cache_time=3) + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') except Exception as e: - await call.bot.send_message(chat_id=IMPORTANT_LOGS, - text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при публикации войса в канал {MAIN_PUBLIC}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + if e.message != 'Forbidden: bot was blocked by the user': + await call.bot.send_message(chat_id=IMPORTANT_LOGS, + text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при публикации войса в канал {MAIN_PUBLIC}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) elif call.message.text == "^": # Получаем контент медиагруппы и текст для публикации post_content = BotDB.get_post_content_from_telegram_by_last_id(call.message.message_id) - post_text = BotDB.get_post_text_from_telegram_by_last_id(call.message.message_id) + pre_text = BotDB.get_post_text_from_telegram_by_last_id(call.message.message_id) + post_text = html.escape(str(pre_text)) # Готовим список для удаления post_ids = BotDB.get_post_ids_from_telegram_by_last_id(call.message.message_id) @@ -148,11 +161,12 @@ async def post_for_group(call: CallbackQuery, state: FSMContext): # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_helper_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') # TODO: Удалить фотки с локалки после выкладки? await call.bot.delete_messages(chat_id=GROUP_FOR_POST, message_ids=message_ids) - await call.answer(text='Выложено!', show_alert=True, cache_time=3) + await call.answer(text='Выложено!', cache_time=3) + + await send_text_message(author_id, call.message, 'Твой пост был выложен🥰') @callback_router.callback_query( @@ -169,11 +183,11 @@ async def decline_post_for_group(call: CallbackQuery, state: FSMContext): # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был отклонен😔') logger.info( f'Сообщение отклонено админом {call.from_user.full_name} (ID: {call.from_user.id}).') - await call.answer(text='Отклонено!', show_alert=True, cache_time=3) + await call.answer(text='Отклонено!', cache_time=3) + await send_text_message(author_id, call.message, 'Твой пост был отклонен😔') if call.message.text == '^': post_ids = BotDB.get_post_ids_from_telegram_by_last_id(call.message.message_id) message_ids = [row[0] for row in post_ids] @@ -183,14 +197,16 @@ async def decline_post_for_group(call: CallbackQuery, state: FSMContext): # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки author_id = BotDB.get_author_id_by_helper_message_id(call.message.message_id) - await send_text_message(author_id, call.message, 'Твой пост был отклонен😔') - await call.answer(text='Удалено!', show_alert=True, cache_time=3) + await call.answer(text='Удалено!', cache_time=3) + + await send_text_message(author_id, call.message, 'Твой пост был отклонен😔') except Exception as e: - await call.bot.send_message(IMPORTANT_LOGS, - f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") - logger.error(f'Ошибка при удалении сообщения в группе {GROUP_FOR_POST}: {str(e)}') - await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) + if e.message != 'Forbidden: bot was blocked by the user': + await call.bot.send_message(IMPORTANT_LOGS, + f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + logger.error(f'Ошибка при удалении сообщения в группе {GROUP_FOR_POST}: {str(e)}') + await call.answer(text='Что-то пошло не так!', show_alert=True, cache_time=3) @callback_router.callback_query( diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index 43bc111..d0ab731 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -52,7 +52,7 @@ async def handle_start_message(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 - first_name = message.from_user.first_name + 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 @@ -86,10 +86,9 @@ async def handle_start_message(message: types.Message, state: FSMContext): 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) + 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)}") @@ -169,14 +168,19 @@ async def end_message(message: types.Message, state: FSMContext): 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, message.from_user.full_name, + post_text = get_text_message(lower_text, first_name, message.from_user.username) - # Получаем клавиатуру для поста markup = get_reply_keyboard_for_post() @@ -188,7 +192,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Отправляем юзеру ответ, что сообщение отравлено и возвращаем его в меню 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(first_name, 'SUCCESS_SEND_MESSAGE') await message.answer(success_send_message, reply_markup=markup_for_user) await state.set_state("START") @@ -196,7 +200,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list if message.caption: lower_caption = message.caption.lower() # Получаем текст сообщения и преобразовываем его по правилам - post_caption = get_text_message(lower_caption, message.from_user.full_name, + post_caption = get_text_message(lower_caption, first_name, message.from_user.username) markup = get_reply_keyboard_for_post() @@ -209,14 +213,14 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Отправляем юзеру ответ и возвращаем его в меню 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(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, message.from_user.full_name, + post_caption = get_text_message(lower_caption, first_name, message.from_user.username) markup = get_reply_keyboard_for_post() # Получаем текст сообщения и преобразовываем его по правилам @@ -235,7 +239,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Отправляем юзеру ответ и возвращаем его в меню 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(first_name, 'SUCCESS_SEND_MESSAGE') await message.answer(success_send_message, reply_markup=markup_for_user) await state.set_state("START") @@ -252,7 +256,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Отправляем юзеру ответ и возвращаем его в меню 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(first_name, 'SUCCESS_SEND_MESSAGE') await message.answer(success_send_message, reply_markup=markup_for_user) await state.set_state("START") @@ -260,7 +264,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list if message.caption: lower_caption = message.caption.lower() # Получаем текст сообщения и преобразовываем его по правилам - post_caption = get_text_message(lower_caption, message.from_user.full_name, + post_caption = get_text_message(lower_caption, first_name, message.from_user.username) markup = get_reply_keyboard_for_post() @@ -274,7 +278,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Отправляем юзеру ответ и возвращаем его в меню 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(first_name, 'SUCCESS_SEND_MESSAGE') await message.answer(success_send_message, reply_markup=markup_for_user) await state.set_state("START") @@ -291,7 +295,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Отправляем юзеру ответ и возвращаем его в меню 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(first_name, 'SUCCESS_SEND_MESSAGE') await message.answer(success_send_message, reply_markup=markup_for_user) await state.set_state("START") @@ -301,7 +305,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Получаем сообщение и проверяем есть ли подпись. Если подпись есть, то преобразуем ее через функцию if album[0].caption: lower_caption = album[0].caption.lower() - post_caption = get_text_message(lower_caption, message.from_user.full_name, + post_caption = get_text_message(lower_caption, first_name, message.from_user.username) # Иначе обрабатываем фото и получаем медиагруппу @@ -321,7 +325,7 @@ async def suggest_router(message: types.Message, state: FSMContext, album: list # Получаем клавиатуру для пользователя, благодарим за пост, и возвращаем в дефолтное сообщение 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(first_name, 'SUCCESS_SEND_MESSAGE') await message.answer(success_send_message, reply_markup=markup_for_user) await state.set_state("START") else: diff --git a/helper_bot/keyboards/__init__.py b/helper_bot/keyboards/__init__.py index 4810ecf..583ba47 100644 --- a/helper_bot/keyboards/__init__.py +++ b/helper_bot/keyboards/__init__.py @@ -1 +1 @@ -from .keyboards import get_reply_keyboard_for_post, get_reply_keyboard +from .keyboards import get_reply_keyboard_for_post, get_reply_keyboard diff --git a/helper_bot/keyboards/__pycache__/__init__.cpython-312.pyc b/helper_bot/keyboards/__pycache__/__init__.cpython-312.pyc index 79d58fd..f1c797e 100644 Binary files a/helper_bot/keyboards/__pycache__/__init__.cpython-312.pyc and b/helper_bot/keyboards/__pycache__/__init__.cpython-312.pyc differ diff --git a/helper_bot/keyboards/__pycache__/main.cpython-312.pyc b/helper_bot/keyboards/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 5c642c6..0000000 Binary files a/helper_bot/keyboards/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/helper_bot/keyboards/keyboards.py b/helper_bot/keyboards/keyboards.py index 42a19a2..e3a56ef 100644 --- a/helper_bot/keyboards/keyboards.py +++ b/helper_bot/keyboards/keyboards.py @@ -1,115 +1,115 @@ -from aiogram import types -from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder - - -def get_reply_keyboard_for_post(): - builder = InlineKeyboardBuilder() - builder.row(types.InlineKeyboardButton( - text="Опубликовать", callback_data="publish") - ) - builder.row(types.InlineKeyboardButton( - text="Отклонить", callback_data="decline") - ) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def get_reply_keyboard(BotDB, user_id): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="📢Предложить свой пост")) - builder.add(types.KeyboardButton(text="📩Связаться с админами")) - builder.add(types.KeyboardButton(text="👋🏼Сказать пока!")) - if not BotDB.get_info_about_stickers(user_id=user_id): - builder.add(types.KeyboardButton(text="🤪Хочу стикеры")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def get_reply_keyboard_leave_chat(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Выйти из чата")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def get_reply_keyboard_admin(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Бан (Список)")) - 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) - return markup - - -def create_keyboard_with_pagination(page: int, total_items: int, array_items: list[tuple[any, any]], callback: str): - """ - Создает клавиатуру с пагинацией для заданного набора элементов и устанавливает необходимый callback - - Args: - page: Номер текущей страницы. - total_items: Общее количество элементов. - array_items: Лист кортежей. Содержит в себе user_name: user_id - callback: Действие в коллбеке. Вернет callback вида ({callback}_{user_id}) - - Returns: - InlineKeyboardMarkup: Клавиатура с кнопками пагинации. - """ - - # Определяем общее количество страниц - total_pages = (total_items + 9 - 1) // 9 - - # Создаем билдер для клавиатуры - keyboard = InlineKeyboardBuilder() - # Вычисляем стартовый номер для текущей страницы - start_index = (page - 1) * 9 - - # Кнопки с номерами страниц - for i in range(start_index, min(start_index + 9, len(array_items))): - keyboard.add(types.InlineKeyboardButton( - text=f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}" - )) - keyboard.adjust(3) - - next_button = types.InlineKeyboardButton( - text="➡️ Следующая", callback_data=f"page_{page + 1}" - ) - prev_button = types.InlineKeyboardButton( - text="⬅️ Предыдущая", callback_data=f"page_{page - 1}" - ) - keyboard.row(prev_button, next_button) - home_button = types.InlineKeyboardButton( - text="🏠 Назад", callback_data="return") - keyboard.row(home_button) - k = keyboard.as_markup() - return k - - -def create_keyboard_for_ban_reason(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Спам")) - builder.add(types.KeyboardButton(text="Заебал стикерами")) - builder.row(types.KeyboardButton(text="Реклама здесь: @kerrad1 ")) - builder.row(types.KeyboardButton(text="Тема с лагерями: https://vk.com/topic-75343895_50049913")) - builder.row(types.KeyboardButton(text="Отменить")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def create_keyboard_for_ban_days(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="1")) - builder.add(types.KeyboardButton(text="7")) - builder.add(types.KeyboardButton(text="30")) - builder.row(types.KeyboardButton(text="Навсегда")) - builder.row(types.KeyboardButton(text="Отменить")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup - - -def create_keyboard_for_approve_ban(): - builder = ReplyKeyboardBuilder() - builder.add(types.KeyboardButton(text="Подтвердить")) - builder.add(types.KeyboardButton(text="Отменить")) - markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) - return markup +from aiogram import types +from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder + + +def get_reply_keyboard_for_post(): + builder = InlineKeyboardBuilder() + builder.row(types.InlineKeyboardButton( + text="Опубликовать", callback_data="publish") + ) + builder.row(types.InlineKeyboardButton( + text="Отклонить", callback_data="decline") + ) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def get_reply_keyboard(BotDB, user_id): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="📢Предложить свой пост")) + builder.add(types.KeyboardButton(text="📩Связаться с админами")) + builder.add(types.KeyboardButton(text="👋🏼Сказать пока!")) + if not BotDB.get_info_about_stickers(user_id=user_id): + builder.add(types.KeyboardButton(text="🤪Хочу стикеры")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def get_reply_keyboard_leave_chat(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Выйти из чата")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def get_reply_keyboard_admin(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Бан (Список)")) + 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) + return markup + + +def create_keyboard_with_pagination(page: int, total_items: int, array_items: list[tuple[any, any]], callback: str): + """ + Создает клавиатуру с пагинацией для заданного набора элементов и устанавливает необходимый callback + + Args: + page: Номер текущей страницы. + total_items: Общее количество элементов. + array_items: Лист кортежей. Содержит в себе user_name: user_id + callback: Действие в коллбеке. Вернет callback вида ({callback}_{user_id}) + + Returns: + InlineKeyboardMarkup: Клавиатура с кнопками пагинации. + """ + + # Определяем общее количество страниц + total_pages = (total_items + 9 - 1) // 9 + + # Создаем билдер для клавиатуры + keyboard = InlineKeyboardBuilder() + # Вычисляем стартовый номер для текущей страницы + start_index = (page - 1) * 9 + + # Кнопки с номерами страниц + for i in range(start_index, min(start_index + 9, len(array_items))): + keyboard.add(types.InlineKeyboardButton( + text=f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}" + )) + keyboard.adjust(3) + + next_button = types.InlineKeyboardButton( + text="➡️ Следующая", callback_data=f"page_{page + 1}" + ) + prev_button = types.InlineKeyboardButton( + text="⬅️ Предыдущая", callback_data=f"page_{page - 1}" + ) + keyboard.row(prev_button, next_button) + home_button = types.InlineKeyboardButton( + text="🏠 Назад", callback_data="return") + keyboard.row(home_button) + k = keyboard.as_markup() + return k + + +def create_keyboard_for_ban_reason(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Спам")) + builder.add(types.KeyboardButton(text="Заебал стикерами")) + builder.row(types.KeyboardButton(text="Реклама здесь: @kerrad1 ")) + builder.row(types.KeyboardButton(text="Тема с лагерями: https://vk.com/topic-75343895_50049913")) + builder.row(types.KeyboardButton(text="Отменить")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def create_keyboard_for_ban_days(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="1")) + builder.add(types.KeyboardButton(text="7")) + builder.add(types.KeyboardButton(text="30")) + builder.row(types.KeyboardButton(text="Навсегда")) + builder.row(types.KeyboardButton(text="Отменить")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup + + +def create_keyboard_for_approve_ban(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="Подтвердить")) + builder.add(types.KeyboardButton(text="Отменить")) + markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) + return markup diff --git a/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc b/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc index b84c58a..52f8de6 100644 Binary files a/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc and b/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc differ diff --git a/helper_bot/utils/__pycache__/state.cpython-312.pyc b/helper_bot/utils/__pycache__/state.cpython-312.pyc index edaf806..9b45a9d 100644 Binary files a/helper_bot/utils/__pycache__/state.cpython-312.pyc and b/helper_bot/utils/__pycache__/state.cpython-312.pyc differ diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index db5c44a..185308f 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -1,3 +1,4 @@ +import html import os from datetime import datetime, timedelta @@ -13,7 +14,8 @@ BotDB = bdf.get_db() def get_first_name(message: types.Message) -> str: - return message.from_user.first_name + first_name = html.escape(message.from_user.first_name) + return first_name def get_text_message(post_text: str, first_name: str, username: str):