private async Task <bool> TrySendSubmissionResultsToQueue(XQueueClient client, XQueueExerciseSubmission submission) { var checking = submission.Submission.AutomaticChecking; var courseManager = WebCourseManager.Instance; var slide = courseManager.FindCourse(checking.CourseId)?.FindSlideById(checking.SlideId) as ExerciseSlide; if (slide == null) { log.Warn($"Can't find exercise slide {checking.SlideId} in course {checking.CourseId}. Exit"); return(false); } var score = (double)checking.Score / slide.Scoring.PassedTestsScore; if (score > 1) { score = 1; } var message = checking.IsCompilationError ? checking.CompilationError.Text : checking.Output.Text; return(await client.PutResult(new XQueueResult { header = submission.XQueueHeader, Body = new XQueueResultBody { IsCorrect = checking.IsRightAnswer, Message = message, Score = score, } }).ConfigureAwait(false)); }
private async Task <bool> TrySendSubmissionResultsToQueue(XQueueClient client, XQueueExerciseSubmission submission) { var checking = submission.Submission.AutomaticChecking; var slide = (await courseManager.FindCourseAsync(checking.CourseId))?.FindSlideById(checking.SlideId, true) as ExerciseSlide; if (slide == null) { log.Warn($"Can't find exercise slide {checking.SlideId} in course {checking.CourseId}. Exit"); return(false); } var score = checking.IsRightAnswer ? 1 : 0; var message = checking.IsCompilationError ? checking.CompilationError.Text : checking.Output.Text; return(await client.PutResult(new XQueueResult { header = submission.XQueueHeader, Body = new XQueueResultBody { IsCorrect = checking.IsRightAnswer, Message = message, Score = score, } })); }
private async Task <bool> SendSubmissionResultsToQueue(XQueueClient client, XQueueExerciseSubmission submission) { return(await FuncUtils.TrySeveralTimesAsync( () => TrySendSubmissionResultsToQueue(client, submission), 5, () => Task.Delay(TimeSpan.FromMilliseconds(1)))); }
public async Task ProcessResult(UserExerciseSubmission submission, RunningResults result) { var xQueueSubmission = await xQueueRepo.FindXQueueSubmission(submission); if (xQueueSubmission == null) { return; } var watcher = xQueueSubmission.Watcher; var client = new XQueueClient(watcher.BaseUrl, watcher.UserName, watcher.Password); await client.Login(); if (await SendSubmissionResultsToQueue(client, xQueueSubmission)) { await xQueueRepo.MarkXQueueSubmissionThatResultIsSent(xQueueSubmission); } }
private async Task GetAndProcessSubmissionFromXQueue(Database.Models.XQueueWatcher watcher) { if (!clientsCache.TryGetValue(watcher.Id, out var client)) { client = new XQueueClient(watcher.BaseUrl, watcher.UserName, watcher.Password); if (!await client.Login()) { log.Error($"Can\'t login to xqueue {watcher.QueueName} ({watcher.BaseUrl}, user {watcher.UserName})"); return; } clientsCache[watcher.Id] = client; } var submission = await client.GetSubmission(watcher.QueueName); if (submission == null) { return; } log.Info($"Got new submission in xqueue {watcher.QueueName}: {submission.JsonSerialize()}"); try { await ProcessSubmissionFromXQueue(watcher, submission); } catch (Exception e) { log.Error($"Error occurred while processing submission from xqueue: {e.Message}", e); await client.PutResult(new XQueueResult { header = submission.header, Body = new XQueueResultBody { Score = 0, IsCorrect = false, Message = "Sorry, we can't check your code now. Please retry or contact us at [email protected]", } }); } }
public async Task ProcessResult(ULearnDb db, UserExerciseSubmission submission, RunningResults result) { var courseManager = WebCourseManager.Instance; var xQueueRepo = new XQueueRepo(db, courseManager); var xQueueSubmission = xQueueRepo.FindXQueueSubmission(submission); if (xQueueSubmission == null) { return; } var watcher = xQueueSubmission.Watcher; var client = new XQueueClient(watcher.BaseUrl, watcher.UserName, watcher.Password); await client.Login().ConfigureAwait(false); if (await SendSubmissionResultsToQueue(client, xQueueSubmission).ConfigureAwait(false)) { await xQueueRepo.MarkXQueueSubmissionThatResultIsSent(xQueueSubmission).ConfigureAwait(false); } }