fix: update documentation and configuration files

This commit is contained in:
2026-03-29 19:26:50 -07:00
parent 00aa8cf044
commit 26d9c7e79e
50 changed files with 6264 additions and 2627 deletions
+234
View File
@@ -0,0 +1,234 @@
#!/usr/bin/env python3
"""
Update partnership statistics based on matches in the database
"""
import sqlite3
import math
from datetime import datetime
DB_PATH = "prisma/prisma/dev.db"
K_FACTOR = 32
def get_all_matches():
"""Get all matches from the database"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("""
SELECT id, team1P1Id, team1P2Id, team2P1Id, team2P2Id,
team1Score, team2Score, playedAt
FROM matches
ORDER BY playedAt
""")
matches = cursor.fetchall()
conn.close()
return matches
def get_or_create_partnership(player1_id, player2_id):
"""Get or create a partnership record"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
# Sort IDs to ensure consistent partnership lookup
p1 = min(player1_id, player2_id)
p2 = max(player1_id, player2_id)
cursor.execute(
"""
SELECT id, gamesPlayed, wins, losses, totalEloChange
FROM partnership_stats
WHERE player1Id = ? AND player2Id = ?
""",
(p1, p2),
)
result = cursor.fetchone()
if result:
conn.close()
return result
# Create new partnership record
cursor.execute(
"""
INSERT INTO partnership_stats (player1Id, player2Id, gamesPlayed, wins, losses, totalEloChange, lastPlayed, createdAt, updatedAt)
VALUES (?, ?, 0, 0, 0, 0, NULL, ?, ?)
""",
(p1, p2, datetime.now().isoformat() + "Z", datetime.now().isoformat() + "Z"),
)
partnership_id = cursor.lastrowid
conn.commit()
conn.close()
return (partnership_id, 0, 0, 0, 0)
def update_partnership_stats(player1_id, player2_id, won, elo_change):
"""Update partnership statistics"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
# Sort IDs to ensure consistent partnership lookup
p1 = min(player1_id, player2_id)
p2 = max(player1_id, player2_id)
# Get current partnership stats
cursor.execute(
"""
SELECT id, gamesPlayed, wins, losses, totalEloChange
FROM partnership_stats
WHERE player1Id = ? AND player2Id = ?
""",
(p1, p2),
)
result = cursor.fetchone()
if not result:
# Create new partnership record
cursor.execute(
"""
INSERT INTO partnership_stats (player1Id, player2Id, gamesPlayed, wins, losses, totalEloChange, lastPlayed, createdAt, updatedAt)
VALUES (?, ?, 1, ?, ?, ?, ?, ?, ?)
""",
(
p1,
p2,
1 if won else 0,
0 if won else 1,
elo_change,
datetime.now().isoformat() + "Z",
datetime.now().isoformat() + "Z",
datetime.now().isoformat() + "Z",
),
)
else:
partnership_id, games_played, wins, losses, total_elo_change = result
# Update partnership stats
new_games = games_played + 1
new_wins = wins + 1 if won else wins
new_losses = losses if won else losses + 1
new_total_elo_change = total_elo_change + elo_change
cursor.execute(
"""
UPDATE partnership_stats
SET gamesPlayed = ?, wins = ?, losses = ?, totalEloChange = ?, lastPlayed = ?, updatedAt = ?
WHERE id = ?
""",
(
new_games,
new_wins,
new_losses,
new_total_elo_change,
datetime.now().isoformat() + "Z",
datetime.now().isoformat() + "Z",
partnership_id,
),
)
conn.commit()
conn.close()
def main():
print("Updating partnership statistics based on matches...")
print("=" * 60)
# Get all matches
matches = get_all_matches()
print(f"Found {len(matches)} matches in database")
# Reset partnership stats
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("DELETE FROM partnership_stats")
conn.commit()
conn.close()
print("Reset all partnership statistics")
# Process each match
match_count = 0
for (
match_id,
team1_p1,
team1_p2,
team2_p1,
team2_p2,
team1_score,
team2_score,
played_at,
) in matches:
# Determine winners
team1_won = team1_score > team2_score
team2_won = team2_score > team1_score
# Update partnership stats for Team 1
if team1_won:
update_partnership_stats(
team1_p1, team1_p2, True, 0
) # Elo change will be calculated separately
else:
update_partnership_stats(team1_p1, team1_p2, False, 0)
# Update partnership stats for Team 2
if team2_won:
update_partnership_stats(team2_p1, team2_p2, True, 0)
else:
update_partnership_stats(team2_p1, team2_p2, False, 0)
match_count += 1
if match_count % 20 == 0:
print(f"Processed {match_count}/{len(matches)} matches...")
print(f"Processed {match_count} matches")
# Display partnership stats for top players
print("\n" + "=" * 60)
print("Partnership Stats for Top Players:")
print("-" * 60)
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
# Get top players by ELO
cursor.execute("SELECT id, name FROM players ORDER BY currentElo DESC LIMIT 5")
top_players = cursor.fetchall()
for player_id, player_name in top_players:
print(f"\n{player_name}:")
# Get partnership stats for this player
cursor.execute(
"""
SELECT
CASE
WHEN player1Id = ? THEN (SELECT name FROM players WHERE id = player2Id)
ELSE (SELECT name FROM players WHERE id = player1Id)
END as partner_name,
gamesPlayed, wins, losses, totalEloChange
FROM partnership_stats
WHERE player1Id = ? OR player2Id = ?
ORDER BY gamesPlayed DESC
LIMIT 3
""",
(player_id, player_id, player_id),
)
partnerships = cursor.fetchall()
for partner_name, games, wins, losses, elo_change in partnerships:
win_rate = (wins / games * 100) if games > 0 else 0
print(
f" - with {partner_name}: {games} games, {wins}/{losses} ({win_rate:.1f}%) ELO: {elo_change:+d}"
)
conn.close()
print("\n" + "=" * 60)
print("Partnership statistics updated successfully!")
if __name__ == "__main__":
main()