diff --git a/database/async_db.py b/database/async_db.py index 145ffb1..d46d87e 100644 --- a/database/async_db.py +++ b/database/async_db.py @@ -977,3 +977,63 @@ class AsyncBotDB: """Закрытие соединений.""" # Соединения закрываются в каждом методе pass + + # Методы для voice bot welcome tracking + async def check_voice_bot_welcome_received(self, user_id: int) -> bool: + """ + Проверяет, получал ли пользователь приветственное сообщение от voice_bot. + + Args: + user_id (int): Идентификатор пользователя в Telegram. + + Returns: + bool: True, если пользователь получал приветствие, False - иначе. + """ + conn = None + try: + conn = await self._get_connection() + async with conn.execute( + "SELECT voice_bot_welcome_received FROM our_users WHERE user_id = ?", + (user_id,) + ) as cursor: + result = await cursor.fetchone() + if result: + welcome_received = bool(result[0]) + self.logger.info(f"Пользователь {user_id} получал приветствие: {welcome_received}") + return welcome_received + else: + self.logger.info(f"Пользователь {user_id} не найден в базе") + return False + except Exception as e: + self.logger.error(f"Ошибка при проверке получения приветствия: {e}") + return False + finally: + if conn: + await conn.close() + + async def mark_voice_bot_welcome_received(self, user_id: int) -> bool: + """ + Отмечает, что пользователь получил приветственное сообщение от voice_bot. + + Args: + user_id (int): Идентификатор пользователя в Telegram. + + Returns: + bool: True, если обновление прошло успешно, False - в случае ошибки. + """ + conn = None + try: + conn = await self._get_connection() + await conn.execute( + "UPDATE our_users SET voice_bot_welcome_received = 1 WHERE user_id = ?", + (user_id,) + ) + await conn.commit() + self.logger.info(f"Пользователь {user_id} отмечен как получивший приветствие") + return True + except Exception as e: + self.logger.error(f"Ошибка при отметке получения приветствия: {e}") + return False + finally: + if conn: + await conn.close() diff --git a/database/db.py b/database/db.py index 9ee11f6..13036c4 100644 --- a/database/db.py +++ b/database/db.py @@ -1492,3 +1492,60 @@ class BotDB: raise finally: self.close() + + def check_voice_bot_welcome_received(self, user_id: int) -> bool: + """ + Проверяет, получал ли пользователь приветственное сообщение от voice_bot. + + Args: + user_id (int): Идентификатор пользователя в Telegram. + + Returns: + bool: True, если пользователь получал приветствие, False - иначе. + """ + self.logger.info(f"Запуск функции check_voice_bot_welcome_received. user_id={user_id}") + try: + self.connect() + self.cursor.execute( + "SELECT voice_bot_welcome_received FROM our_users WHERE user_id = ?", + (user_id,) + ) + result = self.cursor.fetchone() + if result: + welcome_received = bool(result[0]) + self.logger.info(f"Пользователь {user_id} получал приветствие: {welcome_received}") + return welcome_received + else: + self.logger.info(f"Пользователь {user_id} не найден в базе") + return False + except sqlite3.Error as error: + self.logger.error(f"Ошибка при проверке получения приветствия: {error}") + return False + finally: + self.close() + + def mark_voice_bot_welcome_received(self, user_id: int) -> bool: + """ + Отмечает, что пользователь получил приветственное сообщение от voice_bot. + + Args: + user_id (int): Идентификатор пользователя в Telegram. + + Returns: + bool: True, если обновление прошло успешно, False - в случае ошибки. + """ + self.logger.info(f"Запуск функции mark_voice_bot_welcome_received. user_id={user_id}") + try: + self.connect() + self.cursor.execute( + "UPDATE our_users SET voice_bot_welcome_received = 1 WHERE user_id = ?", + (user_id,) + ) + self.conn.commit() + self.logger.info(f"Пользователь {user_id} отмечен как получивший приветствие") + return True + except sqlite3.Error as error: + self.logger.error(f"Ошибка при отметке получения приветствия: {error}") + return False + finally: + self.close() diff --git a/database/schema.sql b/database/schema.sql index a02cf5c..dc25944 100644 --- a/database/schema.sql +++ b/database/schema.sql @@ -86,7 +86,8 @@ CREATE TABLE IF NOT EXISTS our_users ( has_stickers INTEGER DEFAULT 0 NOT NULL, emoji TEXT, date_added DATE NOT NULL, - date_changed DATE NOT NULL + date_changed DATE NOT NULL, + voice_bot_welcome_received BOOLEAN DEFAULT 0 ); -- Audio moderation tracking diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index 53b0222..93a6aa3 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -200,7 +200,8 @@ async def change_page( @callback_router.callback_query(F.data == CALLBACK_SAVE) async def save_voice_message( call: CallbackQuery, - bot_db: MagicData("bot_db") + bot_db: MagicData("bot_db"), + settings: MagicData("settings") ): try: # Создаем сервис для работы с аудио файлами @@ -224,7 +225,7 @@ async def save_voice_message( # Удаляем сообщение из предложки await call.bot.delete_message( - chat_id=bot_db.settings['Telegram']['group_for_posts'], + chat_id=settings['Telegram']['group_for_posts'], message_id=call.message.message_id ) @@ -238,12 +239,13 @@ async def save_voice_message( @callback_router.callback_query(F.data == CALLBACK_DELETE) async def delete_voice_message( call: CallbackQuery, - bot_db: MagicData("bot_db") + bot_db: MagicData("bot_db"), + settings: MagicData("settings") ): try: # Удаляем сообщение из предложки await call.bot.delete_message( - chat_id=bot_db.settings['Telegram']['group_for_posts'], + chat_id=settings['Telegram']['group_for_posts'], message_id=call.message.message_id ) diff --git a/helper_bot/handlers/voice/voice_handler.py b/helper_bot/handlers/voice/voice_handler.py index fd4f101..8be05d2 100644 --- a/helper_bot/handlers/voice/voice_handler.py +++ b/helper_bot/handlers/voice/voice_handler.py @@ -96,28 +96,46 @@ class VoiceHandlers: async def voice_bot_button_handler(self, message: types.Message, state: FSMContext, bot_db: MagicData("bot_db"), settings: MagicData("settings")): """Обработчик кнопки 'Голосовой бот' из основной клавиатуры""" - await self.start(message, state, bot_db, settings) + try: + # Проверяем, получал ли пользователь приветственное сообщение + welcome_received = bot_db.check_voice_bot_welcome_received(message.from_user.id) + logger.info(f"Пользователь {message.from_user.id}: welcome_received = {welcome_received}") + + if welcome_received: + # Если уже получал приветствие, вызываем restart_function + logger.info(f"Пользователь {message.from_user.id}: вызываем restart_function") + await self.restart_function(message, state, bot_db, settings) + else: + # Если не получал, вызываем start + logger.info(f"Пользователь {message.from_user.id}: вызываем start") + await self.start(message, state, bot_db, settings) + except Exception as e: + logger.error(f"Ошибка при проверке приветственного сообщения: {e}") + # В случае ошибки вызываем start + await self.start(message, state, bot_db, settings) async def restart_function( self, message: types.Message, state: FSMContext, - bot_db: MagicData("bot_db") + bot_db: MagicData("bot_db"), + settings: MagicData("settings") ): - await message.forward(chat_id=bot_db.settings['Telegram']['group_for_logs']) + logger.info(f"Пользователь {message.from_user.id}: вызывается функция restart_function") + await message.forward(chat_id=settings['Telegram']['group_for_logs']) await update_user_info(VOICE_BOT_NAME, message) check_user_emoji(message) markup = get_main_keyboard() - await message.answer(text='Я перезапущен!', reply_markup=markup) + await message.answer(text='🎤 Записывайся или слушай!', reply_markup=markup) await state.set_state(STATE_START) async def handle_emoji_message( self, message: types.Message, state: FSMContext, - bot_db: MagicData("bot_db") + settings: MagicData("settings") ): - await message.forward(chat_id=bot_db.settings['Telegram']['group_for_logs']) + await message.forward(chat_id=settings['Telegram']['group_for_logs']) user_emoji = check_user_emoji(message) await state.set_state(STATE_START) if user_emoji is not None: @@ -127,7 +145,6 @@ class VoiceHandlers: self, message: types.Message, state: FSMContext, - bot_db: MagicData("bot_db"), settings: MagicData("settings") ): await message.forward(chat_id=settings['Telegram']['group_for_logs']) @@ -135,7 +152,7 @@ class VoiceHandlers: help_message = messages.get_message(get_first_name(message), 'HELP_MESSAGE') await message.answer( text=help_message, - disable_web_page_preview=not bot_db.settings['Telegram']['preview_link'] + disable_web_page_preview=not settings['Telegram']['preview_link'] ) await state.set_state(STATE_START) @@ -146,6 +163,7 @@ class VoiceHandlers: bot_db: MagicData("bot_db"), settings: MagicData("settings") ): + logger.info(f"Пользователь {message.from_user.id}: вызывается функция start") await state.set_state(STATE_START) await message.forward(chat_id=settings['Telegram']['group_for_logs']) await update_user_info(VOICE_BOT_NAME, message) @@ -154,6 +172,13 @@ class VoiceHandlers: # Создаем сервис и отправляем приветственные сообщения voice_service = VoiceBotService(bot_db, settings) await voice_service.send_welcome_messages(message, user_emoji) + + # Отмечаем, что пользователь получил приветственное сообщение + try: + bot_db.mark_voice_bot_welcome_received(message.from_user.id) + logger.info(f"Пользователь {message.from_user.id}: отмечен как получивший приветствие") + except Exception as e: + logger.error(f"Ошибка при отметке получения приветствия: {e}") async def refresh_listen_function(