// should be called with alternative login methods only (auto guest login)
        private void Login(SlideSessionModel slideSessionModel)
        {
            var userName    = slideSessionModel.ArsnovaEuConfig.GuestUserName;
            var loginMethod = slideSessionModel.ArsnovaEuConfig.LoginMethod;

            var apiPath = "auth/login?type=guest&user="******"&_dc=" +
                          this.ConvertToUnixTimestampString(DateTime.Now);

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Get);

                var response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    slideSessionModel.ArsnovaEuConfig.Cookies = new List <Cookie>();
                    // login success
                    foreach (Cookie cookie in response.Cookies)
                    {
                        slideSessionModel.ArsnovaEuConfig.Cookies.Add(cookie);
                    }

                    slideSessionModel.ArsnovaEuConfig.IsAuthenticated = true;
                }
            }
            catch (WebException webException)
            {
                throw new CommunicationException("Authentification Error", webException);
            }
        }
示例#2
0
        private void HandleTimerEvent(object source, ElapsedEventArgs e)
        {
            this.countdown--;
            if (this.countdown >= 0)
            {
                this.slideManipulator.SetTimerOnSlide(this.currentQuestionModel, this.questionTimerSlide, this.countdown);
            }

            if (this.countdown == 0)
            {
                this.timer.Stop();

                var responses = this.arsnovaClickService.GetResultsForHashtag(this.currentSlideSessionModel.Hashtag, this.currentQuestionModel.RecalculatedOnlineIndex);
                if (responses != null)
                {
                    this.slideManipulator.SetClickResults(this.currentQuestionModel, this.resultsSlide, responses);
                }


                // move to next slide (results)
                this.ShowNextSlideEventHandler?.Invoke(this, EventArgs.Empty);

                // clean up
                this.timer = null;
                this.currentQuestionModel     = null;
                this.currentSlideSessionModel = null;
                this.questionTimerSlide       = null;
                this.resultsSlide             = null;
            }
        }
        public void SetSessionAsActive(SlideSessionModel slideSessionModel)
        {
            // clean up: delete everything and set it up again to avoid changing ids...
            var allExistingQuestions = this.GetAllQuestionsFromSession(slideSessionModel);

            if (allExistingQuestions != null)
            {
                foreach (var question in allExistingQuestions)
                {
                    this.DeleteAnswersToQuestion(slideSessionModel, question._id);
                }
            }

            this.CheckAuthentification(slideSessionModel);

            // can't get /lecturerquestion/_questionId_, when they are disabled!

            /*var apiPath = "lecturerquestion/disablevote?sessionkey=" + slideSessionModel.Hashtag + "&disable=false&lecturequestionsonly=false&preparationquestionsonly=false&_dc=" + this.ConvertToUnixTimestampString(DateTime.Now);
             *
             * try
             * {
             *  var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Post);
             *
             *  this.SendRequest(request);
             * }
             * catch (JsonReaderException exception)
             * {
             *  throw new CommunicationException("Activate session failed", exception);
             * }*/
        }
        private void SetFeatures(SlideSessionModel slideSessionModel)
        {
            var sessionId = slideSessionModel.Hashtag;
            // already authentificated
            // activate questions-feature only

            var urlSuffix   = "session/" + sessionId + "/features?_dc=" + this.ConvertToUnixTimestampString(DateTime.Now);
            var requestBody = "{" +
                              "\"feedback\": null," +
                              "\"flashcardFeature\": null," +
                              "\"interposed\": null," +
                              "\"jitt\": true," +
                              "\"liveFeedback\": null," +
                              "\"learningProgress\": null," +
                              "\"lecture\": null," +
                              "\"pi\": null," +
                              "\"slides\": null" +
                              "}";

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, urlSuffix, HttpMethod.Put);

                request = this.AddContentToRequest(request, requestBody);

                this.SendRequest(request);
            }
            catch (JsonReaderException exception)
            {
                throw new CommunicationException("Error while setting custom features", exception);
            }
        }
        private HttpWebRequest CreateWebRequest(SlideSessionModel slideSessionModel, string apiUrlSuffix, HttpMethod httpMethod, bool withContentType = true)
        {
            var webRequest = (HttpWebRequest)WebRequest.Create(this.apiUrl + apiUrlSuffix);

            webRequest.Accept = "*/*";

            switch (httpMethod)
            {
            case HttpMethod.Get:
                webRequest.Method = "GET";
                break;

            case HttpMethod.Post:
                webRequest.Method = "POST";
                break;

            case HttpMethod.Put:
                webRequest.Method = "PUT";
                break;

            case HttpMethod.Delete:
                webRequest.Method = "DELETE";
                break;

            case HttpMethod.Patch:

                webRequest.Method = "PATCH";
                break;
            }

            webRequest.Host      = "arsnova.eu";
            webRequest.KeepAlive = true;

            if (withContentType)
            {
                webRequest.ContentType = "application/json";
            }

            webRequest.Accept          = "*/*";
            webRequest.Referer         = "https://arsnova.eu/mobile/";
            webRequest.CookieContainer = new CookieContainer();

            foreach (var arsnovaEuHeader in this.arsnovaEuHeaders)
            {
                webRequest.Headers.Set(arsnovaEuHeader.Item1, arsnovaEuHeader.Item2);
            }

            if (slideSessionModel.ArsnovaEuConfig.Cookies != null)
            {
                foreach (var cookie in slideSessionModel.ArsnovaEuConfig.Cookies)
                {
                    webRequest.CookieContainer.Add(new Uri("https://arsnova.eu"), new Cookie("JSESSIONID", cookie.Value));
                    //webRequest.CookieContainer.Add(cookie);
                }
            }

            return(webRequest);
        }
        public void AddIntroSlide(SlideSessionModel slideSessionModel, Slide introSlide)
        {
            var isClickSession = slideSessionModel.SessionType == SessionType.ArsnovaClick;

            // Note: Interops reads RGB colors in the order: BGR!
            var backgroundRgbColor = isClickSession ? Color.FromArgb(136, 150, 0).ToArgb() : Color.FromArgb(230, 229, 223).ToArgb();
            var filePath           = isClickSession ? this.GetFilePath(Images.click_header, "click_header.png") : this.GetFilePath(Images.arsnova_header, "arsnova_header.png");
            var sessionTypeName    = isClickSession ? "arsnova.click" : "ARSnova.voting";

            introSlide.Layout = PpSlideLayout.ppLayoutBlank;
            introSlide.FollowMasterBackground = MsoTriState.msoFalse;
            introSlide.DisplayMasterShapes    = MsoTriState.msoFalse;

            introSlide.Background.Fill.ForeColor.RGB = backgroundRgbColor;

            introSlide.Shapes.AddPicture(
                filePath,
                MsoTriState.msoTrue,
                MsoTriState.msoTrue,
                100,
                isClickSession ? 145 : 95,
                750,
                isClickSession ? 75 : 150);

            var subTitleTextBox   = introSlide.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, 100, 320, 750, 50);
            var subTitleTextRange = subTitleTextBox.TextFrame.TextRange;

            subTitleTextRange.Text               = $"{this.localizationService.Translate("This presentation uses")} {sessionTypeName}, {this.localizationService.Translate("join the hashtag")}:";
            subTitleTextRange.Font.Name          = this.font;
            subTitleTextRange.Font.Size          = 22;
            subTitleTextBox.TextEffect.Alignment = MsoTextEffectAlignment.msoTextEffectAlignmentCentered;

            var subTitleTextBox2   = introSlide.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, 100, 370, 750, 75);
            var subTitleTextRange2 = subTitleTextBox2.TextFrame.TextRange;

            subTitleTextRange2.Text               = $"{slideSessionModel.Hashtag}";
            subTitleTextRange2.Font.Name          = this.font;
            subTitleTextRange2.Font.Size          = 24;
            subTitleTextBox2.TextEffect.Alignment = MsoTextEffectAlignment.msoTextEffectAlignmentCentered;
            subTitleTextBox2.TextEffect.FontBold  = MsoTriState.msoCTrue;

            var subTitleTextBox3   = introSlide.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, 100, 420, 750, 50);
            var subTitleTextRange3 = subTitleTextBox3.TextFrame.TextRange;

            subTitleTextRange3.Text               = isClickSession ? "https://arsnova.click/" + slideSessionModel.Hashtag : "https://arsnova.eu/mobile/#id/" + slideSessionModel.Hashtag;
            subTitleTextRange3.Font.Name          = this.font;
            subTitleTextRange3.Font.Size          = 22;
            subTitleTextBox3.TextEffect.Alignment = MsoTextEffectAlignment.msoTextEffectAlignmentCentered;

            if (isClickSession)
            {
                subTitleTextRange.Font.Color.RGB  = Color.White.ToArgb();
                subTitleTextRange2.Font.Color.RGB = Color.White.ToArgb();
                subTitleTextRange3.Font.Color.RGB = Color.White.ToArgb();
            }

            // TODO create QR-Code / get it from click server
        }
