예제 #1
0
        public async Task <UserQueryResultListModel> QueryUser(string patterns)
        {
            var user = await userManager.GetUserAsync(User);

            IQueryable <UserInfo> users;

            if (Utils.PrivilegeHelper.IsTeacher(user.Privilege))
            {
                users = userManager.Users.Where(i =>
                                                (i.Name != null && i.Name.Contains(patterns)) ||
                                                i.NormalizedEmail.Contains(patterns.ToUpperInvariant()) ||
                                                i.NormalizedUserName.Contains(patterns.ToUpperInvariant()));
            }
            else
            {
                users = userManager.Users.Where(i => i.NormalizedUserName.Contains(patterns.ToUpper()));
            }

            var result = users.Select(i => new UserQueryResultModel
            {
                UserId   = i.Id,
                UserName = i.UserName,
                Name     = i.Name,
                Email    = i.Email
            }) /*.Cacheable()*/;

            return(new UserQueryResultListModel
            {
                Users = await result.ToListAsync(),
                TotalCount = await result.CountAsync()
            });
        }
예제 #2
0
        public async Task <UserInfoModel> UserInfo(string?userId = null)
        {
            var signedIn    = signInManager.IsSignedIn(User);
            var userInfoRet = new UserInfoModel
            {
                SignedIn = string.IsNullOrEmpty(userId) && signedIn
            };

            if (string.IsNullOrEmpty(userId))
            {
                userId = userManager.GetUserId(User);
            }
            var user = await userManager.FindByIdAsync(userId);

            var currentUser = string.IsNullOrEmpty(userId) ? user : await userManager.GetUserAsync(User);

            if (userId == null || user == null)
            {
                return(new UserInfoModel());
            }
            userInfoRet.UserId     = user.Id;
            userInfoRet.UserName   = user.UserName;
            userInfoRet.Privilege  = user.Privilege;
            userInfoRet.Coins      = user.Coins;
            userInfoRet.Experience = user.Experience;
            userInfoRet.OtherInfo  = IdentityHelper.GetOtherUserInfo(string.IsNullOrEmpty(user.OtherInfo) ? "{}" : user.OtherInfo);

            if (userInfoRet.SignedIn || PrivilegeHelper.IsTeacher(currentUser?.Privilege))
            {
                userInfoRet.Name                 = user.Name;
                userInfoRet.EmailConfirmed       = user.EmailConfirmed;
                userInfoRet.PhoneNumberConfirmed = user.PhoneNumberConfirmed;
                userInfoRet.Email                = user.Email;
                userInfoRet.PhoneNumber          = user.PhoneNumber;
            }

            return(userInfoRet);
        }
예제 #3
0
        public async Task <GroupModel> GroupDetails(int groupId)
        {
            var user = await userManager.GetUserAsync(User);

            var groups = await groupService.QueryGroupAsync(user?.Id);

            var group = await groups.Where(i => i.Id == groupId).FirstOrDefaultAsync();

            if (group == null)
            {
                throw new NotFoundException("该小组不存在");
            }

            return(new GroupModel
            {
                Id = group.Id,
                UserId = group.UserId,
                UserName = group.UserInfo.UserName,
                Name = group.Name,
                Description = group.Description,
                IsPrivate = group.IsPrivate
            });
        }
