проверка на дубликаты и ряд багов

This commit is contained in:
vrubelroman 2025-11-23 01:46:12 +03:00
parent ab03728d00
commit 595c9419f4
3 changed files with 71 additions and 9 deletions

View file

@ -278,19 +278,29 @@ class LichessBot:
async def addgamer_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE): async def addgamer_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Start addgamer command - simple username only""" """Start addgamer command - simple username only"""
logger.info(f"addgamer_start called for user {update.effective_user.id}") user_id = update.effective_user.id
logger.info(f"addgamer_start called for user {user_id}")
# Check if we're already awaiting a username (prevent duplicate messages)
if context and hasattr(context, "user_data") and context.user_data.get('awaiting_addgamer_username'):
logger.info(f"addgamer_start: Already awaiting username for user {user_id}, skipping duplicate call")
return
lang = self.get_user_language_from_update(update) lang = self.get_user_language_from_update(update)
try: try:
# Mark that we are awaiting a username reply # Mark that we are awaiting a username reply
if context and hasattr(context, "user_data"): if context and hasattr(context, "user_data"):
context.user_data['awaiting_addgamer_username'] = True context.user_data['awaiting_addgamer_username'] = True
await update.message.reply_text(t('addgamer_prompt', lang)) await update.message.reply_text(t('addgamer_prompt', lang))
logger.info(f"Addgamer prompt sent to user {update.effective_user.id}") logger.info(f"Addgamer prompt sent to user {user_id}")
self.counters.increment('addgamer') self.counters.increment('addgamer')
except Exception as e: except Exception as e:
logger.error(f"Error sending addgamer prompt: {e}") logger.error(f"Error sending addgamer prompt: {e}")
import traceback import traceback
logger.error(traceback.format_exc()) logger.error(traceback.format_exc())
# Clear flag on error
if context and hasattr(context, "user_data"):
context.user_data['awaiting_addgamer_username'] = False
# No conversation state returned; handler-based flow # No conversation state returned; handler-based flow
return return
@ -420,18 +430,46 @@ class LichessBot:
) )
return WAITING_FOR_USERNAME return WAITING_FOR_USERNAME
# Check if this gamer is already tracked by this user
user_gamers = self.db.get_user_gamers(user_id)
existing_gamer = next((g for g in user_gamers if g['username'].lower() == username.lower()), None)
if existing_gamer:
# Player is already being tracked by this user
await update.message.reply_text(
t('gamer_already_added', lang, username=username)
)
# Clear awaiting flag
try:
context.user_data['awaiting_addgamer_username'] = False
except Exception:
pass
return
# Add gamer to database (without token) # Add gamer to database (without token)
# Check if gamer already exists # Check if gamer already exists in global gamers table
import sqlite3 import sqlite3
with sqlite3.connect(self.db.db_path) as conn: with sqlite3.connect(self.db.db_path) as conn:
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute("SELECT id FROM gamers WHERE username = ?", (username,)) cursor.execute("SELECT id FROM gamers WHERE username = ?", (username,))
existing_gamer = cursor.fetchone() existing_gamer_row = cursor.fetchone()
is_new_gamer = existing_gamer is None is_new_gamer = existing_gamer_row is None
gamer_id = self.db.add_gamer(username) gamer_id = self.db.add_gamer(username)
# Link user to gamer (without token) # Link user to gamer (without token)
self.db.add_user_gamer(user_id, gamer_id, None) added = self.db.add_user_gamer(user_id, gamer_id, None)
# If add_user_gamer returned False, it means the pair already exists (shouldn't happen after our check, but just in case)
if not added:
await update.message.reply_text(
t('gamer_already_added', lang, username=username)
)
# Clear awaiting flag
try:
context.user_data['awaiting_addgamer_username'] = False
except Exception:
pass
return
# Set default period to 1 hour (60 minutes) for new gamer # Set default period to 1 hour (60 minutes) for new gamer
self.db.set_user_gamer_period(user_id, gamer_id, 60) self.db.set_user_gamer_period(user_id, gamer_id, 60)
@ -486,10 +524,13 @@ class LichessBot:
lang = self.get_user_language_from_update(update) lang = self.get_user_language_from_update(update)
if not gamers: if not gamers:
logger.info(f"getgamers: No gamers found for user {user_id}, sending no_gamers message")
await update.message.reply_text(t('no_gamers', lang)) await update.message.reply_text(t('no_gamers', lang))
self.counters.increment('getgamers') self.counters.increment('getgamers')
return return
logger.info(f"getgamers: Proceeding with {len(gamers)} gamers for user {user_id}")
self.counters.increment('getgamers') self.counters.increment('getgamers')
# Show loading message # Show loading message
@ -560,6 +601,17 @@ class LichessBot:
) )
logger.info(f"getgamers: prepared {len(gamers_data)} gamers for display") logger.info(f"getgamers: prepared {len(gamers_data)} gamers for display")
# Check if we have any gamers to display
if not gamers_data:
logger.warning(f"getgamers: No gamers data prepared, but gamers list was not empty. This should not happen.")
try:
await loading_msg.delete()
except:
pass
await update.message.reply_text(t('no_gamers', lang))
return
gamers_text = t('select_active_gamer', lang) + "\n".join(text_lines) gamers_text = t('select_active_gamer', lang) + "\n".join(text_lines)
logger.info(f"getgamers: message length: {len(gamers_text)} characters") logger.info(f"getgamers: message length: {len(gamers_text)} characters")
@ -582,6 +634,8 @@ class LichessBot:
parse_mode='HTML' parse_mode='HTML'
) )
logger.info(f"getgamers: Completed successfully for user {user_id}, displayed {len(gamers_data)} gamers")
async def select_gamer(self, update: Update, context: ContextTypes.DEFAULT_TYPE): async def select_gamer(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle gamer selection""" """Handle gamer selection"""
query = update.callback_query query = update.callback_query
@ -836,7 +890,12 @@ class LichessBot:
else: else:
# API вернул ответ, но без данных (нет активности) # API вернул ответ, но без данных (нет активности)
message = data.get('message', 'No message') message = data.get('message', 'No message')
logger.info(f" API response for {username}: {message} (no activity data)") # Filter out old "No active player" messages - this functionality is deprecated
if 'No active player' in message or 'Нет активного игрока' in message or 'active player' in message.lower() or 'активного игрока' in message.lower():
logger.info(f" API response for {username}: filtered out deprecated 'No active player' message")
message = None
else:
logger.info(f" API response for {username}: {message} (no activity data)")
else: else:
logger.warning(f"⚠️ No response data for {username}: data is None") logger.warning(f"⚠️ No response data for {username}: data is None")