示例#7
0
        public void KeepAlive(SlideSessionModel slideSessionModel)
        {
            var validationResult = this.arsnovaClickService.KeepAlive(slideSessionModel.Hashtag, slideSessionModel.PrivateKey);

            if (!validationResult.Success)
            {
                throw new CommunicationException(validationResult.FailureMessage);
            }
        }
        private Tuple <string, string> UpdateQuestion(SlideSessionModel slideSessionModel, SlideQuestionModel questionModel, string arsnovaVotingQuestionId)
        {
            var oldQuestion = this.GetLectureQuestion(slideSessionModel, arsnovaVotingQuestionId);

            // update entries
            oldQuestion.questionType = this.QuestionTypeToVotingQuestionType(questionModel.QuestionType);
            oldQuestion.text         = questionModel.QuestionText;

            if (questionModel.QuestionType == QuestionTypeEnum.FreeTextVoting)
            {
                var answerOption = questionModel.AnswerOptions.First();

                oldQuestion.strictMode          = true;
                oldQuestion.textAnswerEnabled   = true;
                oldQuestion.correctAnswer       = answerOption.Text;
                oldQuestion.fixedAnswer         = true;
                oldQuestion.ignoreCaseSensitive = answerOption.ConfigCaseSensitive;
                oldQuestion.ignorePunctuation   = answerOption.ConfigUsePunctuation;
                oldQuestion.ignoreWhitespaces   = answerOption.ConfigTrimWhitespaces;
            }
            else
            {
                var answerOptionList = new List <PossibleAnswerObject>();

                foreach (var answerOption in questionModel.AnswerOptions)
                {
                    answerOptionList.Add(new PossibleAnswerObject
                    {
                        correct = answerOption.IsTrue,
                        text    = answerOption.Text,
                        value   = answerOption.IsTrue ? 10 : -10
                    });
                }

                oldQuestion.possibleAnswers = answerOptionList;
            }

            var apiPath     = "lecturerquestion/" + arsnovaVotingQuestionId;
            var requestBody = JsonConvert.SerializeObject(oldQuestion);

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Put);
                request = this.AddContentToRequest(request, requestBody);

                var responseString = this.GetResponseString(slideSessionModel, request);

                var newQuestionModel = JsonConvert.DeserializeObject <LectureQuestionModelWithId>(responseString);

                return(new Tuple <string, string>(newQuestionModel._id, newQuestionModel._rev));
            }
            catch (JsonReaderException exception)
            {
                throw new CommunicationException("Update question failed", exception);
            }
        }
        public void ArsnovaEuCreateSession()
        {
            var slideSessionModel = new SlideSessionModel();

            slideSessionModel.ArsnovaEuConfig = new ArsnovaEuConfig();
            this.arsnovaVotingService.CreateNewSession(slideSessionModel);

            Assert.IsFalse(string.IsNullOrEmpty(slideSessionModel.Hashtag));
            Assert.IsTrue(slideSessionModel.Hashtag.Length == 8);
        }
 private ViewModelRequirements CreateViewModelRequirements(SlideSessionModel slideSessionModel)
 {
     return(new ViewModelRequirements(
                this.viewPresenter,
                this.questionTypeTranslator,
                this.localizationService,
                this.sessionManager,
                this.sessionInformationProvider,
                this.slideManipulator,
                slideSessionModel));
 }
        public ValidationResult ShowNextReadingConfirmation(SlideSessionModel slideSessionModel)
        {
            var validationResult = this.CheckForHashtagAndPrivateKey(slideSessionModel.Hashtag, slideSessionModel.PrivateKey);

            if (!validationResult.Success)
            {
                return(validationResult);
            }

            return(this.arsnovaClickApi.ShowNextReadingConfirmation(slideSessionModel.Hashtag, slideSessionModel.PrivateKey));
        }
        public ValidationResult StartNextQuestion(SlideSessionModel slideSessionModel, int questionIndex)
        {
            var validationResult = this.CheckForHashtagAndPrivateKey(slideSessionModel.Hashtag, slideSessionModel.PrivateKey);

            if (!validationResult.Success)
            {
                return(validationResult);
            }

            return(this.arsnovaClickApi.StartNextQuestion(slideSessionModel.Hashtag, slideSessionModel.PrivateKey, questionIndex));
        }
