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

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):
"""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)
try:
# Mark that we are awaiting a username reply
if context and hasattr(context, "user_data"):
context.user_data['awaiting_addgamer_username'] = True
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')
except Exception as e:
logger.error(f"Error sending addgamer prompt: {e}")
import traceback
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
return
@ -420,18 +430,46 @@ class LichessBot:
)
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)
# Check if gamer already exists
# Check if gamer already exists in global gamers table
import sqlite3
with sqlite3.connect(self.db.db_path) as conn:
cursor = conn.cursor()
cursor.execute("SELECT id FROM gamers WHERE username = ?", (username,))
existing_gamer = cursor.fetchone()
is_new_gamer = existing_gamer is None
existing_gamer_row = cursor.fetchone()
is_new_gamer = existing_gamer_row is None
gamer_id = self.db.add_gamer(username)
# 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
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)
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))
self.counters.increment('getgamers')
return
logger.info(f"getgamers: Proceeding with {len(gamers)} gamers for user {user_id}")
self.counters.increment('getgamers')
# Show loading message
@ -560,6 +601,17 @@ class LichessBot:
)
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)
logger.info(f"getgamers: message length: {len(gamers_text)} characters")
@ -581,6 +633,8 @@ class LichessBot:
gamers_text,
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):
"""Handle gamer selection"""
@ -836,7 +890,12 @@ class LichessBot:
else:
# API вернул ответ, но без данных (нет активности)
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:
logger.warning(f"⚠️ No response data for {username}: data is None")