убрана чувствительность к регистру в никнейме
This commit is contained in:
parent
e6967db17d
commit
4b6790be14
4 changed files with 57 additions and 19 deletions
|
|
@ -126,25 +126,41 @@ class StatsFormatter:
|
||||||
result = t('period_notification_title', lang, username=username, period_text=period_text)
|
result = t('period_notification_title', lang, username=username, period_text=period_text)
|
||||||
|
|
||||||
# Format puzzles first (if available and there's actual activity)
|
# Format puzzles first (if available and there's actual activity)
|
||||||
if puzzles_data and puzzles_data.get('data'):
|
has_puzzles_data = False
|
||||||
|
if puzzles_data:
|
||||||
|
# Check puzzles_in_period on top level first (priority)
|
||||||
|
top_level_puzzles = puzzles_data.get('puzzles_in_period', 0)
|
||||||
|
# Also check data.total_attempts
|
||||||
|
if puzzles_data.get('data'):
|
||||||
puzzles_info = puzzles_data['data']
|
puzzles_info = puzzles_data['data']
|
||||||
total_puzzles = puzzles_info.get('total_attempts', 0)
|
total_puzzles = puzzles_info.get('total_attempts', 0)
|
||||||
solved = puzzles_info.get('solved', 0)
|
solved = puzzles_info.get('solved', 0)
|
||||||
failed = puzzles_info.get('failed', 0)
|
failed = puzzles_info.get('failed', 0)
|
||||||
|
|
||||||
|
effective_puzzles = top_level_puzzles if top_level_puzzles > 0 else total_puzzles
|
||||||
|
|
||||||
# Only show tasks section if there's actual activity (not all zeros)
|
# Only show tasks section if there's actual activity (not all zeros)
|
||||||
if total_puzzles > 0 or solved > 0 or failed > 0:
|
if effective_puzzles > 0 or solved > 0 or failed > 0:
|
||||||
result += t('period_puzzles_section', lang, total=total_puzzles, solved=solved, failed=failed)
|
has_puzzles_data = True
|
||||||
|
result += t('period_puzzles_section', lang, total=effective_puzzles, solved=solved, failed=failed)
|
||||||
|
|
||||||
# Format games
|
# Format games
|
||||||
|
has_games_data = False
|
||||||
if games_data and games_data.get('data'):
|
if games_data and games_data.get('data'):
|
||||||
games_info = games_data['data']
|
games_info = games_data['data']
|
||||||
|
# Check games_count on top level first (priority)
|
||||||
|
top_level_games_count = games_data.get('games_count', 0)
|
||||||
|
# Also check data.total.games_played
|
||||||
total_games = games_info.get('total', {}).get('games_played', 0)
|
total_games = games_info.get('total', {}).get('games_played', 0)
|
||||||
|
|
||||||
|
# Use top-level games_count if available, otherwise use total.games_played
|
||||||
|
effective_games_count = top_level_games_count if top_level_games_count > 0 else total_games
|
||||||
|
|
||||||
# Show details for each game type if there were games
|
# Show details for each game type if there were games
|
||||||
if total_games > 0:
|
if effective_games_count > 0:
|
||||||
for game_type, game_data in games_info.items():
|
for game_type, game_data in games_info.items():
|
||||||
if game_type != 'total' and game_data and game_data.get('games_played', 0) > 0:
|
if game_type != 'total' and game_data and game_data.get('games_played', 0) > 0:
|
||||||
|
has_games_data = True # Only set to True if we actually add game data
|
||||||
emoji = StatsFormatter._get_game_type_emoji(game_type)
|
emoji = StatsFormatter._get_game_type_emoji(game_type)
|
||||||
games_count = game_data.get('games_played', 0)
|
games_count = game_data.get('games_played', 0)
|
||||||
rating_change = game_data.get('rating_change', 0)
|
rating_change = game_data.get('rating_change', 0)
|
||||||
|
|
@ -167,8 +183,8 @@ class StatsFormatter:
|
||||||
draws=draws
|
draws=draws
|
||||||
)
|
)
|
||||||
|
|
||||||
# If no activity
|
# If no activity at all
|
||||||
if not (games_data and games_data.get('data')) and not (puzzles_data and puzzles_data.get('data')):
|
if not has_games_data and not has_puzzles_data:
|
||||||
result += t('no_activity', lang)
|
result += t('no_activity', lang)
|
||||||
|
|
||||||
return result.rstrip()
|
return result.rstrip()
|
||||||
|
|
|
||||||
|
|
@ -459,11 +459,15 @@ class StatsService:
|
||||||
winner = game.get('winner')
|
winner = game.get('winner')
|
||||||
players = game.get('players', {})
|
players = game.get('players', {})
|
||||||
|
|
||||||
# Определяем цвет игрока
|
# Определяем цвет игрока (сравниваем имена без учета регистра)
|
||||||
|
username_lower = username.lower()
|
||||||
user_color = None
|
user_color = None
|
||||||
if players.get('white', {}).get('user', {}).get('name') == username:
|
white_name = players.get('white', {}).get('user', {}).get('name', '')
|
||||||
|
black_name = players.get('black', {}).get('user', {}).get('name', '')
|
||||||
|
|
||||||
|
if white_name.lower() == username_lower:
|
||||||
user_color = 'white'
|
user_color = 'white'
|
||||||
elif players.get('black', {}).get('user', {}).get('name') == username:
|
elif black_name.lower() == username_lower:
|
||||||
user_color = 'black'
|
user_color = 'black'
|
||||||
|
|
||||||
if user_color is None:
|
if user_color is None:
|
||||||
|
|
@ -483,11 +487,15 @@ class StatsService:
|
||||||
"""
|
"""
|
||||||
players = game.get('players', {})
|
players = game.get('players', {})
|
||||||
|
|
||||||
# Определяем цвет игрока
|
# Определяем цвет игрока (сравниваем имена без учета регистра)
|
||||||
|
username_lower = username.lower()
|
||||||
user_color = None
|
user_color = None
|
||||||
if players.get('white', {}).get('user', {}).get('name') == username:
|
white_name = players.get('white', {}).get('user', {}).get('name', '')
|
||||||
|
black_name = players.get('black', {}).get('user', {}).get('name', '')
|
||||||
|
|
||||||
|
if white_name.lower() == username_lower:
|
||||||
user_color = 'white'
|
user_color = 'white'
|
||||||
elif players.get('black', {}).get('user', {}).get('name') == username:
|
elif black_name.lower() == username_lower:
|
||||||
user_color = 'black'
|
user_color = 'black'
|
||||||
|
|
||||||
if user_color is None:
|
if user_color is None:
|
||||||
|
|
@ -546,18 +554,30 @@ class StatsService:
|
||||||
# Сортируем игры по времени создания (от старых к новым) для правильного вычисления итогового рейтинга
|
# Сортируем игры по времени создания (от старых к новым) для правильного вычисления итогового рейтинга
|
||||||
sorted_games = sorted(games, key=lambda x: x.get('createdAt', 0))
|
sorted_games = sorted(games, key=lambda x: x.get('createdAt', 0))
|
||||||
|
|
||||||
for game in sorted_games:
|
logger.info(f"🔍 Processing {len(sorted_games)} games for {username}")
|
||||||
|
|
||||||
|
for idx, game in enumerate(sorted_games):
|
||||||
speed = game.get('speed', 'unknown')
|
speed = game.get('speed', 'unknown')
|
||||||
|
game_id = game.get('id', 'unknown')
|
||||||
|
|
||||||
|
logger.debug(f"🔍 Game {idx+1}/{len(sorted_games)}: id={game_id}, speed={speed}, username={username}")
|
||||||
|
|
||||||
# Пропускаем неизвестные типы игр
|
# Пропускаем неизвестные типы игр
|
||||||
if speed not in stats:
|
if speed not in stats:
|
||||||
|
logger.warning(f"⚠️ Skipping game {game_id}: unknown speed '{speed}' (expected: bullet, blitz, rapid, classical, correspondence)")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Определяем результат игры
|
# Определяем результат игры
|
||||||
result = self._determine_game_result(game, username)
|
result = self._determine_game_result(game, username)
|
||||||
if result == 'unknown':
|
if result == 'unknown':
|
||||||
|
players = game.get('players', {})
|
||||||
|
white_name = players.get('white', {}).get('user', {}).get('name', 'N/A')
|
||||||
|
black_name = players.get('black', {}).get('user', {}).get('name', 'N/A')
|
||||||
|
logger.warning(f"⚠️ Skipping game {game_id}: cannot determine result for username '{username}' (white: '{white_name}', black: '{black_name}')")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
logger.debug(f"✅ Processing game {game_id}: speed={speed}, result={result}")
|
||||||
|
|
||||||
# Получаем изменение рейтинга и итоговый рейтинг
|
# Получаем изменение рейтинга и итоговый рейтинг
|
||||||
rating_change, final_rating = self._get_rating_info(game, username)
|
rating_change, final_rating = self._get_rating_info(game, username)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,4 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,3 +58,4 @@ def validate_credentials(username: str, password: str) -> bool:
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue