/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> private void btnSave_Click(object sender, EventArgs e) { if (txtQuestion.Text != "" & txtAns1.Text != "" & txtAns2.Text != "" & txtAns3.Text != "" & txtAns4.Text != "" & (cbAns_1.Checked | cbAns_2.Checked | cbAns_3.Checked | cbAns_4.Checked)) { //if none of the fields are blank if (!txtQuestion.Text.Contains('|') & !txtAns1.Text.Contains('|') & !txtAns2.Text.Contains('|') & !txtAns3.Text.Contains('|') & !txtAns4.Text.Contains('|')) { //if none of the fields contain a pipe symbol int qid = (lbQuestions.SelectedIndex == -1) ? 0 : lbQuestions.SelectedIndex; //if the question id is -1, sets to 0 if (qid == 0) { //make a new question currentQA = new QACombo(Convert.ToString(GetLowestQNumber()) + "|" + txtQuestion.Text + "|" + txtAns1.Text + "|" + txtAns2.Text + "|" + txtAns3.Text + "|" + txtAns4.Text + "|" + (cbAns_1.Checked == true ? 1 : cbAns_2.Checked == true ? 2 : cbAns_3.Checked == true ? 3 : 4)); questionsList.Add(currentQA); lbQuestions.Items.Add(currentQA.question); } else { //edit an older question currentQA = questionsList.ElementAt(qid - 1); currentQA.question = txtQuestion.Text; currentQA.ans1 = txtAns1.Text; currentQA.ans2 = txtAns2.Text; currentQA.ans3 = txtAns3.Text; currentQA.ans4 = txtAns4.Text; currentQA.correctAnswer = (cbAns_1.Checked == true ? 1 : cbAns_2.Checked == true ? 2 : cbAns_3.Checked == true ? 3 : 4); lbQuestions.Items.RemoveAt(qid); //remove the older question lbQuestions.Items.Add(currentQA.question); //add the new question clearFields(); } MessageBox.Show("Saved the question!"); } else { MessageBox.Show("Question not saved, invalid characters found in a text box. (No '|' allowed.)"); } } else { MessageBox.Show("Question not saved. Must complete all fields."); } }
/// <summary> /// Handles the SelectedIndexChanged event of the lbQuestions control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> private void lbQuestions_SelectedIndexChanged(object sender, EventArgs e) { if (lbQuestions.SelectedItem != null) { string questionText = lbQuestions.SelectedItem.ToString(); //gets the text of the question if (questionText == "Add a new question...") { clearFields(); //clears all fields so a new question can be made } else { currentQA = questionsList.ElementAt((lbQuestions.SelectedIndex) - 1); //get the question from the question list txtQuestion.Text = currentQA.question; //set all the text txtAns1.Text = currentQA.ans1; txtAns2.Text = currentQA.ans2; txtAns3.Text = currentQA.ans3; txtAns4.Text = currentQA.ans4; switch ((checkBoxes)currentQA.correctAnswer) { //set the checkbox case checkBoxes.ANS_ONE: cbAns_1.Checked = true; break; case checkBoxes.ANS_TWO: cbAns_2.Checked = true; break; case checkBoxes.ANS_THREE: cbAns_3.Checked = true; break; case checkBoxes.ANS_FOUR: cbAns_4.Checked = true; break; } uncheckOthers((checkBoxes)currentQA.correctAnswer); } } }
/// <summary> /// Gets the next question. /// </summary> public void GetNextQuestion() { lblQuestionText.Text = "Getting new question..."; try //to get a new question { tmrTimeLeft.Enabled = false; //Int32 port = Convert.ToInt32(portStr); //client = new TcpClient(server, port); Answer ans = new Answer(); ans.answer = cbAnswer_1.Checked == true ? 1 : cbAnswer_2.Checked == true ? 2 : cbAnswer_3.Checked == true ? 3 : 4; ans.question = questionNumber; ans.timeLeft = Convert.ToInt32(lblTimeLeft.Text); Byte[] data = ObjectToByteArray(ans); stream = host.GetStream(); stream.Write(data, 0, data.Length); //send our answer List <byte[]> listObject = new List <byte[]>(); byte[] bytes = new byte[8192]; byte[] fullObjectBytes; stream.Read(bytes, 0, bytes.Length); //get a new question or the end of game listObject.Add(bytes); var bformatter = new BinaryFormatter(); fullObjectBytes = bytes; Stream fullObjectStream = new MemoryStream(fullObjectBytes); object objFromServer = bformatter.Deserialize(fullObjectStream); Type objType = objFromServer.GetType(); if (objType == typeof(QACombo)) //if new question { currentQA = (QACombo)objFromServer; setQAText(); tmrTimeLeft.Enabled = true; } else if (objType == typeof(List <Result>)) //if results(end of game) { pAnswers.Visible = false; pQuestions.Visible = false; pEndQuestions.Visible = true; pTimeLeft.Visible = false; pStartScreen.Visible = false; btnSubmit.Visible = false; List <Result> results = (List <Result>)objFromServer; foreach (var result in results) { //print results txtResults.Text += "\r\n#" + result.questionNumber + "\r\nQuestion: " + result.question + "\r\n Your answer: " + result.theirAnswer + "\r\n Correct answer: " + result.actualAnswer; } data = ObjectToByteArray(new Leaderboard()); stream.Write(data, 0, data.Length); //send blank leaderboard stream.Read(bytes, 0, bytes.Length); //receive leaderboard with data listObject.Add(bytes); fullObjectBytes = bytes; fullObjectStream = new MemoryStream(fullObjectBytes); objFromServer = bformatter.Deserialize(fullObjectStream); objType = objFromServer.GetType(); txtResults.Clear(); List <Leaderboard> leaderboards = (List <Leaderboard>)objFromServer; int count = 1; foreach (var leaderboard in leaderboards) { //print leaderboard txtResults.Text += "#" + count++ + " " + leaderboard.name + " " + leaderboard.score + "\r\n"; } } } catch (ArgumentNullException ex) { MessageBox.Show("InvalidOperationException: {0}", ex.Message); Console.WriteLine("ArgumentNullException: {0}", ex); stream.Close(); this.Close(); } catch (SocketException ex) { MessageBox.Show("InvalidOperationException: {0}", ex.Message); Console.WriteLine("SocketException: {0}", ex); stream.Close(); this.Close(); } catch (IOException ex) { MessageBox.Show("InvalidOperationException: {0}", ex.Message); Console.WriteLine("IOException: {0}", ex); stream.Close(); this.Close(); } catch (SerializationException ex) { MessageBox.Show("InvalidOperationException: {0}", ex.Message); Console.WriteLine("SerializationException: {0}", ex); stream.Close(); this.Close(); } catch (InvalidOperationException ex) { MessageBox.Show("InvalidOperationException: {0}", ex.Message); Console.WriteLine("InvalidOperationException: {0}", ex); stream.Close(); this.Close(); } lblTimeLeft.Text = "20"; tmrTimeLeft.Enabled = true; }
/// <summary> /// Reads the socket. /// </summary> /// <param name="obj">The object.</param> private void readSocket(object obj) { //cast the obj which is a clientConnection ClientConnections connection = obj as ClientConnections; try { //size/data of read List <byte[]> listObject = new List <byte[]>(); byte[] bytes = new byte[8192]; byte[] fullObjectBytes; NetworkStream stream = connection.cSocket.GetStream(); //check if connection is still open if (connection.cSocket.Connected) { stream.Read(bytes, 0, bytes.Length); } else { //stop timer if connection closed connection.rTimer.stop(); } listObject.Add(bytes); //Convert data recived to an object var bformatter = new BinaryFormatter(); fullObjectBytes = bytes; Stream fullObjectStream = new MemoryStream(fullObjectBytes); object objFromClient = bformatter.Deserialize(fullObjectStream); Type objType = objFromClient.GetType(); byte[] objectOut = new byte[0]; //temp- the file data the will be sent to client if (objType == typeof(String)) //client sent name { connection.name = ((string)objFromClient); objectOut = ObjectToByteArray("Connected"); } else if (objType == typeof(Answer))//client gives you an answer (give them next question or their results) { //Send client a question Answer userAnswer = (Answer)objFromClient; //check if first question if (connection.question != -1) { List <string> queryRow = db.Select("Select questionNum,question,ans1,ans2,ans3,ans4,correctAnswer from questions where questionNum = " + connection.question).FirstOrDefault(); QACombo QARow = new QACombo(String.Join("|", queryRow)); if (userAnswer.answer == QARow.correctAnswer) { connection.score += userAnswer.timeLeft; } else { userAnswer.timeLeft = 0; } //Add users answer/result to results list connection.results.Add(new Result(QARow.questionNum + "|" + QARow.question + "|" + queryRow[1 + QARow.correctAnswer] + "|" + queryRow[1 + userAnswer.answer])); db.Insert("INSERT INTO questionattempts (questionId,timeLeft)VALUES(" + QARow.questionNum + "," + userAnswer.timeLeft + ")"); } //get next question data List <string> nextQuestion = db.Select("Select questionNum,question,ans1,ans2,ans3,ans4,correctAnswer from questions where questionNum > " + connection.question + " Order By questionNum ASC").FirstOrDefault(); if (nextQuestion != null) { //Create object to send to client QACombo nextQ = new QACombo(String.Join("|", nextQuestion)); objectOut = ObjectToByteArray(nextQ); connection.question = nextQ.questionNum; } else { //Add user to leaderboard db.Insert("INSERT INTO leaderboard (name,score)VALUES('" + connection.name + "'," + connection.score + ")"); objectOut = ObjectToByteArray(connection.results); } } else if (objType == typeof(CurrentStatus))// { //List of current connections List <CurrentStatus> statusList = new List <CurrentStatus>(); foreach (var con in connections) { if (con.question != -1) { CurrentStatus newStatus; newStatus.name = con.name; newStatus.score = con.score; newStatus.questionNum = con.question; statusList.Add(newStatus); } } //Send list of current connection to admin objectOut = ObjectToByteArray(statusList); } else if (objType == typeof(Leaderboard)) { //create leaderboard List <List <string> > leader = db.Select("Select name, score from leaderboard order by score Desc"); List <Leaderboard> leaderBoard = new List <Leaderboard>(); foreach (var player in leader) { Leaderboard newLeaderboard; newLeaderboard.name = player[0]; newLeaderboard.score = Convert.ToInt16(player[1]); leaderBoard.Add(newLeaderboard); } leaderBoard.OrderBy(o => o.score).ToList(); //Send leaderboard to user objectOut = ObjectToByteArray(leaderBoard); } else if (objType == typeof(ExcelData)) { //Create excel list for admin List <ExcelData> excelDataList = new List <ExcelData>(); List <List <string> > excelRecords = db.Select("Select questionId, timeLeft from questionattempts"); List <List <string> > questionData = db.Select("Select questionNum, question from questions"); //Combine questionatttempts and question information to generate fields for excel foreach (List <string> questionRecord in questionData) { int questionNumber = Convert.ToInt16(questionRecord[0]); string questionText = questionRecord[1]; double avgTime = 0; int count = 0; double percentCorrect = 0; foreach (var excelRecord in excelRecords) { if (excelRecord[0] == questionRecord[0]) { avgTime += Convert.ToDouble(excelRecord[1]); if (excelRecord[1] != "0") { percentCorrect++; } count++; } } avgTime = count != 0 ? avgTime /= count : 0; percentCorrect = count != 0 ? percentCorrect /= count : 0; percentCorrect *= 100; excelDataList.Add(new ExcelData(questionNumber, questionText, avgTime, percentCorrect)); } //Send excel data to admin objectOut = ObjectToByteArray(excelDataList); } else if (objType == typeof(List <QACombo>)) { //Admin updates the question list List <QACombo> QAList = (List <QACombo>)objFromClient; if (QAList.Any()) //Admin is changing questions { db.Delete("DELETE FROM questions"); //Remove all questions db.Delete("DELETE FROM questionattempts"); //remove all questionattempts //insert all new questions foreach (var record in QAList) { db.Insert("INSERT INTO questions (questionNum,question,ans1,ans2,ans3,ans4,correctAnswer)VALUES(" + record.questionNum + ",'" + record.question + "','" + record.ans1 + "','" + record.ans2 + "','" + record.ans3 + "','" + record.ans4 + "'," + record.correctAnswer + ")"); } } else//Read all questions { List <QACombo> send = new List <QACombo>(); List <List <string> > thisQuestion = db.Select("Select questionNum,question,ans1,ans2,ans3,ans4,correctAnswer from questions"); foreach (List <string> record in thisQuestion) { send.Add(new QACombo(String.Join("|", record))); } //Send all questions to admin objectOut = ObjectToByteArray(send); } } //Send the data to the client stream.Write(objectOut, 0, objectOut.Length); } catch (IOException e) { connection.cSocket.Close(); connection.rTimer.stop(); } catch (SerializationException e) { connection.cSocket.Close(); connection.rTimer.stop(); } finally { for (int i = 0; i < connections.Count; i++) { //Check if any clients have disconnected from the server if (connections[i].cSocket.Connected == false) { //Remove the client from running clients list connections.RemoveAt(i); } } } }