From 5c3fece3944cc246316b45f04962aaad1158bf28 Mon Sep 17 00:00:00 2001 From: KatykhinAA Date: Thu, 31 Oct 2024 21:58:46 +0300 Subject: [PATCH] fix with html tags --- .../handlers/callback/callback_handlers.py | 120 +++++---- .../handlers/private/private_handlers.py | 36 +-- helper_bot/keyboards/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 259 -> 264 bytes .../__pycache__/main.cpython-312.pyc | Bin 6478 -> 0 bytes helper_bot/keyboards/keyboards.py | 230 +++++++++--------- .../__pycache__/helper_func.cpython-312.pyc | Bin 17877 -> 17749 bytes .../utils/__pycache__/state.cpython-312.pyc | Bin 673 -> 703 bytes helper_bot/utils/helper_func.py | 4 +- 9 files changed, 207 insertions(+), 185 deletions(-) delete mode 100644 helper_bot/keyboards/__pycache__/main.cpython-312.pyc 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 79d58fdd278ef5ab44f7bb325376d3d4e11a7daf..f1c797eadcdec538b8fae329838ecd1b76e03c34 100644 GIT binary patch delta 45 ycmZo>>R{qM&CAQh00isL&q?!`$eYi_nVnjhl%H6XQarJ-lGE)1gIf_hP#yp)X$>I& delta 40 tcmeBRYG&d+&CAQh00jH$r=~eh3D&`v4|Zg1pwN+3Zwu4 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 5c642c6728e28ec1ffeb5ae787bf378434c019e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6478 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 delta 5921 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 delta 157 zcmdnbx{#IkG%qg~0}$-1pPD8$k++JmYhp*YP$i=#(=E>6lEjkK(Bjl0KTY1r#*BfJ zdl}0a9VfFgY0B~lcDpyY-bAGYL?^R1dKQUH4r0=?7X}(yBmyEtfy6Hko80`A(wtPg jB5@#>5r~UHk{_5E85!?07<^&lWR#e|{gnYofpq}@vvMdV 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): -- 2.49.1