@'.$user['username'].''; } } }, $str); $referrers_list = array(); foreach ($referrers as $referrer => $val) { $referrers_list[] = $referrer; } return array($res, $referrers_list); } function uojFilePreview($file_name, $output_limit, $file_type = 'text') { switch ($file_type) { case 'text': return strOmit(file_get_contents($file_name, false, null, 0, $output_limit + 4), $output_limit); default: return strOmit(shell_exec('xxd -g 4 -l 5000 ' . escapeshellarg($file_name) . ' | head -c ' . ($output_limit + 4)), $output_limit); } } function uojIncludeView($name, $view_params = array()) { global $REQUIRE_LIB; extract($view_params); include $_SERVER['DOCUMENT_ROOT'].'/app/views/'.$name.'.php'; } function redirectTo($url) { header('Location: '.$url); die(); } function permanentlyRedirectTo($url) { header("HTTP/1.1 301 Moved Permanently"); header('Location: '.$url); die(); } function redirectToLogin() { if (UOJContext::isAjax()) { die('please login'); } else { header('Location: '.HTML::url('/login')); die(); } } function becomeMsgPage($msg, $title = '消息') { global $REQUIRE_LIB; if (UOJContext::isAjax()) { die($msg); } else { if (!isset($_COOKIE['bootstrap4'])) { $REQUIRE_LIB['bootstrap5'] = ''; } echoUOJPageHeader($title); echo $msg; echoUOJPageFooter(); die(); } } function become404Page($message = '未找到页面。') { header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found", true, 404); becomeMsgPage('
404

' . $message . '

', '404'); } function become403Page($message = '访问被拒绝,您可能需要适当的权限以访问此页面。') { header($_SERVER['SERVER_PROTOCOL'] . " 403 Forbidden", true, 403); becomeMsgPage('
403

' . $message . '

