public static bool _Rehack(int id)
        {
            Database.DB DbContext = new Database.DB();
            var         hack      = DbContext.Hacks.Find(id);
            var         status    = hack.Status;
            var         problem   = status.Problem;
            var         contest   = problem.Contest;

            if (status.Result == Entity.JudgeResult.Hacked)
            {
                DbContext.TestCases.Remove(status.JudgeTasks.Last().TestCase);
                DbContext.SaveChanges();
                status.Result = status.JudgeTasks.Max(x => x.Result);
                DbContext.SaveChanges();
            }
            var group = SignalR.JudgeHub.GetNode();

            hack.Result = Entity.HackResult.Pending;
            DbContext.SaveChanges();
            if (group == null)
            {
                return(false);
            }
            SignalR.JudgeHub.context.Clients.Group(group).Hack(new Judge.Models.HackTask(hack));
            SignalR.JudgeHub.ThreadBusy(group);
            hack.Result = Entity.HackResult.Running;
            DbContext.SaveChanges();
            return(true);
        }
 public static bool IsUserInPrivateContest(Entity.User user, Entity.Contest contest)
 {
     if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End)
         return true;
     if (string.IsNullOrEmpty(contest.Password))
         return true;
     if (user == null)
         return false;
     var joinlog = contest.JoinLogs.Where(x => x.UserID == user.ID).FirstOrDefault();
     if (joinlog == null)
     {
         if (user.Role >= Entity.UserRole.Master || (from cm in contest.Managers select cm.UserID).Contains(user.ID))
         {
             Database.DB DbContext = new Database.DB();
             DbContext.JoinLogs.Add(new Entity.JoinLog
             {
                 ContestID = contest.ID,
                 UserID = user.ID
             });
             DbContext.SaveChanges();
             return true;
         }
         else
         {
             return false;
         }
     }
     return true;
 }
Beispiel #3
0
        public bool Auth(string Username, string Password, int MaxThreads)
        {
            var pwd  = Helpers.Security.SHA1(Password);
            var user = (from u in DbContext.Users
                        where u.Username == Username &&
                        u.Password == pwd &&
                        u.RoleAsInt == (int)Entity.UserRole.Root
                        select u).SingleOrDefault();

            if (user != null)
            {
                user.Online = true;
                DbContext.SaveChanges();
                var    index = Online.FindIndex(x => x.Username == user.Username);
                Client client;
                if (index >= 0)
                {
                    Groups.Remove(Online[index].Token, Online[index].Username);
                    Online[index].Token = Context.ConnectionId;
                    Groups.Add(Context.ConnectionId, user.Username);
                    client = Online[index];
                }
                else
                {
                    client = new Client {
                        Token = Context.ConnectionId, Username = user.Username, MaxThreads = MaxThreads, CurrentThreads = 0
                    };
                    Online.Add(client);
                }
                Online = Online.Distinct().ToList();
                System.Threading.Tasks.Task.Factory.StartNew(() =>
                {
                    SignalR.CodeCombHub.context.Clients.Group("System Judge").onJudgerStatusChanged(new Models.View.Judger(user, client));
                });
                Groups.Add(Context.ConnectionId, user.Username);
                Clients.Group(user.Username).onMessage(String.Format("{0},欢迎您。您已经成功注册成为Code Comb评测机!", user.Username));
                var time         = DateTime.Now.AddMinutes(-5);
                var err_statuses = (from s in DbContext.Statuses
                                    where s.ResultAsInt == (int)Entity.JudgeResult.Pending ||
                                    (s.ResultAsInt == (int)Entity.JudgeResult.Running && s.Time < time)
                                    select s).ToList();
                foreach (var status in err_statuses)
                {
                    foreach (var jt in status.JudgeTasks.ToList())
                    {
                        var judgetask = new Judge.Models.JudgeTask(jt);
                        ThreadBusy(user.Username);
                        System.Threading.Tasks.Task.Factory.StartNew(() =>
                        {
                            SignalR.JudgeHub.context.Clients.Group(user.Username).Judge(judgetask);
                        });
                    }
                    status.Result = Entity.JudgeResult.Running;
                    DbContext.SaveChanges();
                    SignalR.CodeCombHub.context.Clients.All.onStatusCreated(new Models.View.Status(status));//推送新状态
                }
                return(true);
            }
            return(false);
        }
