Files
hustoj/web/contest-check.php
2024-10-10 12:56:56 +08:00

143 lines
7.1 KiB
PHP

<?php
require_once("include/curl.php");
$unixnow = time();
$cid = intval($_GET['cid']);
if ($cid<0) $cid=-$cid;
$view_cid = $cid;
//print $cid;
//check contest valid
$sql = "SELECT * FROM `contest` WHERE `contest_id`=?";
$result = pdo_query($sql,$cid);
$rows_cnt = count($result);
if($rows_cnt>0){
$row = $result[0];
$start_time = strtotime($row['start_time']);
$end_time = strtotime($row['end_time']);
$view_description = $row['description'];
$view_title = $row['title'];
$view_start_time = $row['start_time'];
$view_end_time = $row['end_time'];
}
$contest_ok = true;
$password = "";
if (isset($_POST['password']))
$password = $_POST['password'];
if (false) {
$password = stripslashes($password);
}
if ($rows_cnt==0) {
$view_title = "比赛已经关闭!";
}
else{
$view_private = $row['private'];
$view_contest_creator= $row['user_id'];
if ($password!="" && $password==$row['password'])
$_SESSION[$OJ_NAME.'_'.'c'.$cid] = true;
if ($row['private'] && !isset($_SESSION[$OJ_NAME.'_'.'c'.$cid]))
$contest_ok = false;
// if($row['defunct']=='Y') //defunct problem not in contest/exam list
// $contest_ok = false;
if (isset($_SESSION[$OJ_NAME.'_'.'administrator']) || isset($_SESSION[$OJ_NAME.'_'.'contest_creator']))
$contest_ok = true;
if ($unixnow>$end_time) $contest_is_over=true; // 已经结束的比赛,按练习方式提交
else $contest_is_over=false;
if (!isset($_SESSION[$OJ_NAME.'_'.'administrator']) && $unixnow<$start_time) {
$view_errors = "<center>";
$view_errors .= "<h3>$MSG_CONTEST_ID : $view_cid - $view_title</h3>";
$view_errors .= "<p>$view_description</p>";
$view_errors .= "<br>";
$view_errors .= "<span class=text-success>$MSG_TIME_WARNING</span>";
$view_errors .= "</center>";
$view_errors .= "<br><br>";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
}
if(!isset($OJ_CONTEST_LIMIT_KEYWORD)) $OJ_CONTEST_LIMIT_KEYWORD="限时";
if($contest_ok && str_contains($view_description,$OJ_CONTEST_LIMIT_KEYWORD)&&isset($_SESSION[$OJ_NAME."_user_id"])){
echo "<!-- 个人限时赛 -->";
$contest_limit_minutes=intval(getPartByMark($view_description,$OJ_CONTEST_LIMIT_KEYWORD,"分钟")); //允许比赛描述中用 "限时xx分钟" 规定个人做题时间。
if($contest_limit_minutes==0) $contest_limit_minutes=120;
echo "<!-- $contest_limit_minutes mins -->";
$user_id=$_SESSION[$OJ_NAME."_user_id"];
$first_login_contest=pdo_query("select time from loginlog where user_id=? and password=?",$user_id,"c".$cid);
if(empty($first_login_contest)){
echo "<!-- 首次访问 -->";
$ip = ($_SERVER['REMOTE_ADDR']);
if( isset($_SERVER['HTTP_X_FORWARDED_FOR'] )&&!empty( trim( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ){
$REMOTE_ADDR = $_SERVER['HTTP_X_FORWARDED_FOR'];
$tmp_ip=explode(',',$REMOTE_ADDR);
$ip =(htmlentities($tmp_ip[0],ENT_QUOTES,"UTF-8"));
} else if(isset($_SERVER['HTTP_X_REAL_IP'])&& !empty( trim( $_SERVER['HTTP_X_REAL_IP'] ) ) ){
$REMOTE_ADDR = $_SERVER['HTTP_X_REAL_IP'];
$tmp_ip=explode(',',$REMOTE_ADDR);
$ip =(htmlentities($tmp_ip[0],ENT_QUOTES,"UTF-8"));
}
$sql="INSERT INTO `loginlog`(user_id,password,ip,time) VALUES(?,?,?,NOW())";
pdo_query($sql,$user_id,"c".$cid,$ip);
$first_login_contest=time();
}else{
$first_login_contest=strtotime($first_login_contest[0][0]);
}
$unixnow=time();
echo "<!-- $unixnow - $first_login_contest = ".($unixnow-$first_login_contest)." -->";
if($unixnow-$first_login_contest>=$contest_limit_minutes*60 && !isset($_SESSION[$OJ_NAME."_m".$cid]) && !isset($_SESSION[$OJ_NAME."_administrator"])){
$contest_ok=false;
$view_errors = "<center>";
$view_errors .= "<h3>$MSG_CONTEST_ID : $view_cid - $view_title</h3>";
$view_errors .= "<p>$view_description</p>";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}else{
$time_left=$contest_limit_minutes*60-($unixnow-$first_login_contest);
if($time_left>0)
$view_description.="<br><span id='time_left'>$MSG_LeftTime :". intval($time_left/60)." $MSG_MINUTES" .($time_left % 60). $MSG_SECONDS."<span>";
}
};
if (!$contest_ok) {
$view_errors = "<center>";
$view_errors .= "<h3>$MSG_CONTEST_ID : $view_cid - $view_title</h3>";
$view_errors .= "<p>$view_description</p>";
$view_errors .= "<span class=text-danger>$MSG_PRIVATE_WARNING</span>";
$view_errors .= "<br><br>";
$view_errors .= "<div class='btn-group'>";
$view_errors .= "<a href=contestrank.php?cid=$view_cid class='btn btn-primary'>$MSG_STANDING</a>";
$view_errors .= "<a href=contestrank-oi.php?cid=$view_cid class='btn btn-primary'>OI$MSG_STANDING</a>";
$view_errors .= "<a href=conteststatistics.php?cid=$view_cid class='btn btn-primary'>$MSG_STATISTICS</a>";
$view_errors .= "</div>";
$view_errors .= "<br><br>";
$view_errors .= "<table align=center width=80%>";
$view_errors .= "<tr align='center'>";
$view_errors .= "<td>";
$view_errors .= "<form class=form-inline method=post action=contest.php?cid=$cid>";
$view_errors .= "<input class=input-mini type=password name=password value='' placeholder=$MSG_CONTEST-$MSG_PASSWORD>";
$view_errors .= "<button class='form-control'>$MSG_SUBMIT</button>";
$view_errors .= "</form>";
$view_errors .= "</td>";
$view_errors .= "</tr>";
$view_errors .= "</table>";
$view_errors .= "<br>";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}