示例#13
0
        public void RemoveClickQuizDataFromServer(SlideSessionModel slideSessionModel)
        {
            if (slideSessionModel.SessionType == SessionType.ArsnovaClick)
            {
                var validationResult = this.arsnovaClickService.RemoveQuizData(slideSessionModel.Hashtag, slideSessionModel.PrivateKey);

                if (!validationResult.Success)
                {
                    throw new CommunicationException(validationResult.FailureMessage);
                }
            }
        }
        protected BaseViewModel(ViewModelRequirements requirements)
        {
            this.ViewPresenter              = requirements.ViewPresenter;
            this.QuestionTypeTranslator     = requirements.QuestionTypeTranslator;
            this.LocalizationService        = requirements.LocalizationService;
            this.SessionManager             = requirements.SessionManager;
            this.SessionInformationProvider = requirements.SessionInformationProvider;
            this.SlideManipulator           = requirements.SlideManipulator;
            this.RibbonHelper = new RibbonHelper(this.ViewPresenter, this.LocalizationService);

            this.SlideSessionModel = requirements.SlideSessionModel;
        }
示例#15
0
 public void CreateSession(SlideSessionModel slideSessionModel)
 {
     if (slideSessionModel.SessionType == SessionType.ArsnovaClick)
     {
         var privateKey = this.arsnovaClickService.CreateHashtag(slideSessionModel.Hashtag);
         slideSessionModel.PrivateKey = privateKey;
     }
     else
     {
         // create new arsnova config
         slideSessionModel.ArsnovaEuConfig = new ArsnovaEuConfig();
         this.arsnovaVotingService.CreateNewSession(slideSessionModel);
     }
 }
        public ValidationResult UpdateQuestionGroup(SlideSessionModel slideSessionModel)
        {
            var validationResult = this.CheckForHashtagAndPrivateKey(slideSessionModel.Hashtag, slideSessionModel.PrivateKey);

            if (!validationResult.Success)
            {
                return(validationResult);
            }

            if (!validationResult.Success)
            {
                return(validationResult);
            }

            return(this.arsnovaClickApi.UpdateQuestionGroup(this.SlideSessionModelToQuestionGroupModel(slideSessionModel), slideSessionModel.PrivateKey));
        }
 public ViewModelRequirements(
     ViewPresenter viewPresenter,
     IQuestionTypeTranslator questionTypeTranslator,
     ILocalizationService localizationService,
     ISessionManager sessionManager,
     ISessionInformationProvider sessionInformationProvider,
     ISlideManipulator slideManipulator,
     SlideSessionModel slideSessionModel)
 {
     this.ViewPresenter              = viewPresenter;
     this.QuestionTypeTranslator     = questionTypeTranslator;
     this.LocalizationService        = localizationService;
     this.SessionManager             = sessionManager;
     this.SessionInformationProvider = sessionInformationProvider;
     this.SlideSessionModel          = slideSessionModel;
     this.SlideManipulator           = slideManipulator;
 }