View file

@ -18,6 +18,9 @@ class StatsFormatter:
"""Format statistics response according to the template""" """Format statistics response according to the template"""
if not data or data.get('data') is None: if not data or data.get('data') is None:
message = data.get('message', t('no_data', lang)) if data else t('no_data', lang) message = data.get('message', t('no_data', lang)) if data else t('no_data', lang)
# Filter out old "No active player" messages - this functionality is deprecated
if 'No active player' in message or 'Нет активного игрока' in message or 'active player' in message.lower() or 'активного игрока' in message.lower():
return t('no_data', lang)
return f"📭 {message}" return f"📭 {message}"
# Extract data from API response # Extract data from API response

View file

@ -57,6 +57,7 @@ TRANSLATIONS = {
'token_username_error': "❌ Failed to get username from token. Please try again.", 'token_username_error': "❌ Failed to get username from token. Please try again.",
'empty_username': "❌ Username cannot be empty. Please try again.", 'empty_username': "❌ Username cannot be empty. Please try again.",
'user_not_found': "❌ Player {username} not found on Lichess. Check the spelling of the name.", 'user_not_found': "❌ Player {username} not found on Lichess. Check the spelling of the name.",
'gamer_already_added': " Player {username} is already being tracked.\n\nTo add another player, use /addgamer",
# Get gamers # Get gamers
'no_gamers': "📭 No players in database. Use /addgamer to add.", 'no_gamers': "📭 No players in database. Use /addgamer to add.",
@ -75,7 +76,6 @@ TRANSLATIONS = {
'delete_failed': "❌ Failed to delete player", 'delete_failed': "❌ Failed to delete player",
# Stats commands # Stats commands
'no_active_gamer': "❌ No active player. Use /getgamers to select.",
'unknown_period': "❌ Unknown period", 'unknown_period': "❌ Unknown period",
'no_data': "📭 No data", 'no_data': "📭 No data",
'stats_title': "📊 Statistics {username}{date_range}\n\n", 'stats_title': "📊 Statistics {username}{date_range}\n\n",
@ -180,6 +180,7 @@ TRANSLATIONS = {
'token_username_error': "Не удалось получить username из токена. Попробуйте еще раз.", 'token_username_error': "Не удалось получить username из токена. Попробуйте еще раз.",
'empty_username': "❌ Username не может быть пустым. Попробуйте еще раз.", 'empty_username': "❌ Username не может быть пустым. Попробуйте еще раз.",
'user_not_found': "❌ Игрок {username} не найден на Lichess. Проверьте правильность написания имени.", 'user_not_found': "❌ Игрок {username} не найден на Lichess. Проверьте правильность написания имени.",
'gamer_already_added': " Игрок {username} уже отслеживается.\n\nДля добавления следующего игрока воспользуйтесь /addgamer",
# Get gamers # Get gamers
'no_gamers': "📭 Нет игроков в базе данных. Используйте /addgamer для добавления.", 'no_gamers': "📭 Нет игроков в базе данных. Используйте /addgamer для добавления.",
@ -198,7 +199,6 @@ TRANSLATIONS = {
'delete_failed': "Не удалось удалить игрока", 'delete_failed': "Не удалось удалить игрока",
# Stats commands # Stats commands
'no_active_gamer': "❌ Нет активного игрока. Используйте /getgamers для выбора.",
'unknown_period': "❌ Неизвестный период", 'unknown_period': "❌ Неизвестный период",
'no_data': "📭 Нет данных", 'no_data': "📭 Нет данных",
'stats_title': "📊 Статистика {username}{date_range}\n\n", 'stats_title': "📊 Статистика {username}{date_range}\n\n",