mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-10-12 18:38:10 +00:00

* feat: convert character ids to 64 bits remove all usages of the PERSISTENT bit with regards to storing of playerIDs on the server. the bit does not exist and was a phantom in the first place. Tested that a full playthrough of ag, ns and gf was still doable. slash commands work, ugc works, friends works, ignore list works, properties work and have names, teaming works. migrating an old mysql database works . need to test an old sqlite database * fix sqlite migration * remove nd specific column migration
92 lines
5.0 KiB
C++
92 lines
5.0 KiB
C++
#include "SQLiteDatabase.h"
|
|
|
|
#include "Game.h"
|
|
#include "Logger.h"
|
|
#include "dConfig.h"
|
|
|
|
std::optional<uint32_t> 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<ILeaderboard::Entry> ProcessQuery(CppSQLite3Query& rows) {
|
|
std::vector<ILeaderboard::Entry> entries;
|
|
|
|
while (!rows.eof()) {
|
|
auto& entry = entries.emplace_back();
|
|
|
|
entry.charId = rows.getInt64Field("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<ILeaderboard::Entry> 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<ILeaderboard::Entry> 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<ILeaderboard::Entry> 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<ILeaderboard::Entry> 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 LWOOBJID 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 LWOOBJID 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<ILeaderboard::Score> SQLiteDatabase::GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) {
|
|
std::optional<ILeaderboard::Score> 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<float>(res.getFloatField("primaryScore")),
|
|
.secondaryScore = static_cast<float>(res.getFloatField("secondaryScore")),
|
|
.tertiaryScore = static_cast<float>(res.getFloatField("tertiaryScore"))
|
|
};
|
|
}
|
|
|
|
return toReturn;
|
|
}
|
|
|
|
void SQLiteDatabase::IncrementNumWins(const LWOOBJID 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 LWOOBJID playerId, const uint32_t gameId) {
|
|
ExecuteUpdate("UPDATE leaderboard SET timesPlayed = timesPlayed + 1, last_played = CURRENT_TIMESTAMP WHERE character_id = ? AND game_id = ?;", playerId, gameId);
|
|
}
|