示例#18
0
        public void ActivateSession(SlideSessionModel slideSessionModel)
        {
            if (slideSessionModel.SessionType == SessionType.ArsnovaClick)
            {
                // push data to server
                this.SetArsnovaClickOnlineSession(slideSessionModel);

                // set question as active
                this.arsnovaClickService.MakeSessionAvailable(slideSessionModel.Hashtag,
                                                              slideSessionModel.PrivateKey);
            }
            else
            {
                // set session as active
                this.arsnovaVotingService.SetSessionAsActive(slideSessionModel);
            }
        }
        private void DeleteAnswersToQuestion(SlideSessionModel slideSessionModel, string questionId)
        {
            this.CheckAuthentification(slideSessionModel);

            var apiPath = "lecturerquestion/" + questionId + "/answer/?_dc=" + this.ConvertToUnixTimestampString(DateTime.Now);

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Delete);

                this.SendRequest(request);
            }
            catch (JsonReaderException exception)
            {
                throw new CommunicationException("Delete question failed", exception);
            }
        }
        private void CheckAuthentification(SlideSessionModel slideSessionModel)
        {
            if (!slideSessionModel.ArsnovaEuConfig.IsAuthenticated)
            {
                if (string.IsNullOrEmpty(slideSessionModel.ArsnovaEuConfig.GuestUserName) &&
                    slideSessionModel.ArsnovaEuConfig.LoginMethod == LoginMethod.Guest)
                {
                    slideSessionModel.ArsnovaEuConfig.GuestUserName = this.GenerateGuestName();
                }

                // TODO implement other authentification methods
                switch (slideSessionModel.ArsnovaEuConfig.LoginMethod)
                {
                case LoginMethod.Guest:
                    this.Login(slideSessionModel);
                    break;
                }
            }
        }
        public void CreateNewSession(SlideSessionModel slideSessionModel)
        {
            this.CheckAuthentification(slideSessionModel);

            var urlSuffix   = "session/?_dc=" + this.ConvertToUnixTimestampString(DateTime.Now);
            var requestBody = "{" +
                              "\"courseId\": null," +
                              "\"courseType\": null," +
                              "\"creationTime\": \"" + this.ConvertToUnixTimestampString(DateTime.Now) + "\"," +
                              "\"name\": \"" + slideSessionModel.ArsnovaVotingSessionName + "\"," +
                              "\"ppAuthorMail\": null," +
                              "\"ppAuthorName\": null," +
                              "\"ppDescription\": null," +
                              "\"ppFaculty\": null," +
                              "\"ppLevel\": null," +
                              "\"ppLicense\": null," +
                              "\"ppLogo\": null," +
                              "\"ppSubject\": null," +
                              "\"ppUniversity\": null," +
                              "\"sessionType\": null," +
                              "\"shortName\": \"" + slideSessionModel.ArsnovaVotingSessionShortName + "\"" +
                              "}";

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, urlSuffix, HttpMethod.Post);

                request = this.AddContentToRequest(request, requestBody);

                var responseString = this.GetResponseString(slideSessionModel, request, HttpStatusCode.Created);

                var sessionModel = JsonConvert.DeserializeObject <SessionModel>(responseString);

                slideSessionModel.Hashtag = sessionModel.keyword;
                slideSessionModel.ArsnovaEuConfig.SessionId = sessionModel._id;

                this.SetFeatures(slideSessionModel);
            }
            catch (JsonReaderException exception)
            {
                throw new CommunicationException("Json-Object not mappable", exception);
            }
        }
        public List <ArsnovaVotingResultReturnElement> GetResults(SlideSessionModel slideSessionModel, SlideQuestionModel slideQuestionModel)
        {
            this.SetQuestionState(slideSessionModel, slideQuestionModel, false);

            var apiPath = "lecturerquestion/" + slideQuestionModel.ArsnovaVotingId + "/answer/?piround=1&_dc=" + this.ConvertToUnixTimestampString(DateTime.Now);

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Get, false);
                request.Headers.Add(HttpRequestHeader.AcceptEncoding, " sdch");

                var responseString = this.GetResponseString(slideSessionModel, request);

                return(JsonConvert.DeserializeObject <List <ArsnovaVotingResultReturnElement> >(responseString));
            }
            catch (JsonReaderException exception)
            {
                throw new CommunicationException("Get results or json deserialization failed", exception);
            }
        }