', '403'); } function getUserLink($username) { if (validateUsername($username) && ($user = queryUser($username)) && $user['usergroup'] != 'B') { $realname = $user['realname']; if ($realname == "") { return ''.$username.''; } else { return ''.$username.''; } } else { $esc_username = HTML::escape($username); return ''.$esc_username.''; } } function getUserName($username, $realname = null) { if ($realname == null) { if (validateUsername($username) && ($user = queryUser($username))) { $realname = $user['realname']; } } if ($realname == "") { return "$username"; } else { return "$username ($realname)"; } } function getProblemLink($problem, $problem_title = '!title_only') { global $REQUIRE_LIB; if ($problem_title == '!title_only') { $problem_title = $problem['title']; } elseif ($problem_title == '!id_and_title') { $problem_title = "#${problem['id']}. ${problem['title']}"; } $result = ''.$problem_title.''; return $result; } function getContestProblemLink($problem, $contest_id, $problem_title = '!title_only') { global $REQUIRE_LIB; if ($problem_title == '!title_only') { $problem_title = $problem['title']; } elseif ($problem_title == '!id_and_title') { $problem_title = "#{$problem['id']}. {$problem['title']}"; } $result = ''.$problem_title.''; return $result; } function getBlogLink($id) { global $REQUIRE_LIB; $result = ''; if (validateUInt($id) && $blog = queryBlog($id)) { $result = ''.$blog['title'].''; } return $result; } function getClickZanBlock($type, $id, $cnt, $val = null, $show_text = true) { if ($val == null) { $val = queryZanVal($id, $type, Auth::user()); } return '
'; } function getLongTablePageRawUri($page) { $path = strtok(UOJContext::requestURI(), '?'); $query_string = strtok('?'); parse_str($query_string, $param); $param['page'] = $page; if ($page == 1) { unset($param['page']); } if ($param) { return $path . '?' . http_build_query($param); } else { return $path; } } function getLongTablePageUri($page) { return HTML::escape(getLongTablePageRawUri($page)); } function echoLongTable($col_names, $table_name, $cond, $tail, $header_row, $print_row, $config) { global $REQUIRE_LIB; $pag_config = $config; $pag_config['col_names'] = $col_names; $pag_config['table_name'] = $table_name; $pag_config['cond'] = $cond; $pag_config['tail'] = $tail; $pag = new Paginator($pag_config); $div_classes = isset($config['div_classes']) ? $config['div_classes'] : array('table-responsive'); $table_classes = isset($config['table_classes']) ? $config['table_classes'] : (isset($REQUIRE_LIB['bootstrap5']) ? array('table', 'table-bordered', 'table-striped', 'text-center') : array('table', 'table-bordered', 'table-hover', 'table-striped', 'table-text-center')); if (isset($config['head_pagination']) && $config['head_pagination']) { echo $pag->pagination(); } echo '
'; echo ''; echo ''; echo $header_row; echo ''; echo ''; foreach ($pag->get() as $idx => $row) { if (isset($config['get_row_index'])) { $print_row($row, $idx); } else { $print_row($row); } } if ($pag->isEmpty()) { echo ''; } echo ''; echo '
'.UOJLocale::get('none').'
'; echo '
'; if (isset($config['print_after_table'])) { $fun = $config['print_after_table']; $fun(); } echo $pag->pagination(); } function getSubmissionStatusDetails($submission) { $html = ''; $out_status = explode(', ', $submission['status'])[0]; $fly = '小熊像超人一样飞'; $think = '小熊像在思考'; if ($out_status == 'Judged') { $status_text = 'Judged!'; $status_img = $fly; } else { if ($submission['status_details'] !== '') { $status_img = $fly; $status_text = HTML::escape($submission['status_details']); } else { $status_img = $think; $status_text = $out_status; } } $html .= '
' . $status_img . '
'; $html .= '
' . $status_text . '
'; $html .= ''; return $html; } function echoSubmission($submission, $config, $user) { global $REQUIRE_LIB; $problem = queryProblemBrief($submission['problem_id']); $submitterLink = getUserLink($submission['submitter']); if ($submission['score'] == null) { $used_time_str = "/"; $used_memory_str = "/"; } else { $used_time_str = $submission['used_time'] . 'ms'; $used_memory_str = $submission['used_memory'] . 'kb'; } $status = explode(', ', $submission['status'])[0]; $show_status_details = Auth::check() && $submission['submitter'] === Auth::id() && $status !== 'Judged'; if (!$show_status_details) { echo ''; } else { echo ''; } if (!isset($config['id_hidden'])) { echo '#', $submission['id'], ''; } if (!isset($config['problem_hidden'])) { if ($submission['contest_id']) { echo '', getContestProblemLink($problem, $submission['contest_id'], '!id_and_title'), ''; } else { echo '', getProblemLink($problem, '!id_and_title'), ''; } } if (!isset($config['submitter_hidden'])) { echo '', $submitterLink, ''; } if (!isset($config['result_hidden'])) { echo ''; if ($status == 'Judged') { if ($submission['score'] == null) { echo '', $submission['result_error'], ''; } else { echo '', $submission['score'], ''; } } else { echo '', $status, ''; } echo ''; } if (!isset($config['used_time_hidden'])) { echo '', $used_time_str, ''; } if (!isset($config['used_memory_hidden'])) { echo '', $used_memory_str, ''; } echo '', '', $submission['language'], '', ''; if ($submission['tot_size'] < 1024) { $size_str = $submission['tot_size'] . 'b'; } else { $size_str = sprintf("%.1f", $submission['tot_size'] / 1024) . 'kb'; } echo '', $size_str, ''; if (!isset($config['submit_time_hidden'])) { echo '', $submission['submit_time'], ''; } if (!isset($config['judge_time_hidden'])) { echo '', $submission['judge_time'], ''; } echo ''; if ($show_status_details) { echo ''; echo getSubmissionStatusDetails($submission); echo ''; echo ''; } } function echoSubmissionsListOnlyOne($submission, $config, $user) { global $REQUIRE_LIB; if (isset($REQUIRE_LIB['bootstrap5'])) { echo '
'; echo ''; } else { echo '
'; echo '
'; } echo ''; echo ''; if (!isset($config['id_hidden'])) { echo ''; } if (!isset($config['problem_hidden'])) { echo ''; } if (!isset($config['submitter_hidden'])) { echo ''; } if (!isset($config['result_hidden'])) { echo ''; } if (!isset($config['used_time_hidden'])) { echo ''; } if (!isset($config['used_memory_hidden'])) { echo ''; } echo ''; echo ''; if (!isset($config['submit_time_hidden'])) { echo ''; } if (!isset($config['judge_time_hidden'])) { echo ''; } echo ''; echo ''; echo ''; echoSubmission($submission, $config, $user); echo ''; echo '
ID'.UOJLocale::get('problems::problem').''.UOJLocale::get('problems::submitter').''.UOJLocale::get('problems::result').''.UOJLocale::get('problems::used time').''.UOJLocale::get('problems::used memory').''.UOJLocale::get('problems::language').''.UOJLocale::get('problems::file size').''.UOJLocale::get('problems::submit time').''.UOJLocale::get('problems::judge time').'
'; echo '
'; } function echoSubmissionsList($cond, $tail, $config, $user) { global $REQUIRE_LIB; $header_row = ''; $col_names = array(); $col_names[] = 'submissions.status_details'; $col_names[] = 'submissions.status'; $col_names[] = 'submissions.result_error'; $col_names[] = 'submissions.score'; if (!isset($config['id_hidden'])) { $header_row .= 'ID'; $col_names[] = 'submissions.id'; } if (!isset($config['problem_hidden'])) { $header_row .= ''.UOJLocale::get('problems::problem').''; $col_names[] = 'submissions.problem_id'; $col_names[] = 'submissions.contest_id'; } if (!isset($config['submitter_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submitter').''; $col_names[] = 'submissions.submitter'; } if (!isset($config['result_hidden'])) { $header_row .= ''.UOJLocale::get('problems::result').''; } if (!isset($config['used_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::used time').''; $col_names[] = 'submissions.used_time'; } if (!isset($config['used_memory_hidden'])) { $header_row .= ''.UOJLocale::get('problems::used memory').''; $col_names[] = 'submissions.used_memory'; } $header_row .= ''.UOJLocale::get('problems::language').''; $col_names[] = 'submissions.language'; $header_row .= ''.UOJLocale::get('problems::file size').''; $col_names[] = 'submissions.tot_size'; if (!isset($config['submit_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submit time').''; $col_names[] = 'submissions.submit_time'; } if (!isset($config['judge_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::judge time').''; $col_names[] = 'submissions.judge_time'; } $header_row .= ''; $table_name = isset($config['table_name']) ? $config['table_name'] : 'submissions'; if (!isProblemManager($user)) { if ($user != null) { $permission_cond = "submissions.is_hidden = false or submissions.submitter = '{$user['username']}' or (submissions.is_hidden = true and (submissions.problem_id in (select problem_id from problems_permissions where username = '{$user['username']}') or submissions.problem_id in (select id from problems where uploader = '{$user['username']}')))"; } else { $permission_cond = "submissions.is_hidden = false"; } if ($cond !== '1') { $cond = "($cond) and ($permission_cond)"; } else { $cond = $permission_cond; } } $table_config = isset($config['table_config']) ? $config['table_config'] : null; echoLongTable($col_names, $table_name, $cond, $tail, $header_row, function($submission) use ($config, $user) { echoSubmission($submission, $config, $user); }, $table_config); } function echoSubmissionContent($submission, $requirement) { global $REQUIRE_LIB; $zip_file = new ZipArchive(); $submission_content = json_decode($submission['content'], true); $zip_file->open(UOJContext::storagePath().$submission_content['file_name']); $config = array(); foreach ($submission_content['config'] as $config_key => $config_val) { $config[$config_val[0]] = $config_val[1]; } foreach ($requirement as $req) { if ($req['type'] == "source code") { $file_content = $zip_file->getFromName("{$req['name']}.code"); $file_content = uojTextEncode($file_content, array('allow_CR' => true, 'html_escape' => true)); $file_language = htmlspecialchars($config["{$req['name']}_language"]); $footer_text = UOJLocale::get('problems::source code').', '.UOJLocale::get('problems::language').': '.$file_language; switch ($file_language) { case 'C++': case 'C++11': case 'C++17': case 'C++20': case 'C++98': case 'C++03': $sh_class = 'sh_cpp language-cpp'; break; case 'Python2': case 'Python2.7': case 'Python3': $sh_class = 'sh_python language-python'; break; case 'Java8': case 'Java11': case 'Java17': $sh_class = 'sh_java language-java'; break; case 'C': $sh_class = 'sh_c language-c'; break; case 'Pascal': $sh_class = 'sh_pascal language-pascal'; break; default: $sh_class = ''; break; } echo '
'; echo '
'; echo '

