using Memory.Logic; using System.Data.SQLite; namespace Memory.Data { public class ScoreHandler : IScoreHandler { public const string URI = "Data Source=Scores.db;Version=3;"; // Ensure the database and table exist upon ScoreHandler creation public ScoreHandler() { using SQLiteConnection connection = new(URI); connection.Open(); using SQLiteCommand command = new("CREATE TABLE IF NOT EXISTS Scores(ID INTEGER PRIMARY KEY, Name TEXT, Points INTEGER)", connection); command.ExecuteNonQuery(); connection.Close(); } // Check if the score is higher than 10th place private static bool IsTop10(int points) { using SQLiteConnection connection = new(URI); connection.Open(); using SQLiteCommand command = new("SELECT Points FROM Scores ORDER BY Points DESC LIMIT 1 OFFSET 9", connection); using SQLiteDataReader reader = command.ExecuteReader(); // If there aren't atleast 10 highscores, return true by default if (!reader.Read()) { connection.Close(); return true; } int lowest = reader.GetInt32(0); connection.Close(); return points > lowest; } // Get the top 10 highscores public List GetTopScores() { List scores = []; using SQLiteConnection connection = new(URI); connection.Open(); using SQLiteCommand command = new("SELECT Name, Points FROM Scores ORDER BY Points DESC LIMIT 10", connection); using SQLiteDataReader reader = command.ExecuteReader(); while (reader.Read()) { scores.Add(new(reader.GetString(0), reader.GetInt32(1))); } connection.Close(); return scores; } // Write the new score to the database public bool WriteScore(Score score) { if (IsTop10(score.Points)) { using SQLiteConnection connection = new(URI); connection.Open(); using SQLiteCommand command = new("INSERT INTO Scores(Name, Points) VALUES(@Name, @Points)", connection); command.Parameters.AddWithValue("@Name", score.Name); command.Parameters.AddWithValue("@Points", score.Points); command.ExecuteNonQuery(); connection.Close(); return true; } return false; } } }