示例#23
0
        private ValidationResult SetArsnovaClickOnlineSession(SlideSessionModel slideSessionModel)
        {
            var validationResult = new ValidationResult();

            var allHashtagInfos = this.arsnovaClickService.GetAllHashtagInfos();

            if (string.IsNullOrEmpty(slideSessionModel.Hashtag))
            {
                validationResult.FailureTitel   = this.localizationService.Translate("Error during session setup");
                validationResult.FailureMessage = this.localizationService.Translate("Hashtag is needed.");

                return(validationResult);
            }

            var alreadyCreatedHashtag = false;

            if (allHashtagInfos.Any(hi => hi.hashtag.ToLower() == slideSessionModel.Hashtag.ToLower()))
            {
                if (!this.arsnovaClickService.IsThisMineHashtag(slideSessionModel.Hashtag, slideSessionModel.PrivateKey))
                {
                    validationResult.FailureTitel   = this.localizationService.Translate("Error during session setup");
                    validationResult.FailureMessage =
                        this.localizationService.Translate("Can't create session, hashtag is already taken.");

                    return(validationResult);
                }
                else
                {
                    alreadyCreatedHashtag = true;
                }
            }

            if (!alreadyCreatedHashtag)
            {
                this.CreateSession(slideSessionModel);
            }

            validationResult = this.arsnovaClickService.UpdateQuestionGroup(slideSessionModel);

            return(validationResult);
        }
        private QuestionGroupModel SlideSessionModelToQuestionGroupModel(SlideSessionModel slideSessionModel)
        {
            var questionModelList =
                slideSessionModel.Questions.Where(q => !q.Hidden).Select(q => this.SlideQuestionModelToQuestionModel(q, slideSessionModel.Hashtag)).ToList();

            // a valid questionGroupModel requires a hashtag only, the rest can be null or missing (not defined) -> change values to null if not needed (from pre-config)
            return(new QuestionGroupModel
            {
                hashtag = Uri.EscapeDataString(slideSessionModel.Hashtag),
                questionList = questionModelList,
                configuration = new ConfigurationModel
                {
                    hashtag = Uri.EscapeDataString(slideSessionModel.Hashtag),
                    music = new MusicModel
                    {
                        hashtag = Uri.EscapeDataString(slideSessionModel.Hashtag),
                        isUsingGlobalVolume = true,
                        lobbyEnabled = true,
                        lobbyTitle = "Song3",
                        lobbyVolume = 90,
                        countdownRunningEnabled = true,
                        countdownRunningTitle = "Song1",
                        countdownRunningVolume = 90,
                        countdownEndEnabled = true,
                        countdownEndTitle = "LobbySong1",
                        countdownEndVolume = 90
                    },
                    nicks = new NicksModel
                    {
                        hashtag = Uri.EscapeDataString(slideSessionModel.Hashtag),
                        selectedValues = new List <string>(),
                        blockIllegal = true,
                        restrictToCASLogin = false
                    },
                    theme = "material",
                    readingConfirmationEnabled = false,
                    showResponseProgress = false
                },
                type = "DefaultQuestionGroup"
            });
        }
        private List <LectureQuestionModelWithId> GetAllQuestionsFromSession(SlideSessionModel slideSessionModel)
        {
            this.CheckAuthentification(slideSessionModel);

            var apiPath = "lecturerquestion/?sessionkey=" + slideSessionModel.Hashtag + "&preparationquestionsonly=true&requestImageData=false&_dc=" + this.ConvertToUnixTimestampString(DateTime.Now);

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Get);

                var responseString = this.GetResponseString(slideSessionModel, request);

                return(JsonConvert.DeserializeObject <List <LectureQuestionModelWithId> >(responseString));
            }
            catch (Exception e)
            {
                // throw new CommunicationException("Delete question failed", exception);
                // no content where returned, session is empty:
                return(null);
            }
        }
        private Tuple <string, string> CreateQuestion(SlideSessionModel slideSessionModel, LectureQuestionModel question, string sessionId)
        {
            var apiPath     = "session/" + sessionId + "/question?_dc=" + this.ConvertToUnixTimestampString(DateTime.Now);
            var requestBody = JsonConvert.SerializeObject(question);

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Post);
                request = this.AddContentToRequest(request, requestBody);

                var responseString = this.GetResponseString(slideSessionModel, request, HttpStatusCode.Created);

                var questionModel = JsonConvert.DeserializeObject <LectureQuestionModelWithId>(responseString);

                return(new Tuple <string, string>(questionModel._id, questionModel._rev));
            }
            catch (JsonReaderException exception)
            {
                throw new CommunicationException("Create question failed (maybe Json-Object not mappable)", exception);
            }
        }
