Files
Transcendence/Transcendence/srcs/backend/services/player_stats.js
T
2026-03-09 00:15:01 +01:00

205 lines
5.3 KiB
JavaScript

import { query } from '../db.js';
// Get player stats by user ID
async function getStatsByUserId(userId) {
const result = await query(
`SELECT id, username, avatar_url, total_points, games_played, games_won,
tetris_best_score, tetris_wins, tetris_games_played, created_at
FROM users WHERE id = $1`,
[userId]
);
return result.rows[0] || null;
}
// Get player stats by username
async function getStatsByUsername(username) {
const result = await query(
`SELECT id, username, avatar_url, total_points, games_played, games_won,
tetris_best_score, tetris_wins, tetris_games_played, created_at
FROM users WHERE username = $1`,
[username]
);
return result.rows[0] || null;
}
// Update player points (add points to total)
async function addPoints(userId, points) {
const result = await query(
`UPDATE users SET total_points = COALESCE(total_points, 0) + $1 WHERE id = $2 RETURNING total_points`,
[points, userId]
);
return result.rows[0]?.total_points || 0;
}
// Update player points by username
async function addPointsByUsername(username, points) {
const result = await query(
`UPDATE users SET total_points = COALESCE(total_points, 0) + $1 WHERE username = $2 RETURNING total_points`,
[points, username]
);
return result.rows[0]?.total_points || 0;
}
// Increment games played
async function incrementGamesPlayed(userId) {
await query(
`UPDATE users SET games_played = COALESCE(games_played, 0) + 1 WHERE id = $1`,
[userId]
);
}
// Increment games won
async function incrementGamesWon(userId) {
await query(
`UPDATE users SET games_won = COALESCE(games_won, 0) + 1 WHERE id = $1`,
[userId]
);
}
// Get leaderboard (top players by points)
async function getLeaderboard(limit = 10) {
const result = await query(
`SELECT id, username, avatar_url, total_points, games_played, games_won
FROM users
WHERE total_points > 0
ORDER BY total_points DESC
LIMIT $1`,
[limit]
);
return result.rows;
}
// Get user ID by username
async function getUserIdByUsername(username) {
const result = await query(
`SELECT id FROM users WHERE username = $1`,
[username]
);
return result.rows[0]?.id || null;
}
// Update tetris best score (only if new score is higher)
async function updateTetrisBestScore(userId, score) {
const result = await query(
`UPDATE users SET tetris_best_score = GREATEST(COALESCE(tetris_best_score, 0), $1) WHERE id = $2 RETURNING tetris_best_score`,
[score, userId]
);
return result.rows[0]?.tetris_best_score || 0;
}
// Increment tetris duel wins
async function incrementTetrisWins(userId) {
await query(
`UPDATE users SET tetris_wins = COALESCE(tetris_wins, 0) + 1 WHERE id = $1`,
[userId]
);
}
// Increment tetris games played
async function incrementTetrisGamesPlayed(userId) {
await query(
`UPDATE users SET tetris_games_played = COALESCE(tetris_games_played, 0) + 1 WHERE id = $1`,
[userId]
);
}
// Leaderboard: best tetris scores
async function getTetrisBestScoreLeaderboard(limit = 10) {
const result = await query(
`SELECT id, username, avatar_url, tetris_best_score, tetris_wins, tetris_games_played
FROM users
WHERE tetris_best_score > 0
ORDER BY tetris_best_score DESC
LIMIT $1`,
[limit]
);
return result.rows;
}
// Leaderboard: most tetris duel wins
async function getTetrisDuelWinsLeaderboard(limit = 10) {
const result = await query(
`SELECT id, username, avatar_url, tetris_wins, tetris_games_played, tetris_best_score
FROM users
WHERE tetris_wins > 0
ORDER BY tetris_wins DESC
LIMIT $1`,
[limit]
);
return result.rows;
}
// Add a game to tetris history (keep max 15 per user)
async function addTetrisGameHistory(userId, score, gameType = 'solo', result = null) {
await query(
`INSERT INTO tetris_game_history (user_id, score, game_type, result) VALUES ($1, $2, $3, $4)`,
[userId, score, gameType, result]
);
// Keep only the 15 most recent entries
await query(
`DELETE FROM tetris_game_history
WHERE id IN (
SELECT id FROM tetris_game_history
WHERE user_id = $1
ORDER BY played_at DESC
OFFSET 15
)`,
[userId]
);
}
// Get the last 15 games for a user
async function getTetrisGameHistory(userId) {
const result = await query(
`SELECT id, score, game_type, result, played_at
FROM tetris_game_history
WHERE user_id = $1
ORDER BY played_at DESC
LIMIT 15`,
[userId]
);
return result.rows;
}
// Rank of a user by tetris best score (1 = best)
async function getTetrisScoreRank(userId) {
const result = await query(
`SELECT COUNT(*) + 1 AS rank
FROM users
WHERE tetris_best_score > COALESCE((SELECT tetris_best_score FROM users WHERE id = $1), 0)`,
[userId]
);
return parseInt(result.rows[0]?.rank || 1);
}
// Rank of a user by tetris duel wins (1 = best)
async function getTetrisDuelWinsRank(userId) {
const result = await query(
`SELECT COUNT(*) + 1 AS rank
FROM users
WHERE tetris_wins > COALESCE((SELECT tetris_wins FROM users WHERE id = $1), 0)`,
[userId]
);
return parseInt(result.rows[0]?.rank || 1);
}
export default {
getStatsByUserId,
getStatsByUsername,
addPoints,
addPointsByUsername,
incrementGamesPlayed,
incrementGamesWon,
getLeaderboard,
getUserIdByUsername,
updateTetrisBestScore,
incrementTetrisWins,
incrementTetrisGamesPlayed,
getTetrisBestScoreLeaderboard,
getTetrisDuelWinsLeaderboard,
getTetrisScoreRank,
getTetrisDuelWinsRank,
addTetrisGameHistory,
getTetrisGameHistory
};