/// <summary> /// Add a song request to the queue. Automatically figures out of the user is already in the queue or not. /// If the song request userID is > 0, matches based on registered user id. /// If the song request userID is 0, matches based in registered user name. /// If the song request uesrID is less than 0, matches based on temporary user name. /// Automaticlaly creates the temporary user if needed. /// </summary> /// <param name="sr">The song request to add.</param> /// <param name="queueIndex">The position to add the user in, if they don't already have song requests in the queue.</param> /// <param name="DJKey">The DJ's assigned key.</param> /// <returns>The outcome of the operation. If the operation is sucessful, the client ID number is returned in result and message.</returns> public Response DJAddQueue(SongRequest sr, int queueIndex, long DJKey) { int DJID = -1; int songID = -1; int clientID = -1; using (DatabaseConnectivity db = new DatabaseConnectivity()) { // Try to establish a database connection Response r = db.OpenConnection(); if (r.error) return r; // Convert the DJKey to a DJID r = DJKeyToID(DJKey, out DJID, db); if (r.error) return r; // Make sure the DJ isn't logged out. r = DJValidateStatus(DJID, "2", db); if (r.error) return r; // Check to see if song exists. r = db.SongExists(DJID, sr.songID); if (r.error) return r; // Make sure the songExists method returned a song. if (!int.TryParse(r.message.Trim(), out songID)) { r.error = true; r.message = "Could not find song"; return r; } if (sr.user.userID < -1) sr.user.userID = -1; // when userID == -1, we are dealing with creating an anonmymous user. if (sr.user.userID == -1) { // See if this username exists. r = db.DJValidateTempUserName(sr.user.userName, DJID); if (r.error) return r; // In this case, the username does not exist. if (r.message.Trim().Length == 0) { // Add the tempUser. r = db.DJAddTempUser(sr.user.userName, DJID); if (r.error) return r; // Get the tempUser's ID from the DB. r = db.DJValidateTempUserName(sr.user.userName, DJID); if (r.error) return r; // Parse the ID. if (!int.TryParse(r.message.Trim(), out clientID)) { r.error = true; r.message = "Unable to get the clientID of the new user."; return r; } } // In this case, the username already exists. else { // Get the tempUser's ID from the DB. r = db.DJValidateTempUserName(sr.user.userName, DJID); if (r.error) return r; // Parse the ID. if (!int.TryParse(r.message.Trim(), out clientID)) { r.error = true; r.message = "Unable to get the clientID of the temp user."; return r; } } } // When userID == 0, we look the user up by username instead of userID. else if (sr.user.userID == 0) { r = db.MobileValidateUsername(sr.user.userName); if (r.error) return r; if (!int.TryParse(r.message.Trim(), out clientID)) { r.error = true; r.message = "Client name could not be validated."; return r; } } // If a userID is passed in. else { r = db.MobileValidateID(sr.user.userID); if (r.error) return r; // See if an ID was returned. if (r.message.Trim() == String.Empty) { string s = r.message.Trim(); r.error = true; r.message = "Client ID could not be validated."; return r; } clientID = sr.user.userID; } // Get the current song Requests r = db.GetSongRequests(DJID); if (r.error) return r; string requests = r.message; string newRequests = string.Empty; // If there were no requests, simply add the single request. if (requests.Trim().Length == 0) { newRequests = clientID.ToString() + "~" + sr.songID.ToString(); //r = Common.PushMessageToMobile(sr.user.userID, "queue", db); Common.PushMessageToUsersOfDJ(DJID, "queue", db); r = db.SetSongRequests(DJID, newRequests); return r; } // Since there is a list of requests, call to parse the raw string data into an list of queuesingers. List<queueSinger> queue; r = Common.DBToMinimalList(requests, out queue); if (r.error) return r; // Search to see if the user is already in this list of singers. for (int i = 0; i < queue.Count; i++) { // We found the userID already in here. if (queue[i].user.userID == clientID) { // Loop through the songs to see if the user is already singing this song. for (int j = 0; j < queue[i].songs.Count; j++) { if (queue[i].songs[j].ID == sr.songID) { r.error = true; r.message = "User is already singing that song"; return r; } } // They dont' already have the song in the list, add them to the list Song s = new Song(); s.ID = sr.songID; queue[i].songs.Add(s); Common.MinimalListToDB(queue, out newRequests); r = db.SetSongRequests(DJID, newRequests); if (r.error) return r; Common.PushMessageToMobile(clientID, "queue", db); //Common.PushMessageToUsersOfDJ(DJID, "queue", db); r.message = clientID.ToString(); r.result = clientID; return r; } } // Now they are not in the queue, add them at queueIndex. queueSinger qs = new queueSinger(); qs.songs = new List<Song>(); qs.user = sr.user; qs.user.userID = clientID; Song song = new Song(); song.ID = sr.songID; qs.songs.Add(song); if (queueIndex < 0) queueIndex = 0; if (queueIndex > queue.Count) queueIndex = queue.Count; queue.Insert(queueIndex, qs); Common.MinimalListToDB(queue, out newRequests); r = db.SetSongRequests(DJID, newRequests); if (r.error) return r; Common.PushMessageToUsersOfDJ(DJID, "queue", db); r.message = clientID.ToString(); r.result = clientID; return r; } }
/// <summary> /// Changes a user's song request. /// </summary> /// <param name="newSR">The new song request to user.</param> /// <param name="oldSR">The old song request to replace.</param> /// <param name="DJKey">The DJ's assigned key.</param> /// <returns>The outcome of the operation.</returns> public Response DJChangeSongRequest(SongRequest newSR, SongRequest oldSR, long DJKey) { int DJID = -1; int songID = -1; bool songChangeMade = false; bool requireSendToAll = false; using (DatabaseConnectivity db = new DatabaseConnectivity()) { // Try to establish a database connection Response r = db.OpenConnection(); if (r.error) return r; if (newSR.user.userID != oldSR.user.userID) { r.error = true; r.message = "User must be the same between song requets"; return r; } // Convert the DJKey to a DJID r = DJKeyToID(DJKey, out DJID, db); if (r.error) return r; // Make sure the DJ isn't logged out. r = DJValidateStatus(DJID, "2", db); if (r.error) return r; // Check to see if song exists. r = db.SongExists(DJID, newSR.songID); if (r.error) return r; // Make sure a songID was sent back. if (!int.TryParse(r.message.Trim(), out songID)) { r.error = true; r.message = "Could not find new song."; return r; } // Make sure the mobile user is valid. r = db.MobileValidateID(oldSR.user.userID); if (r.error) return r; // See if an ID was returned. if (r.message.Trim() == String.Empty) { string s = r.message.Trim(); r.error = true; r.message = "Client ID could not be validated."; return r; } // Get the current song Requests r = db.GetSongRequests(DJID); if (r.error) return r; string requests = r.message; string newRequests = string.Empty; // If there were no requests, simply add the single request. if (requests.Trim().Length == 0) { r.error = true; r.message = "There are no song requests"; return r; } // Since there is a list of requests, call to parse the raw string data into an list of queuesingers. List<queueSinger> queue; r = Common.DBToMinimalList(requests, out queue); if (r.error) return r; // Search to see if the user is already in this list of singers. for (int i = 0; i < queue.Count; i++) { // We found the userID already in here. if (queue[i].user.userID == oldSR.user.userID) { // Loop through the songs to see if the user is already singing this song. for (int j = 0; j < queue[i].songs.Count; j++) { if (queue[i].songs[j].ID == newSR.songID) { r.error = true; r.message = "User is already singing that song"; return r; } if (queue[i].songs[j].ID == oldSR.songID) { queue[i].songs[j].ID = newSR.songID; songChangeMade = true; if (j == 0) requireSendToAll = true; } } if (songChangeMade) { Common.MinimalListToDB(queue, out newRequests); r = db.SetSongRequests(DJID, newRequests); if (r.error) return r; if (requireSendToAll) Common.PushMessageToUsersOfDJ(DJID, "queue", db); else Common.PushMessageToMobile(oldSR.user.userID, "queue", db); return r; } // We didn't find the old song. r.error = true; r.message = "Could not find the old song."; return r; } } // We didn't find the user. r.error = true; r.message = "Could not find the user."; return r; } }
/// <summary> /// Move a song in a user's song requets new a new position in his/her song requests. /// Does not move singers, moves a singer's songs. /// </summary> /// <param name="sr">The song request to move</param> /// <param name="newIndex">The new index to insert the song into.</param> /// <param name="DJKey">The unique key that describes the DJ.</param> /// <returns>The outcome of the operation.</returns> public Response DJMoveSongRequest(SongRequest sr, int newIndex, long DJKey) { int DJID = -1; using (DatabaseConnectivity db = new DatabaseConnectivity()) { // Try to establish a database connection Response r = db.OpenConnection(); if (r.error) return r; // Convert the DJKey to a DJID r = DJKeyToID(DJKey, out DJID, db); if (r.error) return r; // Make sure the DJ isn't logged out. r = DJValidateStatus(DJID, "2", db); if (r.error) return r; // Get the current song Requests r = db.GetSongRequests(DJID); if (r.error) return r; string requests = r.message; string newRequests = string.Empty; // If there were no requests, simply add the single request. if (requests.Trim().Length == 0) { r.error = true; r.message = "The queue is empty"; return r; } // Since there is a list of requests, call to parse the raw string data into an list of queuesingers. List<queueSinger> queue; r = Common.DBToMinimalList(requests, out queue); if (r.error) return r; // Search to see if the user is already in this list of singers. for (int i = 0; i < queue.Count; i++) { // We found the userID already in here. if (queue[i].user.userID == sr.user.userID) { // Loop through the songs to see if the user is already singing this song. for (int j = 0; j < queue[i].songs.Count; j++) { // If we find the song. if (queue[i].songs[j].ID == sr.songID) { // Make sure the indexes are in range. if (newIndex < 0) newIndex = 0; if (newIndex > queue[i].songs.Count - 1) newIndex = queue[i].songs.Count - 1; // Get the song out, and insert it into the new index. Song temp = queue[i].songs[j]; queue[i].songs.RemoveAt(j); queue[i].songs.Insert(newIndex, temp); Common.MinimalListToDB(queue, out newRequests); r = db.SetSongRequests(DJID, newRequests); if (r.error) return r; if (j == 0 || newIndex == 0) Common.PushMessageToUsersOfDJ(DJID, "queue", db); else Common.PushMessageToMobile(sr.user.userID, "queue", db); return r; } } // If we can't find the current song. r.error = true; r.message = "Could not find the song to move."; return r; } } r.error = true; r.message = "Could not find client in the queue."; return r; } }
/// <summary> /// Pop the top song off the queue and updates the queue. /// </summary> /// <param name="sr">A Song request that represents the top song off the queue. Must match what the server believes is the top of the queue. Used to make sure the queues are in sync.</param> /// <param name="DJKey">The DJKey given to the DJ.</param> /// <returns>The outcome of the operaton.</returns> public Response DJPopQueue(SongRequest sr, long DJKey) { int DJID = -1; using (DatabaseConnectivity db = new DatabaseConnectivity()) { // Try to establish a database connection Response r = db.OpenConnection(); if (r.error) return r; // Convert the DJKey to a DJID r = DJKeyToID(DJKey, out DJID, db); if (r.error) return r; r = DJValidateStatus(DJID, "2", db); if (r.error) return r; r = db.GetSongRequests(DJID); if (r.error) return r; string raw = r.message; if (raw.Trim() == "") { r.error = true; r.message = "Empty Queue"; return r; } List<queueSinger> queue; r = Common.DBToMinimalList(raw, out queue); if (r.error) return r; if (queue[0].user.userID != sr.user.userID || queue[0].songs[0].ID != sr.songID) { r.error = true; r.message = "Song Request to Pop did not match first song Request, is your queue out of date?"; return r; } int nextUserID = queue[0].user.userID; Common.PushMessageToMobile(nextUserID, "turn", db); queue[0].songs.RemoveAt(0); if (queue[0].songs.Count == 0) { if (queue[0].user.userID < 0) { r = db.DJRemoveTempUser(queue[0].user.userID, DJID); queue.RemoveAt(0); if (r.error) return r; } else queue.RemoveAt(0); } else { queueSinger temp = queue[0]; queue.RemoveAt(0); queue.Add(temp); } if (queue.Count > 0) { nextUserID = queue[0].user.userID; Common.PushMessageToMobile(nextUserID, "next", db); } raw = string.Empty; r = Common.MinimalListToDB(queue, out raw); if (r.error) return r; r = db.SetSongRequests(DJID, raw); if (r.error) return r; if (sr.user.userID > 0) { r = db.MobileAddSongHistory(sr.user.userID, DJID, sr.songID, DateTime.Now); if (r.error) Common.LogError(r.message, Environment.StackTrace, r, 1); } Common.PushMessageToUsersOfDJ(DJID, "queue", db); r = Common.RunAchievements(DJID, db); if (r.error) return r; return r; } }