示例#27
0
        public void StartClickQuestion(SlideSessionModel slideSessionModel, int questionIndex, Slide questionTimerSlideParam, Slide resultsSlideParam)
        {
            var validationResult = new ValidationResult();

            this.currentQuestionModel = slideSessionModel.Questions.First(q => q.Index == questionIndex);

            this.questionTimerSlide       = questionTimerSlideParam;
            this.resultsSlide             = resultsSlideParam;
            this.currentSlideSessionModel = slideSessionModel;

            validationResult = this.arsnovaClickService.StartNextQuestion(slideSessionModel, this.currentQuestionModel.RecalculatedOnlineIndex);

            this.countdown      = this.currentQuestionModel.Countdown;
            this.timer          = new Timer(1000);
            this.timer.Elapsed += this.HandleTimerEvent;
            this.timer.Start();

            if (!validationResult.Success)
            {
                throw new CommunicationException(validationResult.FailureMessage);
            }
        }
        private LectureQuestionModel GetLectureQuestion(SlideSessionModel slideSessionModel, string questionId)
        {
            /*var allQuestions = this.GetAllQuestionsOfSession(slideSessionModel);
             *
             * return allQuestions.FirstOrDefault(q => q._id == questionId);*/

            this.CheckAuthentification(slideSessionModel);
            var apiPath = "lecturerquestion/" + questionId;

            try
            {
                var request = this.CreateWebRequest(slideSessionModel, apiPath, HttpMethod.Get);

                var responseString = this.GetResponseString(slideSessionModel, request);

                return(JsonConvert.DeserializeObject <LectureQuestionModelWithId>(responseString));
            }
            catch (JsonReaderException exception)
            {
                throw new CommunicationException("Json-Object not mappable", exception);
            }
        }
        private string GetResponseString(SlideSessionModel slideSessionModel, HttpWebRequest httpWebRequest, HttpStatusCode expectedHttpStatusCode = HttpStatusCode.OK, bool afterAuthCheck = false)
        {
            try
            {
                var response = (HttpWebResponse)httpWebRequest.GetResponse();

                var responseStream = response.GetResponseStream();

                if (responseStream == null)
                {
                    throw new CommunicationException("Expected response stream is null", response.StatusCode);
                }

                var responseString = new StreamReader(responseStream).ReadToEnd();

                if (response.StatusCode != expectedHttpStatusCode)
                {
                    if (response.StatusCode == HttpStatusCode.Unauthorized && !afterAuthCheck)
                    {
                        this.Login(slideSessionModel);

                        this.GetResponseString(slideSessionModel, httpWebRequest, expectedHttpStatusCode, true);
                    }

                    throw new CommunicationException("Unexpected response from server", response.StatusCode, responseString);
                }

                return(responseString);
            }
            catch (WebException webException)
            {
                throw new CommunicationException("Web Exception while requesting response", webException);
            }
            catch (Exception exception)
            {
                throw new CommunicationException("General Exception while requesting response", exception);
            }
        }
        public void CreateOrUpdateQuestion(SlideSessionModel slideSessionModel, int questionIndex)
        {
            var question = slideSessionModel.Questions.FirstOrDefault(q => q.Index == questionIndex);

            if (question != null)
            {
                this.CheckAuthentification(slideSessionModel);
                var arsnovaQuestion = this.SlideQuestionModelToLectureQuestionModel(question, slideSessionModel.Hashtag);

                if (string.IsNullOrEmpty(question.ArsnovaVotingId))
                {
                    var questionIds = this.CreateQuestion(slideSessionModel, arsnovaQuestion, slideSessionModel.Hashtag);
                    question.ArsnovaVotingId = questionIds.Item1;
                    question.RevisionsId     = questionIds.Item2;
                }
                else
                {
                    var questionIds = this.UpdateQuestion(slideSessionModel, question, question.ArsnovaVotingId);
                    question.ArsnovaVotingId = questionIds.Item1;
                    question.RevisionsId     = questionIds.Item2;
                }
            }
        }