From be2491b093b1f0ca430bede679ecbb670041e483 Mon Sep 17 00:00:00 2001 From: cassio Date: Tue, 2 Jul 2013 09:46:45 +0400 Subject: restructuring of boca's git --- src/scoretable.php | 387 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 387 insertions(+) create mode 100644 src/scoretable.php (limited to 'src/scoretable.php') diff --git a/src/scoretable.php b/src/scoretable.php new file mode 100644 index 0000000..ef11ee6 --- /dev/null +++ b/src/scoretable.php @@ -0,0 +1,387 @@ +. +//////////////////////////////////////////////////////////////////////////////// +//Last updated 02/nov/2012 by cassio@ime.usp.br +require_once("db.php"); + +if(isset($_SESSION["locr"])) + $locr=$_SESSION["locr"]; +else + $locr='.'; + +if(isset($_GET["clock"]) && $_GET["clock"]==1) { + ob_start(); + header ("Expires: " . gmdate("D, d M Y H:i:s") . " GMT"); + header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header ("Cache-Control: no-cache, must-revalidate"); + header ("Pragma: no-cache"); + header ("Content-Type: text/html; charset=utf-8"); + session_start(); + ob_end_flush(); + + if(!isset($contest) || !isset($localsite)) { + $ct=DBGetActiveContest(); + $contest=$ct['contestnumber']; + $localsite=$ct['contestlocalsite']; + } + if (($blocal = DBSiteInfo($contest, $localsite)) == null) { + echo "0"; + exit; + } + if(isset($blocal['currenttime'])) + echo $blocal["currenttime"]; + else echo "0"; + exit; +} +if(isset($_GET['remote']) && is_numeric($_GET['remote'])) { + ob_start(); + header ("Expires: " . gmdate("D, d M Y H:i:s") . " GMT"); + header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header ("Cache-Control: no-cache, must-revalidate"); + header ("Pragma: no-cache"); + header ("Content-Type: text/html; charset=utf-8"); + session_start(); + ob_end_flush(); + + if (isset($_SESSION["usertable"])) { + $_SESSION["usertable"] = DBUserInfo($_SESSION["usertable"]["contestnumber"], + $_SESSION["usertable"]["usersitenumber"], $_SESSION["usertable"]["usernumber"]); + } else { + IntrusionNotify("scoretable1"); + ForceLoad("index.php"); + } + if(!isset($_SESSION['usertable']['usertype']) || $_SESSION["usertable"]["usertype"] != "score") { + IntrusionNotify("scoretable2"); + ForceLoad("index.php"); + } +} + +if(!ValidSession()) { + InvalidSession("scoretable.php"); + ForceLoad("index.php"); +} +$loc = $_SESSION["loc"]; +if(!isset($detail)) $detail=true; +if(!isset($final)) $final=false; +$scoredelay["admin"] = 2; +$scoredelay["score"] = 30; +$scoredelay["team"] = 30; +$scoredelay["judge"] = 10; +$scoredelay["staff"] = 60; +$actualdelay = 60; +if(isset($scoredelay[$_SESSION["usertable"]["usertype"]])) $actualdelay = $scoredelay[$_SESSION["usertable"]["usertype"]]; +$ds = DIRECTORY_SEPARATOR; +if($ds=="") $ds = "/"; + +$scoretmp = $_SESSION["locr"] . $ds . "private" . $ds . "scoretmp" . $ds . $_SESSION["usertable"]["usertype"] . ".php"; +$redo = TRUE; +if(file_exists($scoretmp)) { + if(($strtmp = file_get_contents($scoretmp,FALSE,NULL,-1,100000)) !== FALSE) { + list($d) = sscanf($strtmp,"%*s %d"); + if($d > time() - $actualdelay) { + $redo = FALSE; + } + } +} + +if($_SESSION["usertable"]["usertype"]=='score' || $_SESSION["usertable"]["usertype"]=='admin' || (isset($_GET["remote"]) && is_numeric($_GET["remote"]))) { + $privatedir = $_SESSION['locr'] . $ds . "private"; + $remotedir = $_SESSION['locr'] . $ds . "private" . $ds . "remotescores"; + $destination = $remotedir . $ds ."scores.zip"; + if(is_writable($remotedir)) { + if($redo || !is_readable($destination)) { + if (($s = DBSiteInfo($_SESSION["usertable"]["contestnumber"],$_SESSION["usertable"]["usersitenumber"])) == null) + ForceLoad("index.php"); + + $level=$s["sitescorelevel"]; + $data0 = array(); + if($level>0) { + list($score,$data0) = DBScoreSite($_SESSION["usertable"]["contestnumber"], + $_SESSION["usertable"]["usersitenumber"], 0, -1); + } + $ct=DBGetActiveContest(); + $localsite=$ct['contestlocalsite']; + $fname = $privatedir . $ds . "score_localsite_" . $localsite . "_" . md5($_SERVER['HTTP_HOST']); + @file_put_contents($fname . ".tmp",base64_encode(serialize($data0))); + @rename($fname . ".tmp",$fname . ".dat"); + + $data0 = array(); + if($level>0) { + list($score,$data0) = DBScoreSite($_SESSION["usertable"]["contestnumber"], + $_SESSION["usertable"]["usersitenumber"], 1, -1); + } + $ct=DBGetActiveContest(); + $localsite=$ct['contestlocalsite']; + $fname = $remotedir . $ds . "score_site" . $localsite . "_" . $localsite . "_" . md5($_SERVER['HTTP_HOST']); + @file_put_contents($fname . ".tmp",base64_encode(serialize($data0))); + @rename($fname . ".tmp",$fname . ".dat"); + + if(@create_zip($remotedir,glob($remotedir . '/*.dat'),$fname . ".tmp") != 1) { + LOGError("Cannot create score zip file"); + if(@create_zip($remotedir,array(),$fname . ".tmp") == 1) + @rename($fname . ".tmp",$destination); + } else { + @rename($fname . ".tmp",$destination); + } + } + } +} + +if(isset($_GET["remote"])) { + if(is_numeric($_GET["remote"])) { + if($_GET["remote"]==-42) { + echo file_get_contents($destination); + } else { + if (($s = DBSiteInfo($_SESSION["usertable"]["contestnumber"],$_SESSION["usertable"]["usersitenumber"])) == null) + ForceLoad("index.php"); + + $level=$s["sitescorelevel"]; + $score = array(); + if($level>0) { + list($score,$data0) = DBScoreSite($_SESSION["usertable"]["contestnumber"], + $_SESSION["usertable"]["usersitenumber"], 1, -1, $_GET["remote"]); + } + echo base64_encode(serialize($score)); + } + } else { + echo base64_encode(serialize(array())); + } + exit; +} + +if(!$redo) { + $conf=globalconf(); + $strtmp = decryptData(substr($strtmp,strpos($strtmp,"\n")),$conf["key"],'score'); + if($strtmp=="") $redo=TRUE; +} +if($redo) { + $strtmp = "\n"; + $pr = DBGetProblems($_SESSION["usertable"]["contestnumber"]); + + $ct=DBGetActiveContest(); + $contest=$ct['contestnumber']; + $duration=$ct['contestduration']; + + if(!isset($hor)) $hor = -1; + if($hor>$duration) $hor=$duration; + + $level=$s["sitescorelevel"]; + if($level<=0) $level=-$level; + else { + $des=true; + } + + if (($s = DBSiteInfo($_SESSION["usertable"]["contestnumber"],$_SESSION["usertable"]["usersitenumber"])) == null) + ForceLoad("index.php"); + $score = DBScore($_SESSION["usertable"]["contestnumber"], $ver, $hor*60, $s["siteglobalscore"]); + + if ($_SESSION["usertable"]["usertype"]!="score" && $_SESSION["usertable"]["usertype"]!="admin" && $level>3) $level=3; + + $minu = 3; + $rn = DBRecentNews($_SESSION["usertable"]["contestnumber"], + $_SESSION["usertable"]["usersitenumber"], $ver, $minu); + if(count($rn)>0 && $level>3) { + $strtmp .= ""; + $strtmp .= "\n"; + for($i=0; $i"; + } + else + $strtmp .= "\"\"\n"; + $strtmp .= $rn[$i]["problemname"] . ": " . $rn[$i]["userfullname"] . " (" . ((int) ($rn[$i]["time"]/60)) . "')"; + $strtmp .= "\n"; + } + $strtmp .= "
News (last ${minu}'):  
"; + } + if($hor>=0) { + $strtmp .= "
As of $hor minutes. Next: "; + for($h=-30; $h<40; $h+=10) { + if($hor+$h>=0 && $h!=0) { + $strtmp .= ""; + if($h>0) $strtmp .= "+"; + $strtmp .= "$h "; + } + } + $strtmp .= "

"; + } + if(is_readable($_SESSION["locr"] . $ds . 'private' . $ds . 'score.sep')) { + $rf=file($_SESSION["locr"] . $ds . 'private' . $ds . 'score.sep'); + $strtmp .= "
\"\" Available scores: \n"; + for($rfi=1;$rfi<=count($rf);$rfi++) { + $lin = explode('#',trim($rf[$rfi-1])); + if(isset($lin[1]) && $_SESSION["usertable"]["usertype"]!='admin') { + $arr=explode(' ',trim($lin[1])); + for($arri=0;$arri=count($arr)) continue; + } + $lin = trim($lin[0]); + if($lin=='') continue; + $grname=explode(' ',$lin); + $class=1; + reset($score); + while(list($e,$c) = each($score)) { + if(!isset($score[$e]['classingroup'])) $score[$e]['classingroup']=array(); + for($k=1;$k= 1) { + $u1 = explode('/',$grname[$k]); + if(isset($u1[1]) && $score[$e]['user'] >= $u1[0] && $score[$e]['user'] <= $u1[1]) { + if(!isset($u1[2]) || $u1[2]==$score[$e]['site']) { + $score[$e]['classingroup'][$rfi]=$class; + $class++; + } + } + } + + } + } + if($class>1) + $strtmp .= "" . $grname[0] . " "; + } + $strtmp .= "
\n"; + } else { + reset($score); + $class = 1; + while(list($e,$c) = each($score)) { + $score[$e]['classingroup'][1]=$class; + $class++; + } + } + + $strtmp .= "
\n\n \n \n \n \n"; + if(!$des) { + if($level>0) + $strtmp .= ""; + } else if($detail) { + for($i=0;$i"; + } + $strtmp .= "\n"; + $strtmp .= "\n"; + $n=0; + reset($score); + while(list($e, $c) = each($score)) { + reset($score[$e]['classingroup']); + while(list($cg1,$cg2) = each($score[$e]['classingroup'])) { + $strtmp .= " "; + $strtmp .= "\n"; +/* + if($level>3 && !$final && $score[$e]["site"]==$ct['contestlocalsite'] && + ((isset($_SESSION["scorepos"][$score[$e]["username"]."-".$score[$e]["site"]]) && + $_SESSION["scorepos"][$score[$e]["username"]."-".$score[$e]["site"]] > $cg2) || + (isset($_SESSION["scoreblink"][$score[$e]["username"]."-".$score[$e]["site"]]) && + $_SESSION["scoreblink"][$score[$e]["username"]."-".$score[$e]["site"]]>time()))) { + $strtmp .= " \n"; +// if(!$detail && $score[$e]["userdesc"]!="") +// $strtmp .= "(" . $score[$e]["userdesc"] . ")"; + $strtmp .= ""; + if($level > 0) { + if(!$des) $strtmp .= ""; + } + } + if(!$des) $strtmp .= " \n"; + } + $strtmp .= " \n"; + $strtmp .= " \n"; + $n++; + } + } + $strtmp .= "
#UserNameProblemsTotal
" . $cg2 . "" . $score[$e]["username"]."/".$score[$e]["site"]; + $strtmp .= "" . $score[$e]["userfullname"]; + if(!isset($_SESSION["scoreblink"][$score[$e]["username"]."-".$score[$e]["site"]]) || + $_SESSION["scoreblink"][$score[$e]["username"]."-".$score[$e]["site"]]==0) { + $_SESSION["scoreblink"][$score[$e]["username"]."-".$score[$e]["site"]] = time()+1; + } + } + else { +*/ + $_SESSION["scoreblink"][$score[$e]["username"]."-".$score[$e]["site"]]=0; + $strtmp .= " " . $score[$e]["username"]."/".$score[$e]["site"] . " "; + $strtmp .= "" . $score[$e]["userfullname"]; +// } + $_SESSION["scorepos"][$score[$e]["username"]."-".$score[$e]["site"]] = $cg2; + +// $strtmp .= "(" . $score[$e]["site"] . ")"; +// $strtmp .= ""; + for($h=0;$h"; + } + else { + if($level>3 && isset($score[$e]["problem"][$ee]["judging"]) && $score[$e]["problem"][$ee]["judging"]) + $strtmp .= "\"\"\n"; + else + $strtmp .= " "; + } + } + if ($ver && $level<3) { + if(isset($score[$e]["problem"][$ee]["solved"]) && $score[$e]["problem"][$ee]["solved"]) { + if ($level==1) { + $strtmp .= "/". $score[$e]["problem"][$ee]["time"] . "\n"; + } + else + $strtmp .= $score[$e]["problem"][$ee]["count"] . "/" . + $score[$e]["problem"][$ee]["time"] . "\n"; + } else if($des) $strtmp .= " "; + } + else { + if (isset($score[$e]["problem"][$ee]['count']) && $score[$e]["problem"][$ee]["count"]!=0) { + $tn = $score[$e]["problem"][$ee]["count"]; + if (isset($score[$e]["problem"][$ee]["solved"]) && $score[$e]["problem"][$ee]["solved"]) $t = $score[$e]["problem"][$ee]["time"]; + else $t = "-"; + $strtmp .= "" . $tn . "/${t}" . "\n"; + } else if($des) $strtmp .= " "; + } + if($des) + $strtmp .= "" . + $score[$e]["totalcount"] . " (" . $score[$e]["totaltime"] . ")
"; + if ($n == 0) $strtmp .= "
SCOREBOARD IS EMPTY
"; + else { + if(!$des) + if($level>0) $strtmp .= "
P.S. Problem names are hidden."; + else $strtmp .= "
P.S. Problem data are hidden."; + } + + $conf=globalconf(); + $strtmp = " \n" . encryptData($strtmp,$conf["key"],false); + if(file_put_contents($scoretmp, $strtmp,LOCK_EX)===FALSE) { + if($_SESSION["usertable"]["usertype"] == 'admin') { + MSGError("Cannot write to the score cache file -- performance might be compromised"); + } + LOGError("Cannot write to the ".$_SESSION["usertable"]["usertype"]."-score cache file -- performance might be compromised"); + } + $conf=globalconf(); + $strtmp = decryptData(substr($strtmp,strpos($strtmp,"\n")),$conf["key"]); +} +echo $strtmp; +?> -- cgit v1.2.3