예제 #1
0
        public static void Log(this GradedSubmission flag, ILogger logger)
        {
            logger.LogInformation(EngineEvent.ProblemGraded,
                                  "{ProblemId} {SubmissionId} {Status} {Timestamp}",
                                  flag.SubmissionId,
                                  flag.Status,
                                  flag.Timestamp
                                  );

            flag.State.Log(logger);
        }
예제 #2
0
        public Task Grade(ProblemFlag flag)
        {
            bool passed = false;

            if (!Cache.TryGetValue(Key(flag.Id), out ProblemState state))
            {
                throw new Exception("Problem not found.");
            }

            if (state.End != null && state.End != DateTime.MinValue)
            {
                throw new Exception("Problem already complete.");
            }

            Logger.LogDebug("received flag");

            var graded = new GradedSubmission
            {
                SubmissionId = flag.SubmissionId,
                ProblemId    = flag.Id,
                Timestamp    = DateTime.UtcNow,
                Status       = SubmissionStatus.Submitted,
                State        = state
            };

            Task.WaitAll(Handler.Update(graded));

            Logger.LogDebug("grading flag");

            if (Cache.TryGetValue(FlagKey(flag.Id), out string target))
            {
                passed = flag.Tokens[0] == target;
            }

            if (passed || flag.Count >= 3)
            {
                state.End            = DateTime.UtcNow;
                state.Status         = passed ? ProblemStatus.Success : ProblemStatus.Failure;
                state.Percent        = passed ? 10 : 0;
                state.GamespaceReady = false;
            }

            graded.Status = passed ? SubmissionStatus.Passed : SubmissionStatus.Failed;

            Task.Delay(new Random().Next(2000, 6000)).Wait();

            Logger.LogDebug("graded flag");

            Task.WaitAll(Handler.Update(graded));

            return(Task.CompletedTask);
        }
예제 #3
0
 public IActionResult Graded([FromBody] GradedSubmission model)
 {
     model.Log(Logger);
     return(Ok());
 }
예제 #4
0
 public async Task Update(GradedSubmission submission)
 {
     Logger.LogInformation(JsonConvert.SerializeObject(submission));
     await Task.Delay(0);
 }