From 8bb098764dfe4617dbe7d868b128fd3500c61b11 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 26 Aug 2025 18:56:47 +0300 Subject: [PATCH] Refactor module imports to ensure project root is included in sys.path for both run_helper and voice_bot. Enhance database user insertion with backward compatibility for emoji column. Update user info handling to check username and full name more robustly. Improve emoji handling with fallback options for environments lacking the emoji package. --- database/db.py | 21 ++++++++++++++---- .../handlers/private/private_handlers.py | 7 +++--- helper_bot/utils/helper_func.py | 22 ++++++++++++++----- run_helper.py | 7 ++++++ voice_bot/main.py | 9 ++++++++ 5 files changed, 53 insertions(+), 13 deletions(-) diff --git a/database/db.py b/database/db.py index 78fa0e7..a9e936b 100644 --- a/database/db.py +++ b/database/db.py @@ -134,10 +134,23 @@ class BotDB: self.logger.info(f"Попытка добавить пользователя в базу данных: user_id={user_id}, first_name={first_name}") try: self.connect() - self.cursor.execute("INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', " - "'language_code', 'emoji', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", - (user_id, first_name, full_name, - username, is_bot, language_code, emoji, date_added, date_changed)) + try: + # Новая схема с колонкой emoji + self.cursor.execute( + "INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', " + "'language_code', 'emoji', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", + (user_id, first_name, full_name, username, is_bot, language_code, emoji, date_added, date_changed) + ) + except sqlite3.OperationalError as e: + # Обратная совместимость: старая схема без колонки emoji + if 'no column named emoji' in str(e): + self.cursor.execute( + "INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', " + "'language_code', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + (user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed) + ) + else: + raise self.conn.commit() self.logger.info( f"Новый пользователь добавлен в базу: user_id={user_id}, first_name={first_name}, emoji={emoji}") diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index 1a68f40..e0ca598 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -20,7 +20,7 @@ from helper_bot.utils.base_dependency_factory import get_global_instance from helper_bot.utils.helper_func import get_first_name, get_text_message, send_text_message, send_photo_message, \ send_media_group_message_to_private_chat, prepare_media_group_from_middlewares, send_video_message, \ send_video_note_message, send_audio_message, send_voice_message, add_in_db_media, \ - update_user_info, check_user_emoji + check_user_emoji, check_username_and_full_name from logs.custom_logger import logger private_router = Router() @@ -90,8 +90,6 @@ async def handle_start_message(message: types.Message, state: FSMContext): is_bot = message.from_user.is_bot language_code = message.from_user.language_code user_id = message.from_user.id - await update_user_info('love', message) - check_user_emoji(message) # Проверяем наличие username для логирования if not username: @@ -106,7 +104,8 @@ async def handle_start_message(message: types.Message, state: FSMContext): current_date = datetime.now() date = current_date.strftime("%Y-%m-%d %H:%M:%S") 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) else: is_need_update = check_username_and_full_name(user_id, username, full_name, BotDB) diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index 83ae9e2..611f0bb 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -4,16 +4,28 @@ import random from datetime import datetime, timedelta from time import sleep -import emoji +try: + import emoji as _emoji_lib +except Exception: + _emoji_lib = None from aiogram import types from aiogram.types import InputMediaPhoto, FSInputFile, InputMediaVideo, InputMediaAudio -from helper_bot.utils.base_dependency_factory import BaseDependencyFactory +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory, get_global_instance from logs.custom_logger import logger +bdf = get_global_instance() +BotDB = bdf.get_db() GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] -emoji_list = list(emoji.EMOJI_DATA.keys()) +if _emoji_lib is not None: + emoji_list = list(_emoji_lib.EMOJI_DATA.keys()) +else: + # Fallback minimal emoji set for environments without the 'emoji' package (e.g., CI tests) + emoji_list = [ + "🙂", "😀", "😉", "😎", "🤖", "🦄", "🐱", "🐶", "🍀", "🔥", + "🌟", "🎉", "💡", "🚀", "🌈" + ] def safe_html_escape(text: str) -> str: @@ -484,7 +496,7 @@ async def update_user_info(source: str, message: types.Message): BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, user_emoji, date, date) 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, BotDB) if is_need_update: BotDB.update_username_and_full_name(user_id, username, full_name) if source != 'voice': @@ -499,7 +511,7 @@ async def update_user_info(source: str, message: types.Message): 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: + if user_emoji is None or user_emoji in ("Смайл еще не определен", "Эмоджи не определен", ""): user_emoji = get_random_emoji() BotDB.update_emoji_for_user(user_id=user_id, emoji=user_emoji) return user_emoji diff --git a/run_helper.py b/run_helper.py index 16a0eaf..5ea56c4 100644 --- a/run_helper.py +++ b/run_helper.py @@ -1,4 +1,11 @@ import asyncio +import os +import sys + +# Ensure project root is on sys.path for module resolution +CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) +if CURRENT_DIR not in sys.path: + sys.path.insert(0, CURRENT_DIR) from helper_bot.main import start_bot from helper_bot.utils.base_dependency_factory import get_global_instance diff --git a/voice_bot/main.py b/voice_bot/main.py index 0b181ce..d0a25db 100644 --- a/voice_bot/main.py +++ b/voice_bot/main.py @@ -1,3 +1,12 @@ +import os +import sys + +# Ensure project root is on sys.path for module resolution when running voice bot directly +CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) +PROJECT_ROOT = os.path.dirname(CURRENT_DIR) +if PROJECT_ROOT not in sys.path: + sys.path.insert(0, PROJECT_ROOT) + from aiogram import Bot, Dispatcher from aiogram.client.default import DefaultBotProperties from aiogram.fsm.storage.memory import MemoryStorage