/// <summary> /// 将给定的用户提交记录添加至数据库中。 /// </summary> /// <param name="entity">要添加的用户提交记录实体对象。</param> /// <exception cref="ArgumentNullException"/> public void AddSubmissionEntity(SubmissionEntity entity) { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } Submissions.Add(entity); SaveChanges(); }
private Response <IndexDocumentsResult> ProcessResponse(Response <IndexDocumentsResult> response) { if (CollectSubmissions) { Submissions.Add(response); } if (ResponseTransformer != null) { List <IndexingResult> results = response.Value.Results.ToList(); for (int i = 0; i < results.Count; i++) { results[i] = ResponseTransformer(results[i]); } response = Response.FromValue( new IndexDocumentsResult(results), response.GetRawResponse()); } return(response); }
public async Task <IActionResult> OnPostAsync(int puzzleId, string submissionText) { if (String.IsNullOrWhiteSpace(submissionText)) { ModelState.AddModelError("submissionText", "Your answer cannot be empty"); } SubmissionText = submissionText; if (DateTime.UtcNow < Event.EventBegin) { return(NotFound("The event hasn't started yet!")); } await SetupContext(puzzleId); if (!ModelState.IsValid) { return(Page()); } // Don't allow submissions if the team is locked out. if (PuzzleState.IsTeamLockedOut) { return(Page()); } // Don't allow submissions if team is in email only mode. if (PuzzleState.IsEmailOnlyMode) { return(Page()); } // Don't allow submissions after the answer has been found. if (PuzzleState.SolvedTime != null) { return(Page()); } // Don't accept posted submissions when a puzzle is causing lockout if (PuzzlesCausingGlobalLockout.Count != 0 && !PuzzlesCausingGlobalLockout.Contains(Puzzle)) { return(Page()); } // Soft enforcement of duplicates to give a friendly message in most cases DuplicateSubmission = (from sub in Submissions where sub.SubmissionText == ServerCore.DataModel.Response.FormatSubmission(submissionText) select sub).Any(); if (DuplicateSubmission) { return(Page()); } // Create submission and add it to list Submission submission = new Submission { TimeSubmitted = DateTime.UtcNow, Puzzle = PuzzleState.Puzzle, Team = PuzzleState.Team, Submitter = LoggedInUser, AllowFreeformSharing = AllowFreeformSharing }; string submissionTextToCheck = ServerCore.DataModel.Response.FormatSubmission(submissionText); if (Puzzle.IsFreeform) { submission.UnformattedSubmissionText = submissionText; } else { submission.SubmissionText = submissionText; } submission.Response = await _context.Responses.Where( r => r.Puzzle.ID == puzzleId && submissionTextToCheck == r.SubmittedText) .FirstOrDefaultAsync(); Submissions.Add(submission); // Update puzzle state if submission was correct if (submission.Response != null && submission.Response.IsSolution) { await PuzzleStateHelper.SetSolveStateAsync(_context, Event, submission.Puzzle, submission.Team, submission.TimeSubmitted); AnswerToken = submission.SubmissionText; } else if (!Puzzle.IsFreeform && submission.Response == null && Event.IsAnswerSubmissionActive) { // We also determine if the puzzle should be set to email-only mode. if (IsPuzzleSubmissionLimitReached( Event, Submissions, PuzzleState)) { await PuzzleStateHelper.SetEmailOnlyModeAsync(_context, Event, submission.Puzzle, submission.Team, true); var authors = await _context.PuzzleAuthors.Where((pa) => pa.Puzzle == submission.Puzzle).Select((pa) => pa.Author.Email).ToListAsync(); MailHelper.Singleton.SendPlaintextBcc(authors, $"{Event.Name}: Team {submission.Team.Name} is in email mode for {submission.Puzzle.Name}", ""); } else { // If the submission was incorrect and not a partial solution, // we will do the lockout computations now. DateTime?lockoutExpiryTime = ComputeLockoutExpiryTime( Event, Submissions, PuzzleState); if (lockoutExpiryTime != null) { await PuzzleStateHelper.SetLockoutExpiryTimeAsync(_context, Event, submission.Puzzle, submission.Team, lockoutExpiryTime); } } } _context.Submissions.Add(submission); await _context.SaveChangesAsync(); SubmissionViews.Add(new SubmissionView() { Submission = submission, Response = submission.Response, SubmitterName = LoggedInUser.Name, IsFreeform = Puzzle.IsFreeform }); return(Page()); }
public async Task <IActionResult> OnPostAsync(int puzzleId) { if (!this.Event.IsAnswerSubmissionActive) { return(RedirectToPage("/Submissions/Index", new { puzzleid = puzzleId })); } await SetupContext(puzzleId); if (!ModelState.IsValid) { return(Page()); } // Don't allow submissions after the answer has been found. if (PuzzleState.SolvedTime != null) { return(Page()); } // Create submission and add it to list Submission submission = new Submission { SubmissionText = SubmissionText, TimeSubmitted = DateTime.UtcNow, Puzzle = PuzzleState.Puzzle, Team = PuzzleState.Team, Submitter = LoggedInUser, }; submission.Response = await _context.Responses.Where( r => r.Puzzle.ID == puzzleId && submission.SubmissionText == r.SubmittedText) .FirstOrDefaultAsync(); Submissions.Add(submission); // Update puzzle state if submission was correct if (submission.Response != null && submission.Response.IsSolution) { await PuzzleStateHelper.SetSolveStateAsync(_context, Event, submission.Puzzle, submission.Team, submission.TimeSubmitted); } else if (submission.Response == null) { // We also determine if the puzzle should be set to email-only mode. if (IsPuzzleSubmissionLimitReached( Event, Submissions, PuzzleState)) { await PuzzleStateHelper.SetEmailOnlyModeAsync(_context, Event, submission.Puzzle, submission.Team, true); } else { // If the submission was incorrect and not a partial solution, // we will do the lockout computations now. DateTime?lockoutExpiryTime = ComputeLockoutExpiryTime( Event, Submissions, PuzzleState); if (lockoutExpiryTime != null) { await PuzzleStateHelper.SetLockoutExpiryTimeAsync(_context, Event, submission.Puzzle, submission.Team, lockoutExpiryTime); } } } _context.Submissions.Add(submission); await _context.SaveChangesAsync(); return(RedirectToPage( "/Submissions/Index", new { puzzleid = puzzleId })); }