'.$req['name'].'

'; echo '
'; echo '
'; echo '
'.$file_content."\n".'
'; echo '
'; echo ''; echo '
'; } elseif ($req['type'] == "text") { $file_content = $zip_file->getFromName("{$req['file_name']}", 504); $file_content = strOmit($file_content, 500); $file_content = uojTextEncode($file_content, array('allow_CR' => true, 'html_escape' => true)); $footer_text = UOJLocale::get('problems::text file'); echo '
'; echo '
'; echo '

'.$req['file_name'].'

'; echo '
'; echo '
'; echo '
\n".$file_content."\n".'
'; echo '
'; echo ''; echo '
'; } } $zip_file->close(); } class JudgementDetailsPrinter { private $name; private $styler; private $dom; private $subtask_num; private function _print_c($node) { foreach ($node->childNodes as $child) { if ($child->nodeName == '#text') { echo htmlspecialchars($child->nodeValue); } else { $this->_print($child); } } } private function _print($node) { global $REQUIRE_LIB; if ($node->nodeName == 'error') { echo '
\n";
			$this->_print_c($node);
			echo "\n
"; } elseif ($node->nodeName == 'tests') { echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { $this->_print_c($node); } if ($this->styler->show_small_tip) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo '
'; } else { echo '
'; } echo '小提示:点击横条可展开更详细的信息', '
'; } elseif ($this->styler->ioi_contest_is_running) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo '
'; } else { echo '
'; } echo 'IOI赛制比赛中不支持显示详细信息', '
'; } if (!isset($REQUIRE_LIB['bootstrap5'])) { $this->_print_c($node); } echo '
'; } elseif ($node->nodeName == 'subtask') { $subtask_num = $node->getAttribute('num'); $subtask_score = $node->getAttribute('score'); $subtask_info = $node->getAttribute('info'); echo '
'; $accordion_parent = "{$this->name}_details_accordion"; $accordion_collapse = "{$accordion_parent}_collapse_subtask_{$subtask_num}"; $accordion_collapse_accordion = "{$accordion_collapse}_accordion"; echo '
'; echo '
'; echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo '

