From 657eb756790440ded1712f1952d862f4a65925f6 Mon Sep 17 00:00:00 2001 From: def-WA2025 Date: Sun, 15 Mar 2026 09:19:15 +0800 Subject: [PATCH 1/9] Display status.php Query Content --- XMOJ.user.js | 141 +++++++++++++++++++++++++++++---------------------- 1 file changed, 79 insertions(+), 62 deletions(-) diff --git a/XMOJ.user.js b/XMOJ.user.js index 897238fe..0bac56b2 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -2526,16 +2526,28 @@ async function main() { document.title = "提交状态"; document.querySelector("body > script:nth-child(5)").remove(); if (UtilityEnabled("NewBootstrap")) { + const url = window.location.href; + const paramsRegex = /[?&]([^=#]+)=([^&#]*)/g; + let match; + let CurrentProblemId, CurrentLanguage, CurrentJresult; + while ((match = paramsRegex.exec(url)) !== null) { + const [_, key, value] = match; + if (key == 'problem_id') CurrentProblemId = value; + if (key == 'language') CurrentLanguage = value; + if (key == 'jresult') CurrentJresult = value; + } + console.log(CurrentProblemId + '\n' + CurrentLanguage + '\n' + CurrentJresult); + document.querySelector("#simform").outerHTML = `
- +
- + @@ -2561,6 +2573,11 @@ async function main() {
`; + + var selectElement = document.getElementById('language'); + selectElement.value = CurrentLanguage; + selectElement = document.getElementById('jresult'); + selectElement.value = CurrentJresult; } if (UtilityEnabled("ImproveACRate")) { @@ -3298,8 +3315,8 @@ async function main() { } ErrorElement.style.display = "block"; ErrorMessage.style.color = "red"; - ErrorMessage.innerText = "比赛已结束, 正在尝试像题目 " + rPID + " 提交"; - console.log("比赛已结束, 正在尝试像题目 " + rPID + " 提交"); + ErrorMessage.innerText = "比赛已结束, 正在尝试向题目 " + rPID + " 提交"; + console.log("比赛已结束, 正在尝试向题目 " + rPID + " 提交"); let o2Switch = "&enable_O2=on"; if (!document.querySelector("#enable_O2").checked) o2Switch = ""; await fetch("https://www.xmoj.tech/submit.php", { @@ -5602,13 +5619,13 @@ int main() .xmoj-image-preview { cursor: pointer; } - + .xmoj-image-preview:hover { opacity: 0.8; transition: opacity 0.2s ease; } - - + + .xmoj-image-modal { display: none; position: fixed; @@ -5619,12 +5636,12 @@ int main() height: 100%; background-color: rgba(0, 0, 0, 0.9); } - + .xmoj-image-modal.show { display: flex; flex-direction: column; } - + .xmoj-image-modal-content { flex: 1; display: flex; @@ -5633,13 +5650,13 @@ int main() overflow: hidden; position: relative; } - + .xmoj-image-modal-image { max-width: 100%; max-height: 100%; object-fit: contain; } - + .xmoj-image-modal-toolbar { display: flex; justify-content: center; @@ -5648,7 +5665,7 @@ int main() background-color: rgba(0, 0, 0, 0.5); flex-wrap: wrap; } - + .xmoj-image-modal-toolbar button { padding: 8px 16px; background-color: #0d6efd; @@ -5659,15 +5676,15 @@ int main() font-size: 14px; transition: background-color 0.2s ease; } - + .xmoj-image-modal-toolbar button:hover { background-color: #0b5ed7; } - + .xmoj-image-modal-toolbar button:active { background-color: #0a58ca; } - + .xmoj-image-modal-close { position: absolute; top: 20px; @@ -5683,11 +5700,11 @@ int main() transition: color 0.2s ease; z-index: 1; } - + .xmoj-image-modal-close:hover { color: #ccc; } - + .xmoj-image-modal-nav { position: absolute; top: 50%; @@ -5702,33 +5719,33 @@ int main() user-select: none; -webkit-user-select: none; } - + .xmoj-image-modal-nav:hover { background: rgba(0, 0, 0, 0.8); } - + .xmoj-image-modal-nav:disabled { opacity: 0.3; cursor: default; } - + .xmoj-image-modal-nav-prev { left: 0; border-radius: 0 4px 4px 0; } - + .xmoj-image-modal-nav-next { right: 0; border-radius: 4px 0 0 4px; } `; document.head.appendChild(EnlargerStyle); - + // Create modal element let ImageModal = document.createElement("div"); ImageModal.className = "xmoj-image-modal"; ImageModal.id = "xmoj-image-modal"; - + let CloseButton = document.createElement("button"); CloseButton.className = "xmoj-image-modal-close"; CloseButton.type = "button"; @@ -5736,55 +5753,55 @@ int main() CloseButton.title = "关闭图片"; CloseButton.innerHTML = "×"; ImageModal.appendChild(CloseButton); - + let ModalContent = document.createElement("div"); ModalContent.className = "xmoj-image-modal-content"; - + let PrevBtn = document.createElement("button"); PrevBtn.className = "xmoj-image-modal-nav xmoj-image-modal-nav-prev"; PrevBtn.type = "button"; PrevBtn.setAttribute("aria-label", "上一张"); PrevBtn.innerHTML = "❮"; ModalContent.appendChild(PrevBtn); - + let NextBtn = document.createElement("button"); NextBtn.className = "xmoj-image-modal-nav xmoj-image-modal-nav-next"; NextBtn.type = "button"; NextBtn.setAttribute("aria-label", "下一张"); NextBtn.innerHTML = "❯"; ModalContent.appendChild(NextBtn); - + let ModalImage = document.createElement("img"); ModalImage.className = "xmoj-image-modal-image"; ModalContent.appendChild(ModalImage); ImageModal.appendChild(ModalContent); - + let Toolbar = document.createElement("div"); Toolbar.className = "xmoj-image-modal-toolbar"; - + let ZoomInBtn = document.createElement("button"); ZoomInBtn.innerHTML = "放大 (+)"; ZoomInBtn.type = "button"; Toolbar.appendChild(ZoomInBtn); - + let ZoomOutBtn = document.createElement("button"); ZoomOutBtn.innerHTML = "缩小 (-)"; ZoomOutBtn.type = "button"; Toolbar.appendChild(ZoomOutBtn); - + let ResetZoomBtn = document.createElement("button"); ResetZoomBtn.innerHTML = "重置大小"; ResetZoomBtn.type = "button"; Toolbar.appendChild(ResetZoomBtn); - + let SaveBtn = document.createElement("button"); SaveBtn.innerHTML = "保存图片"; SaveBtn.type = "button"; Toolbar.appendChild(SaveBtn); - + ImageModal.appendChild(Toolbar); document.body.appendChild(ImageModal); - + // Zoom level and navigation state let CurrentZoom = 1; const ZoomStep = 0.1; @@ -5804,7 +5821,7 @@ int main() let TouchStartY = 0; let TouchPanStartPanX = 0; let TouchPanStartPanY = 0; - + // Function to update image transform (zoom + pan) let UpdateImageSize = () => { ModalImage.style.transform = `translate(${PanX}px, ${PanY}px) scale(${CurrentZoom})`; @@ -5813,7 +5830,7 @@ int main() ModalImage.style.cursor = CursorStyle; ModalContent.style.cursor = CursorStyle; }; - + // Function to update prev/next button state let UpdateNavButtons = () => { let HasMultiple = ImageList.length > 1; @@ -5822,7 +5839,7 @@ int main() PrevBtn.disabled = CurrentImageIndex <= 0; NextBtn.disabled = CurrentImageIndex >= ImageList.length - 1; }; - + // Function to navigate to a specific image by index let NavigateTo = (index) => { if (index < 0 || index >= ImageList.length) return; @@ -5834,7 +5851,7 @@ int main() UpdateNavButtons(); UpdateImageSize(); }; - + // Function to open modal let OpenImageModal = (imgElement) => { let PreviewImages = [...document.querySelectorAll("img.xmoj-image-preview")]; @@ -5852,22 +5869,22 @@ int main() UpdateNavButtons(); UpdateImageSize(); }; - + // Function to close modal let CloseImageModal = () => { ImageModal.classList.remove("show"); }; - + // Close button click CloseButton.addEventListener("click", CloseImageModal); - + // Close when clicking outside the image ImageModal.addEventListener("click", (e) => { if (e.target === ImageModal || e.target === ModalContent) { CloseImageModal(); } }); - + // Keyboard shortcuts document.addEventListener("keydown", (e) => { if (ImageModal.classList.contains("show")) { @@ -5884,7 +5901,7 @@ int main() } } }); - + // Touch events: pan when zoomed, swipe to navigate when at zoom level 1 ModalContent.addEventListener("touchstart", (e) => { if (e.touches.length !== 1) return; @@ -5898,7 +5915,7 @@ int main() IsTouchPanning = false; } }, { passive: true }); - + ModalContent.addEventListener("touchmove", (e) => { if (!IsTouchPanning || e.touches.length !== 1) return; PanX = TouchPanStartPanX + (e.touches[0].clientX - TouchStartX); @@ -5906,7 +5923,7 @@ int main() UpdateImageSize(); e.preventDefault(); }, { passive: false }); - + ModalContent.addEventListener("touchend", (e) => { if (IsTouchPanning) { IsTouchPanning = false; @@ -5925,7 +5942,7 @@ int main() } } }, { passive: true }); - + // Mouse drag to pan when zoomed ModalContent.addEventListener("mousedown", (e) => { if (CurrentZoom <= 1) return; @@ -5939,14 +5956,14 @@ int main() ModalContent.style.cursor = "grabbing"; e.preventDefault(); }); - + document.addEventListener("mousemove", (e) => { if (!IsDragging) return; PanX = DragStartPanX + (e.clientX - DragStartX); PanY = DragStartPanY + (e.clientY - DragStartY); UpdateImageSize(); }); - + document.addEventListener("mouseup", () => { if (IsDragging) { IsDragging = false; @@ -5955,7 +5972,7 @@ int main() ModalContent.style.cursor = CursorStyle; } }); - + // Mouse wheel to zoom in/out ModalContent.addEventListener("wheel", (e) => { e.preventDefault(); @@ -5963,36 +5980,36 @@ int main() CurrentZoom = Math.max(MinZoom, Math.min(MaxZoom, CurrentZoom + ZoomDelta)); UpdateImageSize(); }, { passive: false }); - + // Navigation button clicks PrevBtn.addEventListener("click", (e) => { e.stopPropagation(); NavigateTo(CurrentImageIndex - 1); }); - + NextBtn.addEventListener("click", (e) => { e.stopPropagation(); NavigateTo(CurrentImageIndex + 1); }); - + // Zoom controls ZoomInBtn.addEventListener("click", () => { CurrentZoom = Math.min(CurrentZoom + ZoomStep, MaxZoom); UpdateImageSize(); }); - + ZoomOutBtn.addEventListener("click", () => { CurrentZoom = Math.max(CurrentZoom - ZoomStep, MinZoom); UpdateImageSize(); }); - + ResetZoomBtn.addEventListener("click", () => { CurrentZoom = 1; PanX = 0; PanY = 0; UpdateImageSize(); }); - + // Save/Download image: fetch via GM_xmlhttpRequest to bypass CORS, then use blob URL for reliable download SaveBtn.addEventListener("click", () => { let src = ModalImage.src; @@ -6023,7 +6040,7 @@ int main() } }); }); - + // Apply to all images on the page let ApplyEnlargerToImage = (img) => { const effectiveSrc = img.currentSrc || img.src; @@ -6047,10 +6064,10 @@ int main() let ApplyEnlargerToImages = () => { document.querySelectorAll("img").forEach(ApplyEnlargerToImage); }; - + // Apply to existing images ApplyEnlargerToImages(); - + // Apply to dynamically added images let Observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { @@ -6064,12 +6081,12 @@ int main() }); }); }); - + Observer.observe(document.body, { childList: true, subtree: true }); - + } catch (e) { console.error(e); if (UtilityEnabled("DebugMode")) { @@ -6087,4 +6104,4 @@ int main() main().then(r => { console.log("XMOJ-Script loaded successfully!"); -}); +}); \ No newline at end of file From b41dccaf22b184922a1c7ef1474b8a19b2268cda Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Mar 2026 02:39:14 +0000 Subject: [PATCH 2/9] 3.3.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7a191097..a2826d87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xmoj-script", - "version": "3.3.2", + "version": "3.3.3", "description": "an improvement script for xmoj.tech", "main": "AddonScript.js", "scripts": { From b9fe815555370999acefba7c2c8d42cfa5ae5e2b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Mar 2026 02:39:20 +0000 Subject: [PATCH 3/9] Update version info to 3.3.3 --- Update.json | 11 +++++++++++ XMOJ.user.js | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Update.json b/Update.json index 65325b1f..b27ae8b7 100644 --- a/Update.json +++ b/Update.json @@ -3444,6 +3444,17 @@ } ], "Notes": "Fix ProblemSwitcher Not Update" + }, + "3.3.3": { + "UpdateDate": 1773542354999, + "Prerelease": true, + "UpdateContents": [ + { + "PR": 937, + "Description": "Display status.php Query Content" + } + ], + "Notes": "Display status.php query content." } } } \ No newline at end of file diff --git a/XMOJ.user.js b/XMOJ.user.js index 0bac56b2..7e6952c6 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name XMOJ -// @version 3.3.2 +// @version 3.3.3 // @description XMOJ增强脚本 // @author @XMOJ-Script-dev, @langningchen and the community // @namespace https://github/langningchen From 129f43427c1015b9156954bcd2a4cfc83e928503 Mon Sep 17 00:00:00 2001 From: zsTree Date: Sun, 15 Mar 2026 10:52:47 +0800 Subject: [PATCH 4/9] Fix XSS bug & Remove irrelevant console logs Signed-off-by: zsTree --- XMOJ.user.js | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/XMOJ.user.js b/XMOJ.user.js index 7e6952c6..b7ad9a10 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name XMOJ -// @version 3.3.3 +// @version 3.3.2 // @description XMOJ增强脚本 // @author @XMOJ-Script-dev, @langningchen and the community // @namespace https://github/langningchen @@ -2526,23 +2526,16 @@ async function main() { document.title = "提交状态"; document.querySelector("body > script:nth-child(5)").remove(); if (UtilityEnabled("NewBootstrap")) { - const url = window.location.href; - const paramsRegex = /[?&]([^=#]+)=([^&#]*)/g; - let match; - let CurrentProblemId, CurrentLanguage, CurrentJresult; - while ((match = paramsRegex.exec(url)) !== null) { - const [_, key, value] = match; - if (key == 'problem_id') CurrentProblemId = value; - if (key == 'language') CurrentLanguage = value; - if (key == 'jresult') CurrentJresult = value; - } - console.log(CurrentProblemId + '\n' + CurrentLanguage + '\n' + CurrentJresult); + const params = new URLSearchParams(window.location.search); + const CurrentProblemId = params.get('problem_id'); + const CurrentLanguage = params.get('language'); + const CurrentJresult = params.get('jresult'); document.querySelector("#simform").outerHTML = `
- +
@@ -2574,7 +2567,9 @@ async function main() {
`; - var selectElement = document.getElementById('language'); + var selectElement = document.getElementById('problem_id'); + selectElement.value = CurrentProblemId; + selectElement = document.getElementById('language'); selectElement.value = CurrentLanguage; selectElement = document.getElementById('jresult'); selectElement.value = CurrentJresult; @@ -6104,4 +6099,4 @@ int main() main().then(r => { console.log("XMOJ-Script loaded successfully!"); -}); \ No newline at end of file +}); From 055cb968459fd78e8dfed95d62c0da094e4ce02e Mon Sep 17 00:00:00 2001 From: zsTree Date: Sun, 15 Mar 2026 11:34:25 +0800 Subject: [PATCH 5/9] Determine whether status.php query parameters are valid Signed-off-by: zsTree --- XMOJ.user.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/XMOJ.user.js b/XMOJ.user.js index b7ad9a10..3f99e1d0 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -2526,10 +2526,11 @@ async function main() { document.title = "提交状态"; document.querySelector("body > script:nth-child(5)").remove(); if (UtilityEnabled("NewBootstrap")) { - const params = new URLSearchParams(window.location.search); - const CurrentProblemId = params.get('problem_id'); - const CurrentLanguage = params.get('language'); - const CurrentJresult = params.get('jresult'); + const params = new URL(location.href).searchParams; + let nonDigitPattern = /D/; + let CurrentProblemId = isNaN(params.get("problem_id")) ? "" : params.get("problem_id"); + let CurrentLanguage = isNaN(params.get("language")) || params.get("language") < -1 || params.get("language") > 2 ? "-1" : params.get("language"); + let CurrentJresult = isNaN(params.get("jresult")) || params.get("jresult") < -1 || params.get("jresult") > 11 ? "-1" : params.get("jresult"); document.querySelector("#simform").outerHTML = `
From e221d2d012ee98dd6fd6ba041e1839421f7ed219 Mon Sep 17 00:00:00 2001 From: zsTree Date: Sun, 15 Mar 2026 11:38:53 +0800 Subject: [PATCH 6/9] Bump version to 3.3.3 Signed-off-by: zsTree --- XMOJ.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XMOJ.user.js b/XMOJ.user.js index 3f99e1d0..1ba91077 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name XMOJ -// @version 3.3.2 +// @version 3.3.3 // @description XMOJ增强脚本 // @author @XMOJ-Script-dev, @langningchen and the community // @namespace https://github/langningchen From dfe5d27fd1ddcf4d1e7a8e532d4a11a7a9c27d39 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Mar 2026 03:39:15 +0000 Subject: [PATCH 7/9] Update time and description of 3.3.3 --- Update.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Update.json b/Update.json index b27ae8b7..6e1e8af6 100644 --- a/Update.json +++ b/Update.json @@ -3446,7 +3446,7 @@ "Notes": "Fix ProblemSwitcher Not Update" }, "3.3.3": { - "UpdateDate": 1773542354999, + "UpdateDate": 1773545950014, "Prerelease": true, "UpdateContents": [ { From fbff864d31cff46d32ad28d27971d05cceabd183 Mon Sep 17 00:00:00 2001 From: zsTree Date: Sun, 15 Mar 2026 12:57:48 +0800 Subject: [PATCH 8/9] Fixed the issue where certain special content could not be filled Signed-off-by: zsTree --- XMOJ.user.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/XMOJ.user.js b/XMOJ.user.js index 1ba91077..3cddb42c 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -2526,11 +2526,19 @@ async function main() { document.title = "提交状态"; document.querySelector("body > script:nth-child(5)").remove(); if (UtilityEnabled("NewBootstrap")) { + var checkNum = function(str) { + var patrn = /^[0-9]{1,20}$/; + var ans = true; + if (!patrn.exec(str)) ans = false; + return ans; + } + const params = new URL(location.href).searchParams; - let nonDigitPattern = /D/; - let CurrentProblemId = isNaN(params.get("problem_id")) ? "" : params.get("problem_id"); - let CurrentLanguage = isNaN(params.get("language")) || params.get("language") < -1 || params.get("language") > 2 ? "-1" : params.get("language"); - let CurrentJresult = isNaN(params.get("jresult")) || params.get("jresult") < -1 || params.get("jresult") > 11 ? "-1" : params.get("jresult"); + let CurrentProblemId = checkNum(params.get("problem_id")) ? Number(params.get("problem_id")) : ""; + let CurrentLanguageParam = params.get("language"); + let CurrentLanguage = checkNum(CurrentLanguageParam) && -1 <= CurrentLanguageParam && CurrentLanguageParam <= 2 ? Number(CurrentLanguageParam) : "-1"; + let CurrentJresultParam = params.get("jresult"); + let CurrentJresult = checkNum(CurrentJresultParam) && -1 <= CurrentJresultParam && CurrentJresultParam <= 11 ? Number(CurrentJresultParam) : "-1"; document.querySelector("#simform").outerHTML = ` From ac131134b5614df88bd223beefad6a4a6034fa82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Mar 2026 04:58:09 +0000 Subject: [PATCH 9/9] Update time and description of 3.3.3 --- Update.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Update.json b/Update.json index 6e1e8af6..63669aa3 100644 --- a/Update.json +++ b/Update.json @@ -3446,7 +3446,7 @@ "Notes": "Fix ProblemSwitcher Not Update" }, "3.3.3": { - "UpdateDate": 1773545950014, + "UpdateDate": 1773550684270, "Prerelease": true, "UpdateContents": [ {