using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.Configuration; using System.Web.Mvc; using System.Web.SessionState; using CoopQI.Helpers; using CoopQI.Models; namespace CoopQI.Controllers { public class ServicesController : Controller { #region Json Actions [HttpGet] public JsonResult Index(int quizId) { Question currentQuestion = GetQuestion(quizId); JsonResult result = Json(new { visitors = GetNbVisitors(quizId), state = GetState(quizId), question = currentQuestion == null ? -1 : currentQuestion.ID }); result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; return result; } [HttpPost] public JsonResult GetQuiz(int quizId) { AddToConnectedPeople(quizId); Quiz quiz = Quiz.GetFuckingEverything(quizId); return Json(new JsonQuiz(quiz)); } [HttpPost] public JsonResult SubmitAnswer(int questionId, int answer, int quizId) { Question questionAnswered = Question.GetQuestion(questionId); Question currentQuestion = GetQuestion(quizId); if (answer < 1 || questionAnswered.NbAnswers < answer) { return Json(new { error = "answer out of bound", visitors = GetNbVisitors(quizId), state = GetState(quizId), question = currentQuestion == null ? -1 : currentQuestion.ID, count1 = questionAnswered.Answer1Count, count2 = questionAnswered.Answer2Count, count3 = questionAnswered.Answer3Count, count4 = questionAnswered.Answer4Count, countAll = questionAnswered.Answer1Count + questionAnswered.Answer2Count + questionAnswered.Answer3Count ?? 0 + questionAnswered.Answer4Count ?? 0 }); } switch (answer) { case 1: questionAnswered.Answer1Count++; break; case 2: questionAnswered.Answer2Count++; break; case 3: questionAnswered.Answer3Count++; break; case 4: questionAnswered.Answer4Count++; break; default: //Shouldn't happen return Json(new { error = "answer out of bound", visitors = GetNbVisitors(quizId), state = GetState(quizId), question = currentQuestion == null ? -1 : currentQuestion.ID, count1 = questionAnswered.Answer1Count, count2 = questionAnswered.Answer2Count, count3 = questionAnswered.Answer3Count, count4 = questionAnswered.Answer4Count, countAll = questionAnswered.Answer1Count + questionAnswered.Answer2Count + questionAnswered.Answer3Count + questionAnswered.Answer4Count }); } questionAnswered.Save(); return Json(new { visitors = GetNbVisitors(quizId), state = GetState(quizId), question = currentQuestion == null ? -1 : currentQuestion.ID, count1 = questionAnswered.Answer1Count, count2 = questionAnswered.Answer2Count, count3 = questionAnswered.Answer3Count, count4 = questionAnswered.Answer4Count, countAll = questionAnswered.Answer1Count + questionAnswered.Answer2Count + questionAnswered.Answer3Count + questionAnswered.Answer4Count }); } [HttpPost] public JsonResult GetAnswers(int questionId, int quizId) { Question question = Question.GetQuestion(questionId); Question currentQuestion = GetQuestion(quizId); return Json(new { visitors = GetNbVisitors(quizId), state = GetState(quizId), question = currentQuestion == null ? -1 : currentQuestion.ID, count1 = question.Answer1Count, count2 = question.Answer2Count, count3 = question.Answer3Count, count4 = question.Answer4Count, countAll = question.Answer1Count + question.Answer2Count + question.Answer3Count + question.Answer4Count }); } [HttpPost] public JsonResult SetState(string state, int quizId) { SetState(quizId, state); return Index(quizId); } [HttpPost] public JsonResult SetQuestion(int questionId, int quizId, FormCollection dummy) { SetQuestion(quizId, questionId); return Index(quizId); } #endregion #region Private Methods private int GetNbVisitors(int quizId) { if (HttpContext.Application["Sessions" + quizId] == null) { HttpContext.Application["Sessions" + quizId] = new List(); } List colSessions = (List)HttpContext.Application["Sessions" + quizId]; return colSessions.Count; } private void AddToConnectedPeople(int quizId) { Session["quizId"] = quizId; List connectedPeople = ((List)HttpContext.Application["Sessions" + quizId]) ?? new List(); if (!connectedPeople.Contains(Session.SessionID)) { connectedPeople.Add(Session.SessionID); } HttpContext.Application["Sessions" + quizId] = connectedPeople; } private string GetState(int quizId) { List colParams = new List { new SqlParameter("@key", "state" + quizId) }; var result = AccesBD.Current.ExecuteScalar("SELECT Value FROM Config WHERE [Key] = @key", colParams, CommandType.Text); return (result is DBNull || result == null) ? null : result.ToString(); } private void SetState(int quizId, string state) { List colParams = new List { new SqlParameter("@key", "state" + quizId), new SqlParameter("@state", state) }; AccesBD.Current.ExecuteNonQuery("IF (SELECT COUNT(*) FROM Config WHERE [Key] = @key)>0 UPDATE Config SET Value = @state WHERE [Key] = @key ELSE INSERT Config ([Key], Value) VALUES (@key, @state)", colParams, CommandType.Text); } private Question GetQuestion(int quizId) { List colParams = new List { new SqlParameter("@key", "question" + quizId) }; var result = AccesBD.Current.ExecuteScalar("SELECT Value FROM Config WHERE [Key] = @key", colParams, CommandType.Text); return (result is DBNull || result == null) ? null : Question.GetQuestion(int.Parse(result.ToString())); } private void SetQuestion(int quizId, int questionId, string state = null) { List colParams = new List { new SqlParameter("@key", "question" + quizId), new SqlParameter("@state", questionId) }; AccesBD.Current.ExecuteNonQuery("IF (SELECT COUNT(*) FROM Config WHERE [Key] = @key)>0 UPDATE Config SET Value = @state WHERE [Key] = @key ELSE INSERT Config ([Key], Value) VALUES (@key, @state)", colParams, CommandType.Text); } #endregion } }