S2OJ/web/app/controllers/new_remote_problem.php

180 lines
5.2 KiB
PHP
Raw Normal View History

2023-01-18 08:20:12 +00:00
<?php
requirePHPLib('form');
requirePHPLib('data');
Auth::check() || redirectToLogin();
UOJProblem::userCanCreateProblem(Auth::user()) || UOJResponse::page403();
$new_remote_problem_form = new UOJForm('new_remote_problem');
$new_remote_problem_form->addSelect('remote_online_judge', [
'label' => '远程 OJ',
2023-01-20 13:23:22 +00:00
'options' => array_map(fn ($provider) => $provider['name'], UOJRemoteProblem::$providers),
2023-01-18 08:20:12 +00:00
]);
$new_remote_problem_form->addInput('remote_problem_id', [
'div_class' => 'mt-3',
'label' => '远程 OJ 上的题目 ID',
'validator_php' => function ($id, &$vdata) {
2023-01-20 13:23:22 +00:00
$remote_oj = $_POST['remote_online_judge'];
if ($remote_oj === 'codeforces') {
2023-01-18 08:20:12 +00:00
$id = trim(strtoupper($id));
if (!validateCodeforcesProblemId($id)) {
return '不合法的题目 ID';
}
$vdata['remote_problem_id'] = $id;
2023-01-20 13:23:22 +00:00
return '';
} else if ($remote_oj === 'atcoder') {
$id = trim(strtolower($id));
if (!validateAtCoderProblemId($id)) {
return '不合法的字符串';
2023-01-20 13:23:22 +00:00
}
$vdata['remote_problem_id'] = $id;
2023-01-22 09:00:12 +00:00
return '';
2023-01-24 03:51:21 +00:00
} else if ($remote_oj === 'uoj') {
if (!validateUInt($id)) {
return '不合法的题目 ID';
}
$vdata['remote_problem_id'] = $id;
return '';
} else if ($remote_oj === 'loj') {
2023-01-22 09:00:12 +00:00
if (!validateUInt($id)) {
return '不合法的题目 ID';
}
$vdata['remote_problem_id'] = $id;
2023-02-02 13:53:36 +00:00
return '';
} else if ($remote_oj === 'luogu') {
$id = trim(strtoupper($id));
if (!validateLuoguProblemId($id)) {
return '不合法的题目 ID';
}
$vdata['remote_problem_id'] = $id;
2023-03-17 13:55:35 +00:00
return '';
} else if ($remote_oj === 'qoj') {
if (!validateUInt($id)) {
return '不合法的题目 ID';
}
$vdata['remote_problem_id'] = $id;
2023-01-18 08:20:12 +00:00
return '';
}
return '不合法的远程 OJ 类型';
},
]);
$new_remote_problem_form->handle = function (&$vdata) {
$remote_online_judge = $_POST['remote_online_judge'];
$remote_problem_id = $vdata['remote_problem_id'];
$remote_provider = UOJRemoteProblem::$providers[$remote_online_judge];
try {
$data = UOJRemoteProblem::getProblemBasicInfo($remote_online_judge, $remote_problem_id);
} catch (Exception $e) {
$data = null;
UOJLog::error($e->getMessage());
}
if ($data === null) {
UOJResponse::page500('题目抓取失败,可能是题目不存在或者没有题面!如果题目没有问题,请稍后再试。<a href="">返回</a>');
}
$submission_requirement = UOJRemoteProblem::getSubmissionRequirements($remote_online_judge);
2023-01-18 08:20:12 +00:00
$enc_submission_requirement = json_encode($submission_requirement);
$extra_config = [
'remote_online_judge' => $remote_online_judge,
'remote_problem_id' => $remote_problem_id,
'time_limit' => $data['time_limit'],
'memory_limit' => $data['memory_limit'],
];
$enc_extra_config = json_encode($extra_config);
DB::insert([
"insert into problems",
2023-01-19 02:17:30 +00:00
"(title, uploader, is_hidden, submission_requirement, extra_config, difficulty, type)",
"values", DB::tuple([$data['title'], Auth::id(), 1, $enc_submission_requirement, $enc_extra_config, $data['difficulty'] ?: -1, "remote"])
2023-01-18 08:20:12 +00:00
]);
$id = DB::insert_id();
2023-01-30 12:27:53 +00:00
dataNewProblem($id);
if ($data['type'] == 'pdf') {
file_put_contents(UOJContext::storagePath(), "/problem_resources/$id/statement.pdf", $data['pdf_data']);
2023-01-30 12:27:53 +00:00
$data['statement'] = "<div data-pdf data-src=\"/problem/$id/resources/statement.pdf\"></div>\n" . $data['statement'];
}
2023-01-18 08:20:12 +00:00
DB::insert([
"insert into problems_contents",
"(id, remote_content, statement, statement_md)",
"values",
2023-01-20 13:23:22 +00:00
DB::tuple([$id, HTML::purifier(['a' => ['target' => 'Enum#_blank']])->purify($data['statement']), '', ''])
2023-01-18 08:20:12 +00:00
]);
DB::insert([
"insert into problems_tags",
"(problem_id, tag)",
"values",
DB::tuple([$id, $remote_provider['name']]),
]);
UOJRemoteProblem::downloadImagesInRemoteContent(strval($id));
2023-01-18 08:20:12 +00:00
redirectTo("/problem/{$id}");
die();
};
$new_remote_problem_form->runAtServer();
?>
<?php echoUOJPageHeader('导入远程题库') ?>
<h1>导入远程题库</h1>
<div class="row">
<div class="col-md-9">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-md-6">
<?php $new_remote_problem_form->printHTML() ?>
</div>
<div class="col-md-6 mt-3 mt-md-0">
<h4>使用帮助</h4>
2023-01-19 02:17:16 +00:00
<ul>
<li>
<p>目前支持导入以下题库的题目作为远端评测题:</p>
<ul class="mb-3">
2023-01-24 03:51:21 +00:00
<li><a href="https://codeforces.com/problemset">Codeforces</a></li>
<li><a href="https://codeforces.com/gyms">Codeforces::Gym</a>(题号前加 <code>GYM</code></li>
<li><a href="https://atcoder.jp/contests/archive">AtCoder</a>(请以原题目链接中附带的题号为准,显示题号与实际题号的对应关系可能错误)</li>
2023-01-24 03:51:21 +00:00
<li><a href="https://uoj.ac/problems">UniversalOJ</a></li>
<li><a href="https://loj.ac/p">LibreOJ</a></li>
<li><a href="https://www.luogu.com.cn/problem/list">洛谷</a>(不能使用公用账号提交)</li>
2023-03-17 13:55:35 +00:00
<li><a href="https://qoj.ac/problems">Qingyu Online Judge</a></li>
2023-01-19 02:17:16 +00:00
</ul>
</li>
<li>在导入题目前请先搜索题库中是否已经存在相应题目,避免重复添加。</li>
</ul>
2023-01-18 08:20:12 +00:00
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
2023-01-19 08:13:03 +00:00
<?php uojIncludeView('sidebar') ?>
2023-01-18 08:20:12 +00:00
</div>
</div>
<?php echoUOJPageFooter() ?>