예제 #4
0
        public async Task <RankContestStatisticsModel> GetRankForContest(int contestId, int groupId)
        {
            var user = await userManager.GetUserAsync(User);

            var contest = await contestService.GetContestAsync(contestId);

            if (contest == null)
            {
                throw new NotFoundException("该比赛不存在");
            }
            if (groupId != 0)
            {
                var groups = await groupService.QueryGroupAsync(user?.Id);

                groups = groups.Where(i => i.GroupContestConfig.Any(j => j.ContestId == contestId && j.GroupId == groupId)) /*.Cacheable()*/;
                if (!await groups.AnyAsync())
                {
                    throw new NotFoundException("该比赛不存在或未加入对应小组");
                }
            }

            var config = contest.Config.DeserializeJson <ContestConfig>(false);

            if (!config.ShowRank && !Utils.PrivilegeHelper.IsTeacher(user?.Privilege))
            {
                throw new ForbiddenException("不允许查看排名");
            }

            var judges = await judgeService.QueryJudgesAsync(null,
                                                             groupId == 0?null : (int?)groupId,
                                                             contestId,
                                                             0);

            if (config.AutoStopRank && !Utils.PrivilegeHelper.IsTeacher(user?.Privilege) && DateTime.Now < contest.EndTime)
            {
                var time = contest.EndTime.AddHours(-1);
                judges = judges.Where(i => i.JudgeTime < time);
            }

            var ret = new RankContestStatisticsModel
            {
                ContestId = contestId,
                GroupId   = groupId
            };

            var results = judges.OrderBy(i => i.Id).Select(i => new
            {
                Id          = i.Id,
                ProblemId   = i.ProblemId,
                ProblemName = i.Problem.Name,
                UserId      = i.UserId,
                UserName    = i.UserInfo.UserName,
                Name        = i.UserInfo.Name,
                ResultType  = i.ResultType,
                Time        = i.JudgeTime,
                Score       = i.FullScore
            }) /*.Cacheable()*/;

            var isAccepted = new Dictionary <(string UserId, int ProblemId), bool>();

            foreach (var i in results)
            {
                if (!ret.UserInfos.ContainsKey(i.UserId))
                {
                    ret.UserInfos[i.UserId] = new RankUserInfoModel
                    {
                        UserName = i.UserName,
                        Name     = Utils.PrivilegeHelper.IsTeacher(user?.Privilege) ? i.Name : string.Empty
                    }
                }
                ;
                if (!ret.ProblemInfos.ContainsKey(i.ProblemId))
                {
                    ret.ProblemInfos[i.ProblemId] = new RankProblemInfoModel
                    {
                        ProblemName = i.ProblemName
                    }
                }
                ;
                if (!ret.RankInfos.ContainsKey(i.UserId))
                {
                    ret.RankInfos[i.UserId] = new Dictionary <int, RankContestItemModel>();
                }
                if (!ret.RankInfos[i.UserId].ContainsKey(i.ProblemId))
                {
                    ret.RankInfos[i.UserId][i.ProblemId] = new RankContestItemModel();
                }

                if (config.Type != ContestType.LastSubmit)
                {
                    ret.RankInfos[i.UserId][i.ProblemId].Accepted = ret.RankInfos[i.UserId][i.ProblemId].Accepted || (i.ResultType == (int)ResultCode.Accepted);
                }
                else
                {
                    ret.RankInfos[i.UserId][i.ProblemId].Accepted = ret.RankInfos[i.UserId][i.ProblemId].Accepted && (i.ResultType == (int)ResultCode.Accepted);
                }

                if (!isAccepted.ContainsKey((i.UserId, i.ProblemId)))
                {
                    isAccepted[(i.UserId, i.ProblemId)] = false;
예제 #5
0
        public async Task <SubmitSuccessModel> SubmitSolution([FromBody] SubmitModel model)
        {
            var user = await userManager.GetUserAsync(User);

            var now = DateTime.Now;
            var allowJumpToResult = true;

            if (user.Privilege == 5)
            {
                throw new ForbiddenException("不允许提交,请与管理员联系");
            }

            if (model.GroupId != 0)
            {
                var inGroup = await groupService.IsInGroupAsync(user.Id, model.GroupId);

                if (!inGroup)
                {
                    throw new ForbiddenException("未参加该小组");
                }
            }

            var problem = await problemService.GetProblemAsync(model.ProblemId);

            if (problem == null)
            {
                throw new NotFoundException("该题目不存在");
            }
            var problemConfig = problem.Config.DeserializeJson <ProblemConfig>(false);

            // For older version compatibility
            if (problemConfig.SourceFiles.Count == 0)
            {
                problemConfig.SourceFiles.Add(string.IsNullOrEmpty(problemConfig.SubmitFileName) ? "${random}${extension}" : $"{problemConfig.SubmitFileName}${{extension}}");
            }

            var sources = new List <Source>();

            foreach (var i in model.Content)
            {
                if (problemConfig.CodeSizeLimit != 0 && problemConfig.CodeSizeLimit < Encoding.UTF8.GetByteCount(i.Content))
                {
                    throw new BadRequestException("提交内容长度超出限制");
                }
                if (problemConfig.SourceFiles.Contains(i.FileName))
                {
                    sources.Add(new Source
                    {
                        FileName = i.FileName,
                        Content  = i.Content
                    });
                }
            }

            var useDefaultDisabledConfig = false;

            var langConfig = (await languageService.GetLanguageConfigAsync()).ToList();
            var langs      = problemConfig.Languages?.Split(';', StringSplitOptions.RemoveEmptyEntries) ?? new string[0];

            if (langs.Length == 0)
            {
                langs = langConfig.Select(i => i.Name).ToArray();
            }
            else
            {
                useDefaultDisabledConfig = true;
            }

            if (model.ContestId != 0)
            {
                var contest = await contestService.GetContestAsync(model.ContestId);

                if (contest != null)
                {
                    if (contest.StartTime > now || now > contest.EndTime)
                    {
                        throw new ForbiddenException("当前不允许提交");
                    }
                    if (contest.Hidden && !Utils.PrivilegeHelper.IsTeacher(user.Privilege))
                    {
                        throw new NotFoundException("该比赛不存在");
                    }

                    var contestConfig = contest.Config.DeserializeJson <ContestConfig>(false);
                    if (contestConfig.SubmissionLimit != 0)
                    {
                        var judges = await judgeService.QueryJudgesAsync(user.Id,
                                                                         model.GroupId == 0?null : (int?)model.GroupId,
                                                                         model.ContestId,
                                                                         model.ProblemId);

                        if (contestConfig.SubmissionLimit <= await judges /*.Cacheable()*/.CountAsync())
                        {
                            throw new ForbiddenException("超出提交次数限制");
                        }
                    }
                    if (contestConfig.ResultMode != ResultDisplayMode.Intime)
                    {
                        allowJumpToResult = false;
                    }
                    var contestLangs = contestConfig.Languages?.Split(';', StringSplitOptions.RemoveEmptyEntries) ?? new string[0];
                    if (contestLangs.Length != 0)
                    {
                        langs = langs.Intersect(contestLangs).ToArray();
                        useDefaultDisabledConfig = true;
                    }
                }
            }
            else if (problem.Hidden && !Utils.PrivilegeHelper.IsTeacher(user.Privilege))
            {
                throw new NotFoundException("该题目不存在");
            }

            if (!useDefaultDisabledConfig)
            {
                langs = langs.Where(i => langConfig.Any(j => j.Name == i && !j.DisabledByDefault)).ToArray();
            }

            if (!langs.Contains(model.Language))
            {
                throw new ForbiddenException("不允许使用该语言提交");
            }

            user.SubmissionCount++;
            await userManager.UpdateAsync(user);

            var id = await judgeService.QueueJudgeAsync(new Judge
            {
                Content        = sources.SerializeJsonAsString(),
                Language       = model.Language,
                ProblemId      = model.ProblemId,
                ContestId      = model.ContestId == 0 ? null : (int?)model.ContestId,
                GroupId        = model.GroupId == 0 ? null : (int?)model.GroupId,
                UserId         = user.Id,
                Description    = "Online Judge",
                AdditionalInfo = "v2"
            });

            return(new SubmitSuccessModel
            {
                Jump = allowJumpToResult,
                ResultId = id
            });
        }