'; } else { echo '

'; } echo 'Subtask #', $subtask_num, ': ', '

'; echo '
'; if ($this->styler->show_score) { echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' '; } else { echo 'score: '; } echo $subtask_score; if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' pts'; } echo '
'; echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo $this->styler->getTestInfoIcon($subtask_info); } echo htmlspecialchars($subtask_info); echo '
'; } else { echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo $this->styler->getTestInfoIcon($subtask_info); } echo htmlspecialchars($subtask_info); echo '
'; } echo '
'; echo '
'; echo '
'; echo '
'; echo '
'; $this->subtask_num = $subtask_num; $this->_print_c($node); $this->subtask_num = null; echo '
'; echo '
'; echo '
'; echo '
'; } elseif ($node->nodeName == 'test') { $test_info = $node->getAttribute('info'); $test_num = $node->getAttribute('num'); $test_score = $node->getAttribute('score'); $test_time = $node->getAttribute('time'); $test_memory = $node->getAttribute('memory'); echo '
'; $accordion_parent = "{$this->name}_details_accordion"; if ($this->subtask_num != null) { $accordion_parent .= "_collapse_subtask_{$this->subtask_num}_accordion"; } $accordion_collapse = "{$accordion_parent}_collapse_test_{$test_num}"; echo '
styler->shouldFadeDetails($test_info)) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' data-bs-toggle="collapse" data-bs-parent="#', $accordion_parent, '" data-bs-target="#', $accordion_collapse, '" '; } else { echo ' data-toggle="collapse" data-parent="#', $accordion_parent, '" data-target="#', $accordion_collapse, '" '; } } echo '>'; echo '
'; echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo '

'; } else { echo '

'; } if ($test_num > 0) { echo 'Test #', $test_num, ': '; } else { echo 'Extra Test:'; } echo '

'; echo '
'; if ($this->styler->show_score) { echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' '; } else { echo 'score: '; } echo $test_score; if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' pts'; } echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo '
'; echo $this->styler->getTestInfoIcon($test_info); } else { echo '
'; } echo htmlspecialchars($test_info); echo '
'; } else { if (isset($REQUIRE_LIB['bootstrap5'])) { echo '
'; echo $this->styler->getTestInfoIcon($test_info); } else { echo '
'; } echo htmlspecialchars($test_info); echo '
'; } echo '
'; if ($test_time >= 0) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' '; } else { echo 'time: '; } echo $test_time, ' ms'; } echo '
'; echo '
'; if ($test_memory >= 0) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' '; } else { echo 'memory: '; } echo $test_memory, ' kB'; } echo '
'; echo '
'; echo '
'; if (!$this->styler->shouldFadeDetails($test_info)) { $accordion_collapse_class = 'card-collapse collapse'; if ($this->styler->collapse_in) { $accordion_collapse_class .= ' in'; } echo '
'; echo '
'; $this->_print_c($node); echo '
'; echo '
'; } echo '
'; } elseif ($node->nodeName == 'custom-test') { $test_info = $node->getAttribute('info'); $test_time = $node->getAttribute('time'); $test_memory = $node->getAttribute('memory'); echo '
'; $accordion_parent = "{$this->name}_details_accordion"; $accordion_collapse = "{$accordion_parent}_collapse_custom_test"; echo '
styler->shouldFadeDetails($test_info)) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' data-bs-toggle="collapse" data-bs-parent="#', $accordion_parent, '" data-bs-target="#', $accordion_collapse, '" '; } else { echo ' data-toggle="collapse" data-parent="#', $accordion_parent, '" data-target="#', $accordion_collapse, '" '; } } echo '>'; echo '
'; echo '
'; echo '

', 'Custom Test: ', '

'; echo '
'; if (isset($REQUIRE_LIB['bootstrap5'])) { echo '
'; echo $this->styler->getTestInfoIcon($test_info); } else { echo '
'; } echo htmlspecialchars($test_info); echo '
'; echo '
'; if ($test_time >= 0) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' '; } else { echo 'time: '; } echo $test_time, ' ms'; } echo '
'; echo '
'; if ($test_memory >= 0) { if (isset($REQUIRE_LIB['bootstrap5'])) { echo ' '; } else { echo 'memory: '; } echo $test_memory, ' kB'; } echo '
'; echo '
'; echo '
'; if (!$this->styler->shouldFadeDetails($test_info)) { $accordion_collapse_class = 'card-collapse collapse'; if ($this->styler->collapse_in) { $accordion_collapse_class .= ' in'; } echo '
'; echo '
'; $this->_print_c($node); echo '
'; echo '
'; echo '
'; } } elseif ($node->nodeName == 'in') { if (isset($REQUIRE_LIB['bootstrap5'])) { echo '

input:

'; } else { echo '

input:

'; } echo "
\n";
			$this->_print_c($node);
			echo "\n
