All pastes #2133009 Raw Edit

Unnamed

public text v1 · immutable
#2133009 ·published 2012-03-28 00:54 UTC
rendered paste body
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<string>();
            }

            List<string> colSessions = (List<string>)HttpContext.Application["Sessions" + quizId];
            return colSessions.Count;
        }

        private void AddToConnectedPeople(int quizId)
        {
            Session["quizId"] = quizId;
            List<string> connectedPeople = ((List<string>)HttpContext.Application["Sessions" + quizId]) ??
                                           new List<string>();

            if (!connectedPeople.Contains(Session.SessionID))
            {
                connectedPeople.Add(Session.SessionID);
            }

            HttpContext.Application["Sessions" + quizId] = connectedPeople;
        }

        private string GetState(int quizId)
        {
            List<SqlParameter> colParams = new List<SqlParameter> { 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<SqlParameter> colParams = new List<SqlParameter>
                                               {
                                                   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<SqlParameter> colParams = new List<SqlParameter> { 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<SqlParameter> colParams = new List<SqlParameter>
                                               {
                                                   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
    }
}