public async Task ProcessResult(UserExerciseSubmission submission, RunningResults result) { if (result.StyleErrors == null || result.StyleErrors.Count == 0) { return; } if (result.Verdict != Verdict.Ok) { return; } var checking = submission.AutomaticChecking; if (!checking.IsRightAnswer) { return; } var exerciseSlide = (await courseManager.FindCourseAsync(submission.CourseId)) ?.FindSlideById(submission.SlideId, true) as ExerciseSlide; if (exerciseSlide == null) { return; } if (ulearnBotUserId == null) { ulearnBotUserId = await usersRepo.GetUlearnBotUserId(); } var exerciseMetricId = ExerciseController.GetExerciseMetricId(submission.CourseId, exerciseSlide); metricSender.SendCount($"exercise.{exerciseMetricId}.StyleViolation"); foreach (var error in result.StyleErrors) { await slideCheckingsRepo.AddExerciseCodeReview( submission.Id, ulearnBotUserId, error.Span.StartLinePosition.Line, error.Span.StartLinePosition.Character, error.Span.EndLinePosition.Line, error.Span.EndLinePosition.Character, error.Message ); var errorName = error.ErrorType; metricSender.SendCount("exercise.style_error"); metricSender.SendCount($"exercise.style_error.{errorName}"); metricSender.SendCount($"exercise.{exerciseMetricId}.style_error"); metricSender.SendCount($"exercise.{exerciseMetricId}.style_error.{errorName}"); } }