Beispiel #4
0
        public static void RatingDelete(int id)
        {
            var DbContext   = new Database.DB();
            var old_ratings = (from r in DbContext.Ratings
                               where r.ContestID == id
                               select r).ToList();

            foreach (var r in old_ratings)
            {
                DbContext.Ratings.Remove(r);
            }
            DbContext.SaveChanges();
        }
        public IActionResult Create(CategoryModel model)
        {
            if (ModelState.IsValid)
            {
                using (var db = new Database.DB())
                {
                    db.Categories.Add(new Database.Categories()
                    {
                        Name = model.Name,
                    });
                    db.SaveChanges();
                }

                return(RedirectToAction(nameof(Index)));
            }
            return(View(model));
        }
Beispiel #6
0
        public static bool IsUserInPrivateContest(Entity.User user, Entity.Contest contest)
        {
            if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End)
            {
                return(true);
            }
            if (string.IsNullOrEmpty(contest.Password))
            {
                return(true);
            }
            if (user == null)
            {
                return(false);
            }
            var joinlog = contest.JoinLogs.Where(x => x.UserID == user.ID).FirstOrDefault();

            if (joinlog == null)
            {
                if (user.Role >= Entity.UserRole.Master || (from cm in contest.Managers select cm.UserID).Contains(user.ID))
                {
                    Database.DB DbContext = new Database.DB();
                    DbContext.JoinLogs.Add(new Entity.JoinLog
                    {
                        ContestID = contest.ID,
                        UserID    = user.ID
                    });
                    DbContext.SaveChanges();
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
Beispiel #7
0
        public static void RatingCount(int id)//contest_id
        {
            RatingDelete(id);

            #region 初始化
            var DbContext = new Database.DB();
            var contest   = DbContext.Contests.Find(id);
            var statuses  = (from s in DbContext.Statuses
                             where s.Problem.ContestID == contest.ID
                             select s).ToList();
            var ranklist = Helpers.Standings.Build(id);
            var problems = contest.Problems.OrderBy(x => x.Credit).ToList();
            #endregion
            for (int i = 0; i < ranklist.Count; i++)
            {
                var user_credits = 0;
                #region 计算排名分 (-15 ~ 15)
                var pts = ranklist.Count / 2 - i;
                if (pts > 15)
                {
                    pts = 15;
                }
                if (pts < -15)
                {
                    pts = -15;
                }
                user_credits += pts - i;
                #endregion
                var num = 0;
                foreach (var detail in ranklist[i].Details)
                {
                    var problem_ratings = problems[num].Difficulty;
                    var user            = DbContext.Users.Find(ranklist[i].UserID);

                    var user_ratings = user.Ratings.Sum(x => x.Credit) + 1500;
                    var extend_pts   = (problem_ratings - user_ratings) / 300.0;
                    if (extend_pts > 1)
                    {
                        extend_pts = 1;
                    }
                    if (extend_pts < -1)
                    {
                        extend_pts = -1;
                    }

                    #region ACM赛制
                    if (contest.Format == Entity.ContestFormat.ACM)
                    {
                        var base_pts = 10;
                        base_pts -= detail.Key3;
                        if (base_pts < 0)
                        {
                            base_pts = 0;
                        }
                        if (detail.Key1 == 1)
                        {
                            user_credits += base_pts + (int)(Math.Floor((extend_pts + 1) * 25));
                        }
                        else
                        {
                            user_credits += (int)(Math.Floor((extend_pts - 1) * 25));
                        }
                    }
                    #endregion
                    #region OI赛制
                    else if (contest.Format == Entity.ContestFormat.OI)
                    {
                        if (detail.Key1 > 50)
                        {
                            user_credits += (int)((Math.Floor((extend_pts + 1) * 25) * (100 - detail.Key1) / 50.0));
                        }
                        else
                        {
                            user_credits += (int)(Math.Floor((extend_pts - 1) * 25) * (100 - detail.Key1) / 100.0);
                        }
                    }
                    #endregion
                    #region OPJOI赛制
                    else if (contest.Format == Entity.ContestFormat.OPJOI)
                    {
                        var base_pts = 10;
                        base_pts -= detail.Key2 + 1;
                        if (base_pts < 0)
                        {
                            base_pts = 0;
                        }
                        if (detail.Key1 > 50)
                        {
                            user_credits += (int)((Math.Floor((extend_pts + 1) * 25) * (100 - detail.Key1) / 50.0));
                        }
                        else
                        {
                            user_credits += (int)(Math.Floor((extend_pts - 1) * 25) * (100 - detail.Key1) / 100.0);
                        }
                    }
                    #endregion
                    #region CF、TC赛制
                    else if (contest.Format == Entity.ContestFormat.Codeforces || contest.Format == Entity.ContestFormat.TopCoder)
                    {
                        var base_pts = (int)Math.Floor(detail.Key2 - (detail.Key3 / 2.0));
                        if (base_pts > 10)
                        {
                            base_pts = 10;
                        }
                        if (base_pts < -5)
                        {
                            base_pts = -5;
                        }
                        if (base_pts < 0)
                        {
                            base_pts = 0;
                        }
                        if (detail.Key1 > 0)
                        {
                            user_credits += base_pts + (int)((Math.Floor((extend_pts + 1) / 30)) * (problems[num].Credit - detail.Key1));
                        }
                        else
                        {
                            user_credits += base_pts + (int)((Math.Floor((extend_pts + 1) / 25)));
                        }
                    }
                    #endregion
                    num++;
                }
                DbContext.Ratings.Add(new Entity.Rating
                {
                    Credit    = user_credits,
                    ContestID = id,
                    Time      = contest.End,
                    UserID    = ranklist[i].UserID
                });
                DbContext.SaveChanges();
            }
        }
        public static bool  _Rejudge(int id)
        {
            Database.DB DbContext = new Database.DB();
            var         status    = DbContext.Statuses.Find(id);
            var         problem   = status.Problem;
            var         contest   = problem.Contest;
            List <int>  testcase_ids;

            if (DateTime.Now < contest.Begin || DateTime.Now >= contest.End || contest.Format == Entity.ContestFormat.ACM || contest.Format == Entity.ContestFormat.OPJOI || contest.Format == Entity.ContestFormat.OI)
            {
                testcase_ids = (from tc in problem.TestCases
                                where tc.Type != Entity.TestCaseType.Sample
                                orderby tc.Type ascending
                                select tc.ID).ToList();
            }
            else if (contest.Format == Entity.ContestFormat.Codeforces)
            {
                testcase_ids = (from tc in problem.TestCases
                                where tc.Type == Entity.TestCaseType.Unilateralism
                                orderby tc.Type ascending
                                select tc.ID).ToList();
                var statuses = problem.GetContestStatuses().Where(x => x.UserID == status.UserID).ToList();
                foreach (var s in statuses)
                {
                    foreach (var jt in s.JudgeTasks)
                    {
                        testcase_ids.Add(jt.TestCaseID);
                    }
                }
                testcase_ids = testcase_ids.Distinct().ToList();
            }
            else
            {
                if (DateTime.Now < contest.RestBegin)
                {
                    testcase_ids = (from tc in problem.TestCases
                                    where tc.Type == Entity.TestCaseType.Sample
                                    orderby tc.Type ascending
                                    select tc.ID).ToList();
                }
                else
                {
                    testcase_ids = (from tc in problem.TestCases
                                    where tc.Type != Entity.TestCaseType.Sample
                                    orderby tc.Type ascending
                                    select tc.ID).ToList();
                }
            }
            var existed_ids = (from jt in status.JudgeTasks
                               select jt.TestCaseID).ToList();

            testcase_ids = testcase_ids.Except(existed_ids).ToList();
            foreach (var tid in testcase_ids)
            {
                DbContext.JudgeTasks.Add(new Entity.JudgeTask
                {
                    StatusID    = status.ID,
                    TestCaseID  = tid,
                    Result      = Entity.JudgeResult.Pending,
                    MemoryUsage = 0,
                    TimeUsage   = 0,
                    Hint        = ""
                });
            }
            DbContext.SaveChanges();
            foreach (var jt in status.JudgeTasks)
            {
                try
                {
                    var group = SignalR.JudgeHub.GetNode();
                    if (group == null)
                    {
                        return(false);
                    }
                    SignalR.JudgeHub.context.Clients.Group(group).Judge(new Judge.Models.JudgeTask(jt));
                    SignalR.JudgeHub.ThreadBusy(group);
                    jt.Result = Entity.JudgeResult.Running;
                    DbContext.SaveChanges();
                }
                catch { }
            }
            SignalR.CodeCombHub.context.Clients.All.onStatusCreated(new Models.View.Status(status));//推送新状态
            return(true);
        }