minigame 4 colour question
This commit is contained in:
@@ -6,7 +6,7 @@ declare(strict_types=1);
|
||||
* แก้กรณี nginx ส่ง /Game/ เป็น static แล้ว PUT ไม่ถึง Node — เบราว์เซอร์เรียก PHP แทน
|
||||
*
|
||||
* รองรับ Node เวอร์ชันเก่าที่ GET ไม่ส่ง battleQuizMcq / PUT เขียนทับไฟล์แล้วตัดฟิลด์:
|
||||
* - GET: ดึง battleQuizMcq จากไฟล์บนดิสก์มาแปะในคำตอบ
|
||||
* - GET: ดึงจากดิสก์มาแปะทับบางฟิลด์ (battleQuizMcq + carry*) เพราะหลัง PUT เรา merge ลงไฟล์ใต้ www เสมอ — Node อาจอ่านคนละ path กับ PHP
|
||||
* - PUT: merge body ลง quiz-settings.json บนดิสก์เสมอ (หลัง proxy Node) เพื่อให้ข้อมูลคงอยู่หลังรีเฟรช
|
||||
*/
|
||||
require __DIR__ . '/_common.php';
|
||||
@@ -37,16 +37,22 @@ function merge_quiz_settings_disk_from_put(string $rawBody): bool
|
||||
}
|
||||
$path = quiz_settings_disk_path();
|
||||
$base = [];
|
||||
$hadFileButInvalidJson = false;
|
||||
if (is_file($path)) {
|
||||
$prev = @file_get_contents($path);
|
||||
if ($prev !== false && $prev !== '') {
|
||||
$d = json_decode($prev, true);
|
||||
if (is_array($d)) {
|
||||
$base = $d;
|
||||
} else {
|
||||
$hadFileButInvalidJson = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
$mergeKeys = ['readMs', 'answerMs', 'betweenMs', 'carryReadMs', 'carryAnswerMs', 'carrySessionLength', 'questions', 'carryQuestions', 'battleQuizMcq'];
|
||||
if ($hadFileButInvalidJson) {
|
||||
return false;
|
||||
}
|
||||
$mergeKeys = ['readMs', 'answerMs', 'betweenMs', 'carryReadMs', 'carryAnswerMs', 'carrySessionLength', 'carryMapPanelTheme', 'questions', 'carryQuestions', 'battleQuizMcq'];
|
||||
foreach ($mergeKeys as $k) {
|
||||
if (array_key_exists($k, $patch)) {
|
||||
$base[$k] = $patch[$k];
|
||||
@@ -66,9 +72,10 @@ function merge_quiz_settings_disk_from_put(string $rawBody): bool
|
||||
}
|
||||
|
||||
/**
|
||||
* Node เก่าอาจไม่ใส่ battleQuizMcq ใน JSON — อ่านจากดิสก์มาแปะให้แอดมินโหลดได้หลังรีเฟรช
|
||||
* แปะค่าจาก quiz-settings.json ใต้ docroot ทับ JSON จาก Node — ให้แอดมินรีเฟรชแล้วเห็นค่าที่ merge หลัง PUT (กันคนละไฟล์กับ Node)
|
||||
* Overlay keys from on-disk quiz-settings.json over Node JSON — Admin refresh matches post-PUT merge (fixes Node vs disk path mismatch).
|
||||
*/
|
||||
function overlay_battle_quiz_mcq_from_disk(string $nodeBody): string
|
||||
function overlay_quiz_settings_from_disk(string $nodeBody): string
|
||||
{
|
||||
$j = json_decode($nodeBody, true);
|
||||
if (!is_array($j)) {
|
||||
@@ -83,10 +90,23 @@ function overlay_battle_quiz_mcq_from_disk(string $nodeBody): string
|
||||
return $nodeBody;
|
||||
}
|
||||
$disk = json_decode($raw, true);
|
||||
if (!is_array($disk) || !array_key_exists('battleQuizMcq', $disk)) {
|
||||
if (!is_array($disk)) {
|
||||
return $nodeBody;
|
||||
}
|
||||
$j['battleQuizMcq'] = $disk['battleQuizMcq'];
|
||||
if (array_key_exists('battleQuizMcq', $disk)) {
|
||||
$j['battleQuizMcq'] = $disk['battleQuizMcq'];
|
||||
}
|
||||
if (array_key_exists('carryMapPanelTheme', $disk) && is_array($disk['carryMapPanelTheme'])) {
|
||||
$j['carryMapPanelTheme'] = $disk['carryMapPanelTheme'];
|
||||
}
|
||||
foreach (['carryReadMs', 'carryAnswerMs', 'carrySessionLength'] as $ck) {
|
||||
if (array_key_exists($ck, $disk)) {
|
||||
$j[$ck] = $disk[$ck];
|
||||
}
|
||||
}
|
||||
if (array_key_exists('carryQuestions', $disk) && is_array($disk['carryQuestions'])) {
|
||||
$j['carryQuestions'] = $disk['carryQuestions'];
|
||||
}
|
||||
$enc = json_encode($j, JSON_UNESCAPED_UNICODE);
|
||||
return $enc !== false ? $enc : $nodeBody;
|
||||
}
|
||||
@@ -141,7 +161,26 @@ function proxy_quiz_curl(string $method, ?string $body = null): void
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('X-Content-Type-Options: nosniff');
|
||||
header('Cache-Control: no-store');
|
||||
echo json_encode(['ok' => true, 'diskFallback' => true], JSON_UNESCAPED_UNICODE);
|
||||
$payload = ['ok' => true, 'diskFallback' => true];
|
||||
$rawDisk = @file_get_contents(quiz_settings_disk_path());
|
||||
if ($rawDisk !== false && $rawDisk !== '') {
|
||||
$dj = json_decode($rawDisk, true);
|
||||
if (is_array($dj)) {
|
||||
if (isset($dj['carryMapPanelTheme']) && is_array($dj['carryMapPanelTheme'])) {
|
||||
$payload['carryMapPanelTheme'] = $dj['carryMapPanelTheme'];
|
||||
}
|
||||
if (array_key_exists('carryReadMs', $dj)) {
|
||||
$payload['carryReadMs'] = $dj['carryReadMs'];
|
||||
}
|
||||
if (array_key_exists('carryAnswerMs', $dj)) {
|
||||
$payload['carryAnswerMs'] = $dj['carryAnswerMs'];
|
||||
}
|
||||
if (array_key_exists('carrySessionLength', $dj)) {
|
||||
$payload['carrySessionLength'] = $dj['carrySessionLength'];
|
||||
}
|
||||
}
|
||||
}
|
||||
echo json_encode($payload, JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
json_response([
|
||||
@@ -154,7 +193,7 @@ function proxy_quiz_curl(string $method, ?string $body = null): void
|
||||
header('X-Content-Type-Options: nosniff');
|
||||
header('Cache-Control: no-store');
|
||||
if ($method === 'GET' && $code >= 200 && $code < 300) {
|
||||
echo overlay_battle_quiz_mcq_from_disk($out);
|
||||
echo overlay_quiz_settings_from_disk($out);
|
||||
} else {
|
||||
echo $out;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user