示例#1
0
        public async Task <OjResult> SubmitCode([FromBody] OjSubmission submission)
        {
            async Task <OjResult> execute(UserInfo userInfo)
            {
                const string ojStatus = "oj_status";
                const string pending  = "pending";
                const string over     = "over";
                var          status   = sessionUtils.GetString(HttpContext, ojStatus);

                switch (status)
                {
                case "pending":
                    return(new OjResult {
                        Pending = true, Pass = false, Failed = false
                    });

                case null:
                case "over":
                    //"over" or null means this submit should be a new request
                    var t = ojService.PendResult(userInfo.Id, submission.OjQuestionId, submission.Code);
                    sessionUtils.SetString(HttpContext, ojStatus, pending);
                    var res = await t;
                    if (res.Pass)
                    {
                        await ojService.SaveSuccess(userInfo.Id, submission.OjQuestionId);
                    }
                    sessionUtils.SetString(HttpContext, ojStatus, over);
                    return(res);

                default:
                    throw new NonUserException("How could this happen ???");
                }
            }

            var userInfo = sessionUtils.GetCachedUserInfo(HttpContext);

            if (userInfo == null)
            {
                throw new UserException("用户未登录!");
            }

            var ojResult = await execute(userInfo);

            if (ojResult.Pending)
            {
                return(ojResult);
            }

            if (ojResult.Pass)
            {
                await ojService.AddSubmitRecord(userInfo.Id, submission.OjQuestionId, submission.Code, "Pass All Test Cases");
            }
            else if (ojResult.Failed)
            {
                await ojService.AddSubmitRecord(userInfo.Id, submission.OjQuestionId, submission.Code, "Compilation Failed");
            }
            else if (!ojResult.Failed)
            {
                await ojService.AddSubmitRecord(userInfo.Id, submission.OjQuestionId, submission.Code, "Can't Pass All Test Cases");
            }

            return(ojResult);
        }
示例#2
0
        public async Task <QuizStatus> StartQuiz()
        {
            var userInfo = RaiseIfNotLoggedIn();
            var status   = sessionUtils.GetString(HttpContext, QuizStatus);

            async Task <QuizStatus> AnsweringDelegate()
            {
                var currScore      = sessionUtils.GetInt(HttpContext, CurrScore);
                var currQuestionId = sessionUtils.GetString(HttpContext, CurrQuestionId);

                if (!currScore.HasValue || currQuestionId == null)
                {
                    //若已经丢失上次的分数和问题id,则直接重置
                    InitQuizStatus();
                    return(new QuizStatus {
                        Ok = true, ContinueLast = false
                    });
                }

                int timeLeft;

                if ((timeLeft = TimeLeft()) <= 0)
                {
                    //已超时
                    var saved = await quizService.SaveScore(userInfo.Id, currScore.Value);

                    InitQuizStatus();
                    return(new QuizStatus {
                        Ok = true, AutomaticSubmitted = true
                    });
                }
                else
                {
                    //继续上次答题
                    //把上次的问题查询到
                    var lastQuestion = await quizService.GetQuestion(currQuestionId);

                    return(new QuizStatus {
                        Ok = false, LastRemainingSecs = timeLeft, ContinueLast = true, LastScore = currScore.Value, LastQuizQuestion = lastQuestion
                    });
                }
            }

            QuizStatus OverOrNullDelegate()
            {
                InitQuizStatus();
                return(new QuizStatus {
                    Ok = true, ContinueLast = false
                });
            }

            switch (status)
            {
            case Answering:
                return(await AnsweringDelegate());

            case Over:
            case null:
                return(OverOrNullDelegate());

            default:
                throw new NonUserException("How could this happen ???");
            }
        }