"; } elseif ($node->nodeName == 'out') { if (isset($REQUIRE_LIB['bootstrap5'])) { echo '

output:

'; } else { echo '

output:

'; } echo "
\n";
			$this->_print_c($node);
			echo "\n
"; } elseif ($node->nodeName == 'res') { if (isset($REQUIRE_LIB['bootstrap5'])) { echo '

result:

'; } else { echo '

result:

'; } echo "
\n";
			$this->_print_c($node);
			echo "\n
"; } else { echo '<', $node->nodeName; foreach ($node->attributes as $attr) { echo ' ', $attr->name, '="', htmlspecialchars($attr->value), '"'; } echo '>'; $this->_print_c($node); echo 'nodeName, '>'; } } public function __construct($details, $styler, $name) { global $REQUIRE_LIB; $this->name = $name; $this->styler = $styler; $this->details = $details; $this->dom = new DOMDocument(); if (!$this->dom->loadXML($this->details)) { throw new Exception("XML syntax error"); } $this->details = ''; } public function printHTML() { global $REQUIRE_LIB; $this->subtask_num = null; $this->_print($this->dom->documentElement); } } function echoJudgementDetails($raw_details, $styler, $name) { global $REQUIRE_LIB; try { $printer = new JudgementDetailsPrinter($raw_details, $styler, $name); $printer->printHTML(); } catch (Exception $e) { echo 'Failed to show details'; } } class SubmissionDetailsStyler { public $show_score = true; public $show_small_tip = true; public $collapse_in = false; public $fade_all_details = false; public function getTestInfoClass($info) { if ($info == 'Accepted' || $info == 'Extra Test Passed') { return 'card-uoj-accepted'; } elseif ($info == 'Time Limit Exceeded') { return 'card-uoj-tle'; } elseif ($info == 'Acceptable Answer') { return 'card-uoj-acceptable-answer'; } else { return 'card-uoj-wrong'; } } public function getTestInfoIcon($test_info) { if ($test_info == 'Accepted' || $test_info == 'Extra Test Passed') { return ' '; } elseif ($test_info == 'Time Limit Exceeded') { return ' '; } elseif ($test_info == 'Acceptable Answer') { return ' '; } elseif ($test_info == 'Wrong Answer') { return ' '; } else { return ' '; } } public function shouldFadeDetails($info) { return $this->fade_all_details || $info == 'Extra Test Passed'; } } class CustomTestSubmissionDetailsStyler { public $show_score = true; public $show_small_tip = false; public $collapse_in = true; public $fade_all_details = false; public $ioi_contest_is_running = false; public function getTestInfoClass($info) { if ($info == 'Success') { return 'card-uoj-accepted'; } elseif ($info == 'Time Limit Exceeded') { return 'card-uoj-tle'; } elseif ($info == 'Acceptable Answer') { return 'card-uoj-acceptable-answer'; } else { return 'card-uoj-wrong'; } } public function getTestInfoIcon($test_info) { if ($test_info == 'Success') { return ' '; } elseif ($test_info == 'Time Limit Exceeded') { return ' '; } elseif ($test_info == 'Acceptable Answer') { return ' '; } elseif ($test_info == 'Wrong Answer') { return ' '; } else { return ' '; } } public function shouldFadeDetails($info) { return $this->fade_all_details; } } class HackDetailsStyler { public $show_score = false; public $show_small_tip = false; public $collapse_in = true; public $fade_all_details = false; public function getTestInfoClass($info) { if ($info == 'Accepted' || $info == 'Extra Test Passed') { return 'card-uoj-accepted'; } elseif ($info == 'Time Limit Exceeded') { return 'card-uoj-tle'; } elseif ($info == 'Acceptable Answer') { return 'card-uoj-acceptable-answer'; } else { return 'card-uoj-wrong'; } } public function getTestInfoIcon($test_info) { if ($test_info == 'Accepted' || $test_info == 'Extra Test Passed') { return ' '; } elseif ($test_info == 'Time Limit Exceeded') { return ' '; } elseif ($test_info == 'Acceptable Answer') { return ' '; } elseif ($test_info == 'Wrong Answer') { return ' '; } else { return ' '; } } public function shouldFadeDetails($info) { return $this->fade_all_details; } } function echoSubmissionDetails($submission_details, $name) { global $REQUIRE_LIB; echoJudgementDetails($submission_details, new SubmissionDetailsStyler(), $name); } function echoCustomTestSubmissionDetails($submission_details, $name) { echoJudgementDetails($submission_details, new CustomTestSubmissionDetailsStyler(), $name); } function echoHackDetails($hack_details, $name) { global $REQUIRE_LIB; echoJudgementDetails($hack_details, new HackDetailsStyler(), $name); } function echoHack($hack, $config, $user) { global $REQUIRE_LIB; $problem = queryProblemBrief($hack['problem_id']); echo ''; if (!isset($config['id_hidden'])) { echo '#', $hack['id'], ''; } if (!isset($config['submission_hidden'])) { echo '#', $hack['submission_id'], ''; } if (!isset($config['problem_hidden'])) { if ($hack['contest_id']) { echo '', getContestProblemLink($problem, $hack['contest_id'], '!id_and_title'), ''; } else { echo '', getProblemLink($problem, '!id_and_title'), ''; } } if (!isset($config['hacker_hidden'])) { echo '', getUserLink($hack['hacker']), ''; } if (!isset($config['owner_hidden'])) { echo '', getUserLink($hack['owner']), ''; } if (!isset($config['result_hidden'])) { if ($hack['judge_time'] == null) { echo 'Waiting'; } elseif ($hack['success'] == null) { echo 'Judging'; } elseif ($hack['success']) { echo 'Success!'; } else { echo 'Failed.'; } } else { echo 'Hidden'; } if (!isset($config['submit_time_hidden'])) { echo '', $hack['submit_time'], ''; } if (!isset($config['judge_time_hidden'])) { echo '', $hack['judge_time'], ''; } echo ''; } function echoHackListOnlyOne($hack, $config, $user) { global $REQUIRE_LIB; if (isset($REQUIRE_LIB['bootstrap5'])) { echo '
'; echo ''; } else { echo '
'; echo '
'; } echo ''; echo ''; if (!isset($config['id_hidden'])) { echo ''; } if (!isset($config['submission_id_hidden'])) { echo ''; } if (!isset($config['problem_hidden'])) { echo ''; } if (!isset($config['hacker_hidden'])) { echo ''; } if (!isset($config['owner_hidden'])) { echo ''; } if (!isset($config['result_hidden'])) { echo ''; } if (!isset($config['submit_time_hidden'])) { echo ''; } if (!isset($config['judge_time_hidden'])) { echo ''; } echo ''; echo ''; echo ''; echoHack($hack, $config, $user); echo ''; echo '
ID'.UOJLocale::get('problems::submission id').''.UOJLocale::get('problems::problem').''.UOJLocale::get('problems::hacker').''.UOJLocale::get('problems::owner').''.UOJLocale::get('problems::result').''.UOJLocale::get('problems::submit time').''.UOJLocale::get('problems::judge time').'
'; echo '
'; } function echoHacksList($cond, $tail, $config, $user) { $header_row = ''; $col_names = array(); $col_names[] = 'id'; $col_names[] = 'success'; $col_names[] = 'judge_time'; if (!isset($config['id_hidden'])) { $header_row .= 'ID'; } if (!isset($config['submission_id_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submission id').''; $col_names[] = 'submission_id'; } if (!isset($config['problem_hidden'])) { $header_row .= ''.UOJLocale::get('problems::problem').''; $col_names[] = 'problem_id'; } if (!isset($config['hacker_hidden'])) { $header_row .= ''.UOJLocale::get('problems::hacker').''; $col_names[] = 'hacker'; } if (!isset($config['owner_hidden'])) { $header_row .= ''.UOJLocale::get('problems::owner').''; $col_names[] = 'owner'; } if (!isset($config['result_hidden'])) { $header_row .= ''.UOJLocale::get('problems::result').''; } if (!isset($config['submit_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::submit time').''; $col_names[] = 'submit_time'; } if (!isset($config['judge_time_hidden'])) { $header_row .= ''.UOJLocale::get('problems::judge time').''; } $header_row .= ''; if (!isSuperUser($user)) { if ($user != null) { $permission_cond = "is_hidden = false or (is_hidden = true and problem_id in (select problem_id from problems_permissions where username = '{$user['username']}'))"; } else { $permission_cond = "is_hidden = false"; } if ($cond !== '1') { $cond = "($cond) and ($permission_cond)"; } else { $cond = $permission_cond; } } $table_config = isset($config['table_config']) ? $config['table_config'] : null; echoLongTable($col_names, 'hacks', $cond, $tail, $header_row, function($hacks) use ($config, $user) { echoHack($hacks, $config, $user); }, $table_config); } function echoBlog($blog, $config = array()) { global $REQUIRE_LIB; $default_config = array( 'blog' => $blog, 'show_title_only' => false, 'is_preview' => false ); foreach ($default_config as $key => $val) { if (!isset($config[$key])) { $config[$key] = $val; } } $config['REQUIRE_LIB'] = $REQUIRE_LIB; uojIncludeView('blog-preview', $config); } function echoBlogTag($tag) { global $REQUIRE_LIB; if (isset($REQUIRE_LIB['bootstrap5'])) { echo ''; echo ''; } else { echo ''; echo ''; } echo HTML::escape($tag), ''; } function echoUOJPageHeader($page_title, $extra_config = array()) { global $REQUIRE_LIB; $config = UOJContext::pageConfig(); $config['REQUIRE_LIB'] = $REQUIRE_LIB; $config['PageTitle'] = $page_title; $config = array_merge($config, $extra_config); uojIncludeView('page-header', $config); } function echoUOJPageFooter($config = array()) { global $REQUIRE_LIB; $config['REQUIRE_LIB'] = $REQUIRE_LIB; uojIncludeView('page-footer', $config); } function echoRanklist($config = array()) { global $REQUIRE_LIB; $header_row = ''; $header_row .= ''; $header_row .= '#'; $header_row .= ''.UOJLocale::get('username').''; $header_row .= ''.UOJLocale::get('motto').''; $header_row .= ''.UOJLocale::get('solved').''; $header_row .= ''; $purifier = HTML::purifier_inline(); $users = array(); $print_row = function($user, $now_cnt) use (&$users, $config, $purifier) { if (!$users) { if ($now_cnt == 1) { $rank = 1; } else { $rank = DB::selectCount("select count(*) from (select b.username as username, count(*) as accepted from best_ac_submissions a inner join user_info b on a.submitter = b.username group by username) as derived where accepted > {$user['ac_num']}") + 1; } } else { $rank = $now_cnt; } $user['rank'] = $rank; echo ''; echo '' . $user['rank'] . ''; echo '' . getUserLink($user['username']) . ''; echo ""; echo $purifier->purify($user['motto']); echo ""; echo '' . $user['ac_num'] . ''; echo ''; $users[] = $user; }; $from = 'best_ac_submissions a inner join user_info b on a.submitter = b.username'; $col_names = array('b.username as username', 'count(*) as ac_num', 'b.motto as motto'); $cond = '1'; $tail = 'group by username order by ac_num desc, username asc'; if (isset($config['group_id'])) { $group_id = $config['group_id']; $from = "best_ac_submissions a inner join user_info b on a.submitter = b.username inner join groups_users c on (a.submitter = c.username and c.group_id = {$group_id})"; } if (isset($config['top10'])) { $tail .= ' limit 10'; } $config['get_row_index'] = ''; $config['pagination_table'] = 'user_info'; echoLongTable($col_names, $from, $cond, $tail, $header_row, $print_row, $config); }