S2OJ/web/app/controllers/submission.php

244 lines
8.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
requireLib('bootstrap5');
requireLib('hljs');
requirePHPLib('form');
requirePHPLib('judger');
Auth::check() || redirectToLogin();
UOJSubmission::init(UOJRequest::get('id')) || UOJResponse::page404();
UOJSubmission::initProblemAndContest() || UOJResponse::page404();
UOJSubmission::cur()->userCanView(Auth::user(), ['ensure' => true]);
$perm = UOJSubmission::cur()->viewerCanSeeComponents(Auth::user());
$can_see_minor = false;
if ($perm['score']) {
$can_see_minor = UOJSubmission::cur()->userCanSeeMinorVersions(Auth::user());
UOJSubmissionHistory::init(UOJSubmission::cur(), ['minor' => $can_see_minor]) || UOJResponse::page404();
if (isset($_GET['time'])) {
$history_time = UOJRequest::get('time', 'is_short_string');
!empty($history_time) || UOJResponse::page404();
UOJSubmission::cur()->loadHistoryByTime($history_time) || UOJResponse::page404();
UOJSubmission::cur()->isMajor() || UOJResponse::page404();
} elseif (isset($_GET['tid'])) {
$can_see_minor || UOJResponse::page404();
UOJSubmission::cur()->loadHistoryByTID(UOJRequest::get('tid', 'validateUInt')) || UOJResponse::page404();
!UOJSubmission::cur()->isMajor() || UOJResponse::page404();
}
}
$submission = UOJSubmission::info();
$submission_result = UOJSubmission::cur()->getResult();
$problem = UOJProblem::info();
if ($can_see_minor) {
$minor_rejudge_form = new UOJForm('minor_rejudge');
$minor_rejudge_form->handle = function () {
UOJSubmission::rejudgeById(UOJSubmission::info('id'), [
'reason_text' => '管理员偷偷重测该提交记录',
'major' => false
]);
$tid = DB::insert_id();
redirectTo(UOJSubmission::cur()->getUriForNewTID($tid));
};
$minor_rejudge_form->config['submit_button']['class'] = 'btn btn-sm btn-primary';
$minor_rejudge_form->config['submit_button']['text'] = '偷偷重新测试';
$minor_rejudge_form->config['submit_container']['class'] = 'd-inline-block text-end';
$minor_rejudge_form->runAtServer();
}
if (UOJSubmission::cur()->isLatest()) {
if (UOJSubmission::cur()->preHackCheck()) {
$hack_form = new UOJForm('hack');
$hack_form->addTextFileInput('input', ['filename' => 'input.txt']);
$hack_form->addCheckBox('use_formatter', [
'label' => '帮我整理文末回车、行末空格、换行符',
'checked' => true,
]);
$hack_form->handle = function (&$vdata) {
global $problem, $submission;
Auth::check() || redirectToLogin();
if ($_POST["input_upload_type"] == 'file') {
$tmp_name = UOJForm::uploadedFileTmpName("input_file");
if ($tmp_name == null) {
UOJResponse::message('你在干啥……怎么什么都没交过来……?');
}
}
$fileName = FS::randomAvailableTmpFileName();
$fileFullName = UOJContext::storagePath() . $fileName;
if ($_POST["input_upload_type"] == 'editor') {
file_put_contents($fileFullName, $_POST['input_editor']);
} else {
move_uploaded_file($_FILES["input_file"]['tmp_name'], $fileFullName);
}
$input_type = isset($_POST['use_formatter']) ? "USE_FORMATTER" : "DONT_USE_FORMATTER";
DB::insert([
"insert into hacks",
"(problem_id, submission_id, hacker, owner, input, input_type, submit_time, status, details, is_hidden)",
"values", DB::tuple([
$problem['id'], $submission['id'], Auth::id(), $submission['submitter'],
$fileName, $input_type, DB::now(), 'Waiting', '', $problem['is_hidden']
])
]);
};
$hack_form->config['max_post_size'] = 25 * 1024 * 1024;
$hack_form->config['max_file_size_mb'] = 25;
$hack_form->succ_href = "/hacks";
$hack_form->runAtServer();
}
if (UOJSubmission::cur()->userCanRejudge(Auth::user())) {
$rejudge_form = new UOJForm('rejudge');
$rejudge_form->handle = function () {
UOJSubmission::rejudgeById(UOJSubmission::info('id'));
};
$rejudge_form->config['submit_button']['class'] = 'btn btn-sm btn-primary';
$rejudge_form->config['submit_button']['text'] = '重新测试';
$rejudge_form->config['submit_container']['class'] = 'text-end d-inline-block';
$rejudge_form->runAtServer();
}
if (UOJSubmission::cur()->userCanDelete(Auth::user())) {
$delete_form = new UOJForm('delete');
$delete_form->handle = function () {
UOJSubmission::cur()->delete();
};
$delete_form->config['submit_button']['class'] = 'btn btn-sm btn-danger';
$delete_form->config['submit_button']['text'] = '删除此提交记录';
$delete_form->config['submit_container']['class'] = 'text-end d-inline-block';
$delete_form->config['confirm']['smart'] = true;
$delete_form->succ_href = "/submissions";
$delete_form->runAtServer();
}
} else {
if (UOJSubmission::cur()->userCanDelete(Auth::user()) && !UOJSubmission::cur()->isMajor()) {
$delete_form = new UOJForm('delete');
$delete_form->handle = function () {
UOJSubmission::cur()->deleteThisMinorVersion();
};
$delete_form->config['submit_button']['class'] = 'btn btn-sm btn-danger';
$delete_form->config['submit_button']['text'] = '删除当前历史记录(保留其他历史记录)';
$delete_form->config['submit_container']['class'] = 'text-end d-inline-block';
$delete_form->config['confirm']['smart'] = true;
$delete_form->succ_href = UOJSubmission::cur()->getUriForLatest();
$delete_form->runAtServer();
}
}
?>
<script>
var problem_id = parseInt('<?= $submission['problem_id'] ?>');
</script>
<?php echoUOJPageHeader(UOJLocale::get('problems::submission') . ' #' . $submission['id']) ?>
<h1>
<?= UOJLocale::get('problems::submission') . ' #' . $submission['id'] ?>
</h1>
<?php UOJSubmission::cur()->echoStatusTable(['show_actual_score' => $perm['score'], 'id_hidden' => true], Auth::user()) ?>
<?php
if ($perm['score']) {
HTML::echoPanel('mb-3', '测评历史', function () {
UOJSubmissionHistory::cur()->echoTimeline();
});
}
?>
<?php
if ($perm['manager_view']) {
HTML::echoPanel('mb-3', '测评机信息(管理员可见)', function () {
if (empty(UOJSubmission::info('judger'))) {
echo '暂无';
} else {
$judger = DB::selectFirst([
"select * from judger_info",
"where", [
"judger_name" => UOJSubmission::info('judger')
]
]);
if (!$judger) {
echo '测评机信息损坏';
} else {
echo '<strong>', $judger['display_name'], ': </strong>', $judger['description'];
}
}
});
}
?>
<?php if ($perm['content'] || $perm['manager_view']) : ?>
<div class="copy-button-container">
<?php UOJSubmission::cur()->echoContent() ?>
</div>
<?php if (isset($hack_form)) : ?>
<p class="text-center">
这程序好像有点 Bug我给组数据试试 <button id="button-display-hack" type="button" class="btn btn-danger btn-xs">Hack!</button>
</p>
<div class="card mb-3" id="div-form-hack" style="display: none">
<div class="card-header">提交 Hack</div>
<div class="card-body">
<?php $hack_form->printHTML() ?>
</div>
<div class="card-footer bg-transparent small text-center text-danger">
Hack 功能是给大家互相查错用的。请勿故意提交错误代码,然后自己 Hack 自己、贼喊捉贼哦(故意贼喊捉贼会予以封禁处理)
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#button-display-hack').click(function() {
$('#div-form-hack').toggle('fast');
});
});
</script>
<?php endif ?>
<?php endif ?>
<?php
if (UOJSubmission::cur()->hasJudged()) {
if ($perm['high_level_details']) {
HTML::echoPanel(['card' => 'mb-3', 'body' => 'p-0'], UOJLocale::get('details'), function () use ($perm, $submission_result) {
$styler = new SubmissionDetailsStyler();
if (!$perm['low_level_details']) {
$styler->fade_all_details = true;
$styler->show_small_tip = false;
}
echoJudgmentDetails($submission_result['details'], $styler, 'details');
if ($perm['manager_view'] && !$perm['low_level_details']) {
echo '<hr />';
echo '<h4 class="text-info">全部详细信息(管理员可见)</h4>';
echoSubmissionDetails($submission_result['details'], 'all_details');
}
});
} else if ($perm['manager_view']) {
HTML::echoPanel(['card' => 'mb-3', 'body' => 'p-0'], '详细(管理员可见)', function () use ($submission_result) {
echoSubmissionDetails($submission_result['details'], 'details');
});
}
if ($perm['manager_view'] && isset($submission_result['final_result'])) {
HTML::echoPanel(['card' => 'mb-3', 'body' => 'p-0'], '终测结果预测(管理员可见)', function () use ($submission_result) {
echoSubmissionDetails($submission_result['final_result']['details'], 'final_details');
});
}
}
?>
<div class="d-flex gap-2 justify-content-end">
<?php if (isset($minor_rejudge_form)) : ?>
<?php $minor_rejudge_form->printHTML() ?>
<?php endif ?>
<?php if (isset($rejudge_form)) : ?>
<?php $rejudge_form->printHTML() ?>
<?php endif ?>
<?php if (isset($delete_form)) : ?>
<?php $delete_form->printHTML() ?>
<?php endif ?>
</div>
<?php echoUOJPageFooter() ?>