minigame 4 colour question

This commit is contained in:
2026-04-27 07:45:39 +00:00
parent 8597578a28
commit 9745d91016
14 changed files with 990 additions and 46 deletions
+47 -8
View File
@@ -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;
}