using System.Collections; using System.Collections.Generic; using UnityEngine; using Mono.Data.Sqlite; using System.Data; using System; using UnityEngine.Networking; public class Database : MonoBehaviour { string connectionType; string databaseUrl; string gameMode; int winAmount = -1; public GameObject questionCardPrefab; [Serializable] public class Question { public string question; public string answer; public string id; public string category; } [Serializable] public class Questions { public List questionsList = new List(); } string questionString = ""; string answerString = ""; string idString = ""; string categoryString = ""; private int round; public string QuestionString { get => questionString; set => questionString = value; } private void Start() { if (databaseUrl == null || databaseUrl.Equals("")) { SetLocalOrOnline("Local"); // Temporary, shoild not be needed after local testing } } internal int GetQuestionTimer(int gameId) { string sql = "SELECT answerTimer FROM game WHERE id = " + gameId; if (databaseUrl == null) { SetLocalOrOnline("Local"); } IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); int answerTime = 15; while (reader.Read()) { answerTime = reader.GetInt32(0); } reader.Close(); cmd.Dispose(); conn.Close(); return answerTime; } internal void GetOnlineGames(int userId) { string sql = "SELECT * FROM games WHERE userId = " + userId; } internal List GetLocalGames(GameObject prefab) { List games = new List(); string sql = "SELECT game.*, name,count(name) as points, localUsers.id FROM game INNER JOIN localGamePlayers on game.id = localGamePlayers.gameId INNER JOIN localUsers on playerId = localUsers.id INNER JOIN usersLockedQuestions ON name = usersLockedQuestions.playerName GROUP BY name order by points ASC;"; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); int currentGame = -1; GameObject localGame = Instantiate(prefab, new Vector2(0, 0), Quaternion.identity) as GameObject; LocalGameScript lgs = localGame.GetComponent(); while (reader.Read()) { if (currentGame == reader.GetInt32(0)) { lgs.AddPlayer(reader.GetString(10), reader.GetInt32(11)); } else { localGame = Instantiate(prefab, new Vector2(0, 0), Quaternion.identity) as GameObject; lgs = localGame.GetComponent(); lgs.GameId = reader.GetInt32(0); lgs.GameMode = reader.GetString(1); lgs.QuestionsNeededToWin = reader.GetInt32(2); lgs.AnswerTimer = reader.GetInt32(3); lgs.NumberOfPlayers = reader.GetInt32(4); lgs.CurrentPlayer = reader.GetString(5); lgs.Round = reader.GetInt32(6); lgs.StartDate = reader.GetValue(7) != DBNull.Value ? reader.GetString(7) : ""; lgs.LastPlayedDate = reader.GetValue(8) != DBNull.Value ? reader.GetString(8) : ""; lgs.FinishedDate = reader.GetValue(9) != DBNull.Value ? reader.GetString(9) : ""; lgs.AddPlayer(reader.GetString(10), reader.GetInt32(11)); games.Add(lgs); } currentGame = reader.GetInt32(0); } reader.Close(); cmd.Dispose(); conn.Close(); return games; } public string GetCurrentPlayer(int gameId) { string sql = "SELECT currentPlayer FROM game WHERE id = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); string currentPlayer = ""; while (reader.Read()) { currentPlayer = reader.GetString(0); } reader.Close(); cmd.Dispose(); conn.Close(); return currentPlayer; } public void SetCurrentPlayer(int gameId, string currentPlayer) { string sql = "UPDATE game SET currentPlayer = '" + currentPlayer + "' WHERE id = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Dispose(); conn.Close(); } internal void SetFinishedDate(int gameId, string finishedDate) { string sql = "UPDATE game SET finishedDate = '" + finishedDate + "' WHERE id = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Dispose(); conn.Close(); } internal void SetRoundValue(int gameId, int round) { string sql = "UPDATE game SET round = " + round + " WHERE id = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Dispose(); conn.Close(); } internal int GetRoundValue(int gameId) { if (this.round == null) { string sql = "SELECT round FROM game WHERE id = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { this.gameMode = reader.GetString(0); } reader.Close(); cmd.Dispose(); conn.Close(); } return this.round; } internal List> GetPlayersForGame(int gameId) { string sql = "SELECT name, (SELECT count(*) FROM usersLockedQuestions WHERE playerName = localUsers.name) as numAnswers FROM localGamePlayers " + "LEFT JOIN localUsers ON localGamePlayers.playerId = localUsers.id " + "WHERE gameId = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); List> returnList = new List>(); while (reader.Read()) { KeyValuePair player = new KeyValuePair(reader.GetString(0), reader.GetInt32(1)); returnList.Add(player); } return returnList; } public string AnswerString { get => answerString; set => answerString = value; } public string IdString { get => idString; set => idString = value; } public string CategoryString { get => categoryString; set => categoryString = value; } public void SetLocalOrOnline(string type) { gameMode = type; if (type.Equals("Local")) { databaseUrl = "URI=file:" + Application.dataPath + "/narKampenLocal.db"; } else { databaseUrl = "nordh.xyz/narKampen/dbFiles/dbAccess.php"; } connectionType = type; } public string GetGameMode(int gameId) { if (this.gameMode == null) { string sql = "SELECT gameMode FROM game WHERE id = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { this.gameMode = reader.GetString(0); } reader.Close(); cmd.Dispose(); conn.Close(); } return this.gameMode; } public void LinkPlayersToLocalGame(List playerNames, int gameId) { foreach (string player in playerNames) { string sql = "SELECT id FROM localUsers WHERE name = '" + player + "'"; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { int playerId = reader.GetInt32(0); conn.Close(); LinkPlayerToGame(playerId, gameId); continue; } else { reader.Close(); sql = "INSERT INTO localUsers (name) VALUES ('" + player + "')"; cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT last_insert_rowid()"; Int64 lastInsert64 = (Int64)cmd.ExecuteScalar(); LinkPlayerToGame((int)lastInsert64, gameId); } conn.Close(); cmd.Dispose(); reader.Close(); } } private void LinkPlayerToGame(int playerId, int gameId) { string sql = "INSERT INTO localGamePlayers (gameId, playerId) VALUES (" + gameId + ", " + playerId + ")"; SqliteConnection conn2 = new SqliteConnection(databaseUrl); conn2.Open(); IDbCommand cmd = conn2.CreateCommand(); cmd.CommandText = sql; cmd.ExecuteScalar(); cmd.Dispose(); conn2.Close(); } internal int GetWinCondition(int gameId) { if (winAmount == -1) { string sql = "SELECT winNumber FROM game WHERE id = " + gameId; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { this.winAmount = reader.GetInt32(0); } reader.Close(); cmd.Dispose(); conn.Close(); } return this.winAmount; } public int SetupNewLocalGame(int winNumber, int numberOfPlayers, int questionTimer) { string sql = "INSERT INTO game (winNumber, numberOfPlayers, answerTimer, gameMode) VALUES (" + winNumber + "," + numberOfPlayers + "," + questionTimer + ", 'Local')"; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; int status = cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT last_insert_rowid()"; Int64 lastInsert64 = (Int64)cmd.ExecuteScalar(); return (int)lastInsert64; } public NewQuestion GetNewQuestion() { if (connectionType == null) { int gameId = GameObject.Find("GameManager").GetComponent().GameId; SetLocalOrOnline(GetGameMode(gameId)); } if (connectionType == "Local") { IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); string sql = "SELECT questions.id, question, answer, categoryId as category, name FROM questions INNER JOIN questionToCategory ON questions.id = questionToCategory.questionId INNER JOIN category on category.id = questionToCategory.categoryId ORDER BY RANDOM() limit 1"; cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { int id = reader.GetInt32(0); string question = reader.GetString(1); int answer = reader.GetInt32(2); int catergoryId = reader.GetInt32(3); string categoryName = reader.GetString(4); idString = id.ToString(); questionString = question; categoryString = catergoryId.ToString(); answerString = answer.ToString(); } reader.Close(); cmd.Dispose(); conn.Close(); } else { // Connect Through db Debug.Log("Online Call"); StartCoroutine(GetQuestionData(false)); } NewQuestion q = NewQuestion.Instance(); q.questionString = questionString; q.answerString = answerString; q.categoryString = categoryString; q.idString = idString; return q; } public void SavePlayersQuestion(string questionId, string playerNameValue, int gameId) { if (databaseUrl == null) { SetLocalOrOnline(GetGameMode(gameId)); } Int32.TryParse(questionId, out int qId); string sql = "INSERT OR IGNORE INTO usersLockedQuestions (playerName, questionId, gameId) VALUES ('" + playerNameValue + "'," + qId + "," + gameId + ")"; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; cmd.ExecuteReader(); cmd.Dispose(); conn.Close(); } public List GetPlayerQuestions(int gameId, string playerNameValue) { if (databaseUrl == null) { SetLocalOrOnline(GetGameMode(gameId)); } List questions = new List(); if (connectionType.Equals("Local")) { string sql = "SELECT * FROM questions WHERE id IN ( SELECT questionId FROM usersLockedQuestions WHERE gameId = " + gameId + " AND playerName = '" + playerNameValue + "') ORDER BY answer ASC"; IDbConnection conn = new SqliteConnection(databaseUrl); conn.Open(); IDbCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { GameObject question = Instantiate(questionCardPrefab, new Vector2(0, 0), Quaternion.identity) as GameObject; QuestionCard q = question.GetComponent(); q.SetAnswerText(reader.GetInt32(2).ToString()); q.SetQuestionText(reader.GetString(1)); q.idString = reader.GetInt32(0).ToString(); questions.Add(q); } cmd.Dispose(); conn.Close(); } return questions; } private IEnumerator GetQuestionData(bool showAnswer) { UnityWebRequest www = UnityWebRequest.Get("nordh.xyz/narKampen/dbFiles/dbAccess.php"); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { while (!www.isDone) { yield return null; } // Show result string jsonData = www.downloadHandler.text; jsonData = "{\"questionsList\" : [ " + jsonData + " ]}"; Questions qe = new Questions(); JsonUtility.FromJsonOverwrite(jsonData, qe); /* if (qe.questionsList.Count > 0 && questionText != null) { if (showAnswer && answerText != null) { answerText.text = qe.questionsList[0].answer; } questionText.text = qe.questionsList[0].question; } */ questionString = qe.questionsList[0].question; answerString = qe.questionsList[0].answer; idString = qe.questionsList[0].id; categoryString = qe.questionsList[0].category; } } }