#include "SQLiteDatabase.h" #include "Game.h" #include "Logger.h" #include "dConfig.h" std::optional SQLiteDatabase::GetDonationTotal(const uint32_t activityId) { auto [_, donation_total] = ExecuteSelect("SELECT SUM(primaryScore) as donation_total FROM leaderboard WHERE game_id = ?;", activityId); if (donation_total.eof()) { return std::nullopt; } return donation_total.getIntField("donation_total"); } std::vector ProcessQuery(CppSQLite3Query& rows) { std::vector entries; while (!rows.eof()) { auto& entry = entries.emplace_back(); entry.charId = rows.getIntField("character_id"); entry.lastPlayedTimestamp = rows.getIntField("lp_unix"); entry.primaryScore = rows.getFloatField("primaryScore"); entry.secondaryScore = rows.getFloatField("secondaryScore"); entry.tertiaryScore = rows.getFloatField("tertiaryScore"); entry.numWins = rows.getIntField("numWins"); entry.numTimesPlayed = rows.getIntField("timesPlayed"); entry.name = rows.getStringField("char_name"); // entry.ranking is never set because its calculated in leaderboard in code. rows.nextRow(); } return entries; } std::vector SQLiteDatabase::GetDescendingLeaderboard(const uint32_t activityId) { auto [_, result] = ExecuteSelect("SELECT *, CAST(strftime('%s', last_played) as INT) as lp_unix, ci.name as char_name FROM leaderboard lb JOIN charinfo ci on ci.id = lb.character_id where game_id = ? ORDER BY primaryscore DESC, secondaryscore DESC, tertiaryScore DESC, last_played ASC;", activityId); return ProcessQuery(result); } std::vector SQLiteDatabase::GetAscendingLeaderboard(const uint32_t activityId) { auto [_, result] = ExecuteSelect("SELECT *, CAST(strftime('%s', last_played) as INT) as lp_unix, ci.name as char_name FROM leaderboard lb JOIN charinfo ci on ci.id = lb.character_id where game_id = ? ORDER BY primaryscore ASC, secondaryscore ASC, tertiaryScore ASC, last_played ASC;", activityId); return ProcessQuery(result); } std::vector SQLiteDatabase::GetAgsLeaderboard(const uint32_t activityId) { auto query = Game::config->GetValue("classic_survival_scoring") != "1" ? "SELECT *, CAST(strftime('%s', last_played) as INT) as lp_unix, ci.name as char_name FROM leaderboard lb JOIN charinfo ci on ci.id = lb.character_id where game_id = ? ORDER BY primaryscore DESC, secondaryscore DESC, tertiaryScore DESC, last_played ASC;" : "SELECT *, CAST(strftime('%s', last_played) as INT) as lp_unix, ci.name as char_name FROM leaderboard lb JOIN charinfo ci on ci.id = lb.character_id where game_id = ? ORDER BY secondaryscore DESC, primaryscore DESC, tertiaryScore DESC, last_played ASC;"; auto [_, result] = ExecuteSelect(query, activityId); return ProcessQuery(result); } std::vector SQLiteDatabase::GetNsLeaderboard(const uint32_t activityId) { auto [_, result] = ExecuteSelect("SELECT *, CAST(strftime('%s', last_played) as INT) as lp_unix, ci.name as char_name FROM leaderboard lb JOIN charinfo ci on ci.id = lb.character_id where game_id = ? ORDER BY primaryscore DESC, secondaryscore ASC, tertiaryScore DESC, last_played ASC;", activityId); return ProcessQuery(result); } void SQLiteDatabase::SaveScore(const uint32_t playerId, const uint32_t gameId, const Score& score) { ExecuteInsert("INSERT INTO leaderboard (primaryScore, secondaryScore, tertiaryScore, character_id, game_id, last_played) VALUES (?,?,?,?,?,CURRENT_TIMESTAMP) ;", score.primaryScore, score.secondaryScore, score.tertiaryScore, playerId, gameId); } void SQLiteDatabase::UpdateScore(const uint32_t playerId, const uint32_t gameId, const Score& score) { ExecuteInsert("UPDATE leaderboard SET primaryScore = ?, secondaryScore = ?, tertiaryScore = ?, timesPlayed = timesPlayed + 1, last_played = CURRENT_TIMESTAMP WHERE character_id = ? AND game_id = ?;", score.primaryScore, score.secondaryScore, score.tertiaryScore, playerId, gameId); } std::optional SQLiteDatabase::GetPlayerScore(const uint32_t playerId, const uint32_t gameId) { std::optional toReturn = std::nullopt; auto [_, res] = ExecuteSelect("SELECT * FROM leaderboard WHERE character_id = ? AND game_id = ?;", playerId, gameId); if (!res.eof()) { toReturn = ILeaderboard::Score{ .primaryScore = static_cast(res.getFloatField("primaryScore")), .secondaryScore = static_cast(res.getFloatField("secondaryScore")), .tertiaryScore = static_cast(res.getFloatField("tertiaryScore")) }; } return toReturn; } void SQLiteDatabase::IncrementNumWins(const uint32_t playerId, const uint32_t gameId) { ExecuteUpdate("UPDATE leaderboard SET numWins = numWins + 1, last_played = CURRENT_TIMESTAMP WHERE character_id = ? AND game_id = ?;", playerId, gameId); } void SQLiteDatabase::IncrementTimesPlayed(const uint32_t playerId, const uint32_t gameId) { ExecuteUpdate("UPDATE leaderboard SET timesPlayed = timesPlayed + 1, last_played = CURRENT_TIMESTAMP WHERE character_id = ? AND game_id = ?;", playerId, gameId); }