예제 #1
0
        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));
        }
예제 #2
0
        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,
                }
            }));
        }
예제 #3
0
 private async Task <bool> SendSubmissionResultsToQueue(XQueueClient client, XQueueExerciseSubmission submission)
 {
     return(await FuncUtils.TrySeveralTimesAsync(
                () => TrySendSubmissionResultsToQueue(client, submission),
                5,
                () => Task.Delay(TimeSpan.FromMilliseconds(1))));
 }
예제 #4
0
        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);
            }
        }
예제 #5
0
파일: Program.cs 프로젝트: DerArvend/Ulearn
        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]",
                    }
                });
            }
        }
예제 #6
0
        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);
            }
        }