private async Task <bool> CheckInputAsync(int exerciseId, object input) { // Don't allow the user to cancel this too early, but also ensure that the application doesn't block too long var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); // Get current user int userId = GetCurrentUser().UserId; // Check input bool correct = await _stateService.CheckInputAsync(exerciseId, userId, input, cts.Token); // Notify CTF system int?exerciseNumber = _labConfiguration.CurrentConfiguration.Exercises.FirstOrDefault(e => e.Id == exerciseId)?.CtfExerciseNumber; if (exerciseNumber != null) { await _ctfApiClient.CreateExerciseSubmissionAsync(new Ctf4e.Api.Models.ApiExerciseSubmission { ExerciseNumber = exerciseNumber.Value, UserId = userId, ExercisePassed = correct, Weight = 1, SubmissionTime = DateTime.Now }, cts.Token); } return(correct); }