проверка на дубликаты и ряд багов
This commit is contained in:
parent
ab03728d00
commit
595c9419f4
3 changed files with 71 additions and 9 deletions
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue