diff --git a/database/db.py b/database/db.py index 2fd98ed..425e2d1 100644 --- a/database/db.py +++ b/database/db.py @@ -726,7 +726,6 @@ class BotDB: (emoji, user_id,)) self.conn.commit() self.logger.info(f"Эмоджи обновлен для пользователя: user_id={user_id}") - return None except sqlite3.Error as error: self.logger.error(f"Ошибка обновления эмодзи для пользователя: {error}") return error @@ -744,21 +743,19 @@ class BotDB: True, если эмодзи такого нет, иначе False. Raises: - None: В случае ошибки возвращается None + error: В случае ошибки возвращается error """ self.logger.info(f"Запуск функции check_emoji_for_user: user_id={user_id}") try: self.connect() self.cursor.execute("SELECT emoji FROM our_users WHERE user_id = ?", (user_id,)) pre_result = self.cursor.fetchone() - if pre_result is not None: - print(f'Результат функции check_emoji_for_user - {str(pre_result[0])}') - return str(pre_result[0]) - else: - return None + # Возвращаем "Смайл не определен", если pre_result или pre_result[0] is None + result = pre_result[0] if pre_result else None + return str(result) if result is not None else "Смайл еще не определен" except sqlite3.Error as error: self.logger.error(f"Ошибка проверки эмодзи в базе: {error}") - return None + return error finally: self.close() @@ -1079,7 +1076,7 @@ class BotDB: self.logger.error(f"Ошибка в функции set_user_id_and_message_id_for_voice_bot {str(e)}") def get_user_id_by_file_name(self, file_name: str): - self.logger.info(f"Запуск функции get_user_id_by_file_name, идентификатор поста " + self.logger.info(f"Запуск функции get_user_id_by_file_name, идентификатор файла " f"{file_name}") try: self.connect() @@ -1087,11 +1084,25 @@ class BotDB: "FROM audio_message_reference WHERE file_name = ?", (file_name,)) user_id = result.fetchone()[0] - self.logger.info(f"Функция get_user_id_by_file_name получила author_id {user_id}") + self.logger.info(f"Функция get_user_id_by_file_name получила user_id {user_id}") return user_id except Exception as e: self.logger.error(f"Ошибка в функции get_user_id_by_file_name {str(e)}") + def get_date_by_file_name(self, file_name: str): + self.logger.info(f"Запуск функции get_date_by_file_name, идентификатор файла " + f"{file_name}") + try: + self.connect() + result = self.cursor.execute("SELECT date_added " + "FROM audio_message_reference WHERE file_name = ?", + (file_name,)) + date_added = result.fetchone()[0] + self.logger.info(f"Функция get_date_by_file_name получила date_added {date_added}") + return date_added + except Exception as e: + self.logger.error(f"Ошибка в функции get_date_by_file_name {str(e)}") + def add_post_content_in_db(self, post_id: int, message_id: int, content_name: str, type_content: str): self.logger.info( f"Запуск функции add_post_content_in_db: post_id={post_id}, message_id={message_id}, " @@ -1162,7 +1173,7 @@ class BotDB: f"date_added = {date_added}") return None except sqlite3.Error as error: - print(error) + self.logger.error(f"Ошибка при добавлении войса в базу: {error}") raise finally: self.close() diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index 22b2381..5953dee 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -40,6 +40,17 @@ TEST = bdf.settings['Settings']['test'] BotDB = bdf.get_db() +@private_router.message( + ChatTypeFilter(chat_type=["private"]), + Command("emoji") +) +async def handle_emoji_message(message: types.Message, state: FSMContext): + user_emoji = check_user_emoji(message) + await state.set_state("START") + if user_emoji is not None: + await message.answer(f'Твоя эмодзя - {user_emoji}', parse_mode='HTML') + + @private_router.message( ChatTypeFilter(chat_type=["private"]), Command("restart") @@ -50,7 +61,7 @@ async def handle_restart_message(message: types.Message, state: FSMContext): await message.forward(chat_id=GROUP_FOR_LOGS) await state.set_state("START") await update_user_info('love', message) - check_user_emoji(message.from_user.id) + check_user_emoji(message) await message.answer('Я перезапущен!', reply_markup=markup, parse_mode='HTML') except Exception as e: logger.error(f"Произошла ошибка handle_restart_message. Ошибка:{str(e)}") @@ -70,7 +81,7 @@ async def handle_start_message(message: types.Message, state: FSMContext): try: await message.forward(chat_id=GROUP_FOR_LOGS) await update_user_info('love', message) - check_user_emoji(message.from_user.id) + check_user_emoji(message) await state.set_state("START") logger.info( f"Формирование приветственного сообщения для пользователя. Сообщение: {message.text} " diff --git a/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc b/helper_bot/utils/__pycache__/helper_func.cpython-312.pyc index d158870..80a80d9 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__/messages.cpython-312.pyc b/helper_bot/utils/__pycache__/messages.cpython-312.pyc index 177f9a6..abd9cca 100644 Binary files a/helper_bot/utils/__pycache__/messages.cpython-312.pyc and b/helper_bot/utils/__pycache__/messages.cpython-312.pyc differ diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index facd583..21e4076 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -424,19 +424,21 @@ async def update_user_info(source: str, message: types.Message): BotDB.update_date_for_user(date, user_id) -def check_user_emoji(user_id: int): - if BotDB.check_emoji_for_user(user_id=user_id) is None: +def check_user_emoji(message: types.Message): + user_id = message.from_user.id + user_emoji = BotDB.check_emoji_for_user(user_id=user_id) + if user_emoji is None: user_emoji = get_random_emoji() BotDB.update_emoji_for_user(user_id=user_id, emoji=user_emoji) + return user_emoji def get_random_emoji(): attempts = 0 while attempts < 100: - print(attempts) user_emoji = random.choice(emoji_list) if not BotDB.check_emoji(user_emoji): return user_emoji attempts += 1 logger.error("Не удалось найти уникальный эмодзи после нескольких попыток.") - return None + return "Эмоджи не определен" diff --git a/helper_bot/utils/messages.py b/helper_bot/utils/messages.py index 883ae1d..64f8083 100644 --- a/helper_bot/utils/messages.py +++ b/helper_bot/utils/messages.py @@ -1,5 +1,3 @@ - - def get_message(username: str, type_message: str): constants = { 'HELLO_MESSAGE': "Привет, username!👋🏼&Меня зовут Виби, я бот канала 'Влюбленный Бийск'❤🤖" @@ -25,7 +23,7 @@ def get_message(username: str, type_message: str): "&Мы рассмотрим и ответим тебе в ближайшее время☺️❤️", "DEL_MESSAGE": "username, напиши свое обращение или предложение✍" "&Мы рассмотрим и ответим тебе в ближайшее время☺❤", - "BYE_MESSAGE": "Если позднее захочешь предложить еще один пост или обратиться к админам с вопросом, то просто пришли в чат команду 👉 /start" + "BYE_MESSAGE": "Если позднее захочешь предложить еще один пост или обратиться к админам с вопросом, то просто пришли в чат команду 👉 /restart" "&&И тебе пока!👋🏼❤️", "USER_ERROR": "Увы, я не понимаю тебя😐💔 Выбери один из пунктов в нижнем меню, а затем пиши.", "QUESTION": "Сообщение успешно отправлено❤️ Ответим, как только сможем😉", diff --git a/voice_bot/handlers/callback_handler.py b/voice_bot/handlers/callback_handler.py index e79cbdd..a969a98 100644 --- a/voice_bot/handlers/callback_handler.py +++ b/voice_bot/handlers/callback_handler.py @@ -1,68 +1,68 @@ -import time -from datetime import datetime -from pathlib import Path - -from aiogram import Router, F -from aiogram.types import CallbackQuery - -from helper_bot.utils.base_dependency_factory import BaseDependencyFactory - -callback_router = Router() - -bdf = BaseDependencyFactory() - -GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] -GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] -IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] -PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] -LOGS = bdf.settings['Settings']['logs'] -TEST = bdf.settings['Settings']['test'] - -BotDB = bdf.get_db() - - -@callback_router.callback_query( - F.data == "save" -) -async def save_voice_message(call: CallbackQuery): - file_name = '' - file_id = 1 - user_id = BotDB.get_user_id_by_message_id_for_voice_bot(call.message.message_id) - # Проверяем что запись о файле есть в базе данных - is_having_audio_from_user = BotDB.get_last_user_audio_record(user_id=user_id) - if is_having_audio_from_user is False: - # Если нет, то генерируем имя файла - file_name = f'message_from_{user_id}_number_{file_id}' - else: - # Иначе берем последнюю запись из БД, добавляем к ней 1, и создаем новую запись - file_name = BotDB.get_path_for_audio_record(user_id=user_id) - file_id = BotDB.get_id_for_audio_record(user_id) + 1 - path = Path(f'voice_users/{file_name}.ogg') - if path.exists(): - file_name = f'message_from_{user_id}_number_{file_id}' - else: - pass - # Собираем инфо о сообщении - time_UTC = int(time.time()) - date_added = datetime.fromtimestamp(time_UTC) - - # Сохраняем в базку - BotDB.add_audio_record(file_name, user_id, date_added, 0, file_id) - - file_info = await call.message.bot.get_file(file_id=call.message.voice.file_id) - downloaded_file = await call.message.bot.download_file(file_path=file_info.file_path) - with open(f'voice_users/{file_name}.ogg', 'wb') as new_file: - new_file.write(downloaded_file.read()) - - await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) - await call.answer(text='Сохранено!', cache_time=3) - - -@callback_router.callback_query( - F.data == "delete" -) -async def delete_voice_message(call: CallbackQuery): - # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки - - await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) - await call.answer(text='Удалено!', cache_time=3) +import time +from datetime import datetime +from pathlib import Path + +from aiogram import Router, F +from aiogram.types import CallbackQuery + +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory + +callback_router = Router() + +bdf = BaseDependencyFactory() + +GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] +GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts'] +IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] +PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] +LOGS = bdf.settings['Settings']['logs'] +TEST = bdf.settings['Settings']['test'] + +BotDB = bdf.get_db() + + +@callback_router.callback_query( + F.data == "save" +) +async def save_voice_message(call: CallbackQuery): + file_name = '' + file_id = 1 + user_id = BotDB.get_user_id_by_message_id_for_voice_bot(call.message.message_id) + # Проверяем что запись о файле есть в базе данных + is_having_audio_from_user = BotDB.get_last_user_audio_record(user_id=user_id) + if is_having_audio_from_user is False: + # Если нет, то генерируем имя файла + file_name = f'message_from_{user_id}_number_{file_id}' + else: + # Иначе берем последнюю запись из БД, добавляем к ней 1, и создаем новую запись + file_name = BotDB.get_path_for_audio_record(user_id=user_id) + file_id = BotDB.get_id_for_audio_record(user_id) + 1 + path = Path(f'voice_users/{file_name}.ogg') + if path.exists(): + file_name = f'message_from_{user_id}_number_{file_id}' + else: + pass + # Собираем инфо о сообщении + time_UTC = int(time.time()) + date_added = datetime.fromtimestamp(time_UTC) + + # Сохраняем в базку + BotDB.add_audio_record(file_name, user_id, date_added, 0, file_id) + + file_info = await call.message.bot.get_file(file_id=call.message.voice.file_id) + downloaded_file = await call.message.bot.download_file(file_path=file_info.file_path) + with open(f'voice_users/{file_name}.ogg', 'wb') as new_file: + new_file.write(downloaded_file.read()) + + await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + await call.answer(text='Сохранено!', cache_time=3) + + +@callback_router.callback_query( + F.data == "delete" +) +async def delete_voice_message(call: CallbackQuery): + # Получаем из базы автора + отправляем сообщение + удаляем сообщение из предложки + + await call.bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) + await call.answer(text='Удалено!', cache_time=3) diff --git a/voice_bot/handlers/voice_handler.py b/voice_bot/handlers/voice_handler.py index b571503..5cd8a60 100644 --- a/voice_bot/handlers/voice_handler.py +++ b/voice_bot/handlers/voice_handler.py @@ -37,13 +37,24 @@ voice_router.message.middleware(BlacklistMiddleware()) async def restart_function(message: types.Message, state: FSMContext): await message.forward(chat_id=GROUP_FOR_LOGS) await update_user_info('voice', message) - check_user_emoji(message.from_user.id) + check_user_emoji(message) markup = get_main_keyboard() await message.answer(text='Я перезапущен!', reply_markup=markup) await state.set_state('START') +@voice_router.message( + ChatTypeFilter(chat_type=["private"]), + Command("emoji") +) +async def handle_emoji_message(message: types.Message, state: FSMContext): + user_emoji = check_user_emoji(message) + await state.set_state("START") + if user_emoji is not None: + await message.answer(f'Твоя эмодзя - {user_emoji}', parse_mode='HTML') + + @voice_router.message( ChatTypeFilter(chat_type=["private"]), Command("help") @@ -51,7 +62,6 @@ async def restart_function(message: types.Message, state: FSMContext): async def help_function(message: types.Message, state: FSMContext): await message.forward(chat_id=GROUP_FOR_LOGS) await update_user_info('voice', message) - check_user_emoji(message.from_user.id) await message.answer( text='Скорее всего ответы на твои вопросы есть здесь, ознакомься: https://telegra.ph/Instrukciya-k-botu-Golosa-Bijsk-10-11-2' '\nЕсли это не поможет, пиши в личку: @Kerrad1', disable_web_page_preview=not PREVIEW_LINK) @@ -66,7 +76,7 @@ async def start(message: types.Message, state: FSMContext): await state.set_state("START") await message.forward(chat_id=GROUP_FOR_LOGS) await update_user_info('voice', message) - check_user_emoji(message.from_user.id) + user_emoji = check_user_emoji(message) try: name_stick_hello = list(Path('Stick').rglob('Hello_*')) random_stick_hello = random.choice(name_stick_hello) @@ -107,11 +117,17 @@ async def start(message: types.Message, state: FSMContext): parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) time.sleep(0.8) + await message.answer(text=f"Любые войсы будут помечены эмоджи. Твой эмоджи - {user_emoji}" + f"Таким эмоджи будут помечены твои сообщения для других " + f"Но другие люди не узнают кто за каким эмоджи скрывается:)", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.8) await message.answer(text="Так же можешь ознакомиться с инструкцией к боту по команде /help", parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) time.sleep(0.8) - await message.answer(text="ну всё, достаточно инструкций. записывайся! Микрофон твой - 🎤", + await message.answer(text="Ну всё, достаточно инструкций. записывайся! Микрофон твой - 🎤", parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) @@ -124,7 +140,6 @@ async def refresh_listen_function(message: types.Message, state: FSMContext): await message.forward(chat_id=GROUP_FOR_LOGS) await update_user_info('voice', message) markup = get_main_keyboard() - check_user_emoji(message.from_user.id) BotDB.delete_listen_count_for_user(message.from_user.id) await message.answer( text='Прослушивания очищены. Можешь начать слушать заново🤗', disable_web_page_preview=not PREVIEW_LINK, @@ -195,20 +210,27 @@ async def standup_listen_audio(message: types.Message): except Exception as e: logger.error(f'Не удалось получить последнюю дату {e}') else: - # Получаем эмоджи пользователя + # Получаем ссылку на аудио сообщение пользователя number_element = random.randint(0, len(list_audio) - 1) audio_for_user = check_audio[number_element] + # Получаем автора записи + эмодзи по нему user_id = BotDB.get_user_id_by_file_name(audio_for_user) + date_added = BotDB.get_date_by_file_name(audio_for_user) + # TODO: Мейби не напрямую ходить? + # user_emoji = BotDB.check_emoji_for_user(user_id) user_emoji = BotDB.check_emoji_for_user(user_id) path = Path(f'voice_users/{audio_for_user}.ogg') - # voice = open(path, 'rb') voice = FSInputFile(path) + # Маркируем сообщение как прослушанное BotDB.mark_listened_audio(audio_for_user, user_id=message.from_user.id) + + # Формируем подпись if user_emoji: - await message.bot.send_voice(chat_id=message.chat.id, voice=voice, caption=user_emoji, reply_markup=markup) + caption = f'{user_emoji}\nДата записи: {date_added}' else: - await message.bot.send_voice(chat_id=message.chat.id, voice=voice, reply_markup=markup) + caption = f'Дата записи: {date_added}' + await message.bot.send_voice(chat_id=message.chat.id, voice=voice, caption=caption, reply_markup=markup) await message.answer(text=f'Осталось непрослушанных: {len(check_audio) - 1}', reply_markup=markup)