/// <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> /// Create a song request. /// </summary> /// <param name="songID">The songID</param> /// <param name="userKey">client mobile key.</param> /// <returns>The outcome of the opearation.</returns> public Response MobileSongRequest(int songID, long userKey) { int venueID = -1; int songExists; int mobileID; using (DatabaseConnectivity db = new DatabaseConnectivity()) { // Try to establish a database connection Response r = db.OpenConnection(); if (r.error) return (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); // Convert the userKey to MobileID r = MobileKeyToID(userKey, out mobileID, db); if (r.error) return (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); // Make sure the client isn't already logged out. r = MobileCheckStatus(mobileID, "!0", db); if (r.error) return r; // Get the venueID r = MobileGetVenue(mobileID, db); if (r.error) return (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); venueID = r.result; // Make sure the venue is accepting songs. r = VenueCheckStatus(venueID, "2", db); if (r.error) return r; // Check to see if song exists. r = db.SongExists(venueID, songID); if (r.error) return (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); if (!int.TryParse(r.message.Trim(), out songExists)) { r.error = true; r.message = "Could not find song"; return r; } // Get the current song Requests r = db.GetSongRequests(venueID); if (r.error) return (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); string requests = r.message; string newRequests = string.Empty; if (requests.Trim().Length == 0) { requests = mobileID.ToString() + "~" + songID.ToString(); r = db.SetSongRequests(venueID, requests); if (r.error) return r; r = Common.PushMessageToMobile(mobileID, "queue", db); if (r.error) Common.LogError(r.message, Environment.StackTrace, null, 0); 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 (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); // 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 == mobileID) { // 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 == songID) { r.error = true; r.message = "You are already in queue to sing that song"; return r; } } // They dont' already have the song in the list, add them to the list Song s = new Song(); s.ID = songID; queue[i].songs.Add(s); Common.MinimalListToDB(queue, out newRequests); r = db.SetSongRequests(venueID, newRequests); if(r.error) return (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); Common.PushMessageToUsersOfDJ(venueID, "queue", db); return r; } } queueSinger qs = new queueSinger(); qs.songs = new List<Song>(); User u = new User(); u.userID = mobileID; qs.user = u; Song song = new Song(); song.ID = songID; qs.songs.Add(song); queue.Add(qs); Common.MinimalListToDB(queue, out newRequests); r = db.SetSongRequests(venueID, newRequests); if(r.error) return (Response)Common.LogError(r.message, Environment.StackTrace, r, 0); Common.PushMessageToUsersOfDJ(venueID, "queue", db); return r; } }
/// <summary> /// Convert the database representation of a queue to the object representation. Fill all fields except for path on disk. /// </summary> /// <param name="raw">The database representation.</param> /// <param name="queue">The out parameter to store the queue in.</param> /// <param name="DJID">The ID of the venue.</param> /// <param name="mobileID">The ID of the client.</param> /// <param name="db">The databse conenctivity to use.</param> /// <returns>The outcome of the operation.</returns> private Response DBToNearlyFullList(string raw, out List<queueSinger> queue, int DJID, int mobileID, DatabaseConnectivity db) { queue = new List<queueSinger>(); Response r = new Response(); int count = 0; string[] clientRequests = raw.Split('`'); for (int i = 0; i < clientRequests.Length; i++) { string[] parts = clientRequests[i].Split('~'); if (parts.Length == 0) { r.error = true; r.message = "Error in DBtoList 1"; return r; } queueSinger qs = new queueSinger(); qs.songs = new List<Song>(); User u = new User(); u.userID = int.Parse(parts[0]); if (u.userID < 0) r = db.DJGetTempUserName(u.userID, DJID); else r = db.MobileIDtoUsername(u.userID); if (r.error) return r; if (r.message.Trim().Length == 0) { r.error = true; r.message = "DB Username lookup exception in DJGetQueue!"; return r; } u.userName = r.message.Trim(); qs.user = u; for (int j = 1; j < parts.Length; j++) { Song song; r = Common.GetSongInformation(int.Parse(parts[j]), DJID, mobileID, out song, db); if (r.error) return r; qs.songs.Add(song); } queue.Add(qs); count++; } return r; }
/// <summary> /// Takes the database representation of the queue and expands it into a queue that is minimally /// filled with data. The queue is only filled to contain user IDs and song IDs. /// </summary> /// <param name="raw">The database representation of the queue.</param> /// <param name="queue">Out object represenation of the queue.</param> /// <returns>The outcome of the operation.</returns> public static Response DBToMinimalList(string raw, out List<queueSinger> queue) { int count = 0; Response r = new Response(); queue = new List<queueSinger>(); string[] clientRequests = raw.Split('`'); for (int i = 0; i < clientRequests.Length; i++) { string[] parts = clientRequests[i].Split('~'); if (parts.Length == 0) { r.error = true; r.message = "Error in DBtoList 1"; return r; } queueSinger qs = new queueSinger(); qs.songs = new List<Song>(); User u = new User(); u.userID = int.Parse(parts[0]); qs.user = u; for (int j = 1; j < parts.Length; j++) { Song s = new Song(); s.ID = int.Parse(parts[j]); qs.songs.Add(s); } queue.Add(qs); count++; } return r; }