diff --git a/web/app/models/UOJProblem.php b/web/app/models/UOJProblem.php
index 3bae2cf..463d623 100644
--- a/web/app/models/UOJProblem.php
+++ b/web/app/models/UOJProblem.php
@@ -392,6 +392,7 @@ class UOJProblem {
}
$remote_oj = $this->getExtraConfig('remote_online_judge');
+ $remote_id = $this->getExtraConfig('remote_problem_id');
if (!$remote_oj || !array_key_exists($remote_oj, UOJRemoteProblem::$providers)) {
return 'Error';
@@ -399,7 +400,10 @@ class UOJProblem {
$provider = UOJRemoteProblem::$providers[$remote_oj];
- return HTML::tag('a', ['href' => $provider['url'], 'target' => '_blank'], $provider['name']);
+ return HTML::tag('a', [
+ 'href' => UOJRemoteProblem::getProblemRemoteUrl($remote_oj, $remote_id),
+ 'target' => '_blank'
+ ], $provider['name']);
}
public function getDifficultyHTML() {
diff --git a/web/app/models/UOJRemoteProblem.php b/web/app/models/UOJRemoteProblem.php
index e4c69f4..6074faa 100644
--- a/web/app/models/UOJRemoteProblem.php
+++ b/web/app/models/UOJRemoteProblem.php
@@ -6,7 +6,6 @@ class UOJRemoteProblem {
'name' => 'Codeforces',
'short_name' => 'CF',
'url' => 'https://codeforces.com',
- 'host' => 'https://codeforces.com',
'not_exists_texts' => [
'
Actions | ',
'Statement is not available on English language',
@@ -16,16 +15,19 @@ class UOJRemoteProblem {
],
];
+ static function getCodeforcesProblemUrl($id) {
+ return static::$providers['codeforces']['url'] . '/problemset/problem/' . preg_replace_callback('/([1-9][0-9]{0,5})([A-Z][1-9]?)/', fn ($matches) => $matches[1] . '/' . $matches[2], $id);
+ }
+
// 传入 ID 需确保有效
static function getCodeforcesProblemBasicInfo($id) {
$curl = new Curl();
$curl->setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36 S2OJ/3.1.0');
$remote_provider = static::$providers['codeforces'];
- $url_id = preg_replace_callback('/([1-9][0-9]{0,5})([A-Z][1-9]?)/', fn ($matches) => $matches[1] . '/' . $matches[2], $id);
- $html = retry_loop(function () use ($curl, $url_id, $remote_provider) {
- $curl->get($remote_provider['host'] . '/problemset/problem/' . $url_id);
+ $html = retry_loop(function () use ($curl, $id) {
+ $curl->get(static::getCodeforcesProblemUrl($id));
if ($curl->error) {
return false;
@@ -126,6 +128,14 @@ class UOJRemoteProblem {
];
}
+ public static function getProblemRemoteUrl($oj, $id) {
+ if ($oj === 'codeforces') {
+ return static::getCodeforcesProblemUrl($id);
+ }
+
+ return null;
+ }
+
public static function getProblemBasicInfo($oj, $id) {
if ($oj === 'codeforces') {
return static::getCodeforcesProblemBasicInfo($id);