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.
This commit is contained in:
@@ -134,10 +134,23 @@ class BotDB:
|
|||||||
self.logger.info(f"Попытка добавить пользователя в базу данных: user_id={user_id}, first_name={first_name}")
|
self.logger.info(f"Попытка добавить пользователя в базу данных: user_id={user_id}, first_name={first_name}")
|
||||||
try:
|
try:
|
||||||
self.connect()
|
self.connect()
|
||||||
self.cursor.execute("INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', "
|
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 (?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
"'language_code', 'emoji', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||||
(user_id, first_name, full_name,
|
(user_id, first_name, full_name, username, is_bot, language_code, emoji, date_added, date_changed)
|
||||||
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.conn.commit()
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"Новый пользователь добавлен в базу: user_id={user_id}, first_name={first_name}, emoji={emoji}")
|
f"Новый пользователь добавлен в базу: user_id={user_id}, first_name={first_name}, emoji={emoji}")
|
||||||
|
|||||||
@@ -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, \
|
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_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, \
|
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
|
from logs.custom_logger import logger
|
||||||
|
|
||||||
private_router = Router()
|
private_router = Router()
|
||||||
@@ -90,8 +90,6 @@ async def handle_start_message(message: types.Message, state: FSMContext):
|
|||||||
is_bot = message.from_user.is_bot
|
is_bot = message.from_user.is_bot
|
||||||
language_code = message.from_user.language_code
|
language_code = message.from_user.language_code
|
||||||
user_id = message.from_user.id
|
user_id = message.from_user.id
|
||||||
await update_user_info('love', message)
|
|
||||||
check_user_emoji(message)
|
|
||||||
|
|
||||||
# Проверяем наличие username для логирования
|
# Проверяем наличие username для логирования
|
||||||
if not username:
|
if not username:
|
||||||
@@ -106,7 +104,8 @@ async def handle_start_message(message: types.Message, state: FSMContext):
|
|||||||
current_date = datetime.now()
|
current_date = datetime.now()
|
||||||
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
date = current_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
if not BotDB.user_exists(user_id):
|
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)
|
date)
|
||||||
else:
|
else:
|
||||||
is_need_update = check_username_and_full_name(user_id, username, full_name, BotDB)
|
is_need_update = check_username_and_full_name(user_id, username, full_name, BotDB)
|
||||||
|
|||||||
@@ -4,16 +4,28 @@ import random
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
import emoji
|
try:
|
||||||
|
import emoji as _emoji_lib
|
||||||
|
except Exception:
|
||||||
|
_emoji_lib = None
|
||||||
from aiogram import types
|
from aiogram import types
|
||||||
from aiogram.types import InputMediaPhoto, FSInputFile, InputMediaVideo, InputMediaAudio
|
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
|
from logs.custom_logger import logger
|
||||||
|
|
||||||
|
bdf = get_global_instance()
|
||||||
|
BotDB = bdf.get_db()
|
||||||
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
|
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:
|
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,
|
BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, user_emoji, date,
|
||||||
date)
|
date)
|
||||||
else:
|
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:
|
if is_need_update:
|
||||||
BotDB.update_username_and_full_name(user_id, username, full_name)
|
BotDB.update_username_and_full_name(user_id, username, full_name)
|
||||||
if source != 'voice':
|
if source != 'voice':
|
||||||
@@ -499,7 +511,7 @@ async def update_user_info(source: str, message: types.Message):
|
|||||||
def check_user_emoji(message: types.Message):
|
def check_user_emoji(message: types.Message):
|
||||||
user_id = message.from_user.id
|
user_id = message.from_user.id
|
||||||
user_emoji = BotDB.check_emoji_for_user(user_id=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()
|
user_emoji = get_random_emoji()
|
||||||
BotDB.update_emoji_for_user(user_id=user_id, emoji=user_emoji)
|
BotDB.update_emoji_for_user(user_id=user_id, emoji=user_emoji)
|
||||||
return user_emoji
|
return user_emoji
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
import asyncio
|
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.main import start_bot
|
||||||
from helper_bot.utils.base_dependency_factory import get_global_instance
|
from helper_bot.utils.base_dependency_factory import get_global_instance
|
||||||
|
|||||||
@@ -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 import Bot, Dispatcher
|
||||||
from aiogram.client.default import DefaultBotProperties
|
from aiogram.client.default import DefaultBotProperties
|
||||||
from aiogram.fsm.storage.memory import MemoryStorage
|
from aiogram.fsm.storage.memory import MemoryStorage
|
||||||
|
|||||||
Reference in New Issue
Block a user