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