diff --git a/database/L2/L2_Main.sqlite b/database/L2/L2_Main.sqlite index 8b0a7a8..48767a3 100644 Binary files a/database/L2/L2_Main.sqlite and b/database/L2/L2_Main.sqlite differ diff --git a/database/Web/Web_App.sqlite b/database/Web/Web_App.sqlite index eaf75f2..1d393c6 100644 Binary files a/database/Web/Web_App.sqlite and b/database/Web/Web_App.sqlite differ diff --git a/web/services/opponent_service.py b/web/services/opponent_service.py index cdddef2..3549917 100644 --- a/web/services/opponent_service.py +++ b/web/services/opponent_service.py @@ -109,9 +109,12 @@ class OpponentService: # Post-process for derived stats results = [] - for r in rows: + # Resolve avatar fallback from local static if missing + from web.services.stats_service import StatsService + for r in rows or []: d = dict(r) d['win_rate'] = (d['wins'] / d['matches']) if d['matches'] else 0 + d['avatar_url'] = StatsService.resolve_avatar_url(d.get('steam_id_64'), d.get('avatar_url')) results.append(d) return results, total @@ -209,6 +212,9 @@ class OpponentService: info = query_db('l2', "SELECT * FROM dim_players WHERE steam_id_64 = ?", [steam_id], one=True) if not info: return None + from web.services.stats_service import StatsService + player = dict(info) + player['avatar_url'] = StatsService.resolve_avatar_url(steam_id, player.get('avatar_url')) # 2. Match History vs Us (All matches this player played) # We define "Us" as matches where this player is an opponent. @@ -333,7 +339,7 @@ class OpponentService: }) return { - 'player': info, + 'player': player, 'history': processed_history, 'elo_stats': elo_stats, 'side_stats': dict(side_stats) if side_stats else {} diff --git a/web/services/stats_service.py b/web/services/stats_service.py index e82906b..2c4decd 100644 --- a/web/services/stats_service.py +++ b/web/services/stats_service.py @@ -1,7 +1,29 @@ -from web.database import query_db +from web.database import query_db, execute_db +from flask import current_app, url_for +import os class StatsService: @staticmethod + def resolve_avatar_url(steam_id, avatar_url): + try: + if avatar_url and str(avatar_url).strip(): + return avatar_url + base = os.path.join(current_app.root_path, 'static', 'avatars') + # Check jpg/png in order + for ext in ('.jpg', '.png'): + fname = f"{steam_id}{ext}" + if os.path.exists(os.path.join(base, fname)): + url = url_for('static', filename=f'avatars/{fname}') + try: + # Persist fallback URL into L2 for future reads + execute_db('l2', "UPDATE dim_players SET avatar_url = ? WHERE steam_id_64 = ?", [url, str(steam_id)]) + except Exception: + pass + return url + return None + except Exception: + return avatar_url + @staticmethod def get_team_stats_summary(): """ Calculates aggregate statistics for matches where at least 2 roster members played together. @@ -374,7 +396,13 @@ class StatsService: WHERE mp.match_id = ? ORDER BY mp.team_id, mp.rating DESC """ - return query_db('l2', sql, [match_id]) + rows = query_db('l2', sql, [match_id]) + result = [] + for r in rows or []: + d = dict(r) + d['avatar_url'] = StatsService.resolve_avatar_url(d.get('steam_id_64'), d.get('avatar_url')) + result.append(d) + return result @staticmethod def get_match_rounds(match_id): @@ -411,7 +439,12 @@ class StatsService: """ args.extend([per_page, offset]) - players = query_db('l2', sql, args) + rows = query_db('l2', sql, args) + players = [] + for r in rows or []: + d = dict(r) + d['avatar_url'] = StatsService.resolve_avatar_url(d.get('steam_id_64'), d.get('avatar_url')) + players.append(d) total = query_db('l2', f"SELECT COUNT(*) as cnt FROM dim_players WHERE {where_str}", args[:-2], one=True)['cnt'] return players, total @@ -419,7 +452,12 @@ class StatsService: @staticmethod def get_player_info(steam_id): sql = "SELECT * FROM dim_players WHERE steam_id_64 = ?" - return query_db('l2', sql, [steam_id], one=True) + r = query_db('l2', sql, [steam_id], one=True) + if not r: + return None + d = dict(r) + d['avatar_url'] = StatsService.resolve_avatar_url(steam_id, d.get('avatar_url')) + return d @staticmethod def get_daily_match_counts(days=365): @@ -442,7 +480,13 @@ class StatsService: return [] placeholders = ','.join('?' for _ in steam_ids) sql = f"SELECT * FROM dim_players WHERE steam_id_64 IN ({placeholders})" - return query_db('l2', sql, steam_ids) + rows = query_db('l2', sql, steam_ids) + result = [] + for r in rows or []: + d = dict(r) + d['avatar_url'] = StatsService.resolve_avatar_url(d.get('steam_id_64'), d.get('avatar_url')) + result.append(d) + return result @staticmethod def get_player_basic_stats(steam_id): @@ -841,4 +885,3 @@ class StatsService: result[r_num]['economy'][sid] = dict(eco) return result -