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); }
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 ???"); } }