diff --git a/Update.json b/Update.json index 65325b1f..63669aa3 100644 --- a/Update.json +++ b/Update.json @@ -3444,6 +3444,17 @@ } ], "Notes": "Fix ProblemSwitcher Not Update" + }, + "3.3.3": { + "UpdateDate": 1773550684270, + "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 897238fe..3cddb42c 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 @@ -2526,6 +2526,20 @@ 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 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 = `
@@ -2535,7 +2549,7 @@ async function main() {
- + @@ -2561,6 +2575,13 @@ async function main() {
`; + + var selectElement = document.getElementById('problem_id'); + selectElement.value = CurrentProblemId; + selectElement = document.getElementById('language'); + selectElement.value = CurrentLanguage; + selectElement = document.getElementById('jresult'); + selectElement.value = CurrentJresult; } if (UtilityEnabled("ImproveACRate")) { @@ -3298,8 +3319,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 +5623,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 +5640,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 +5654,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 +5669,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 +5680,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 +5704,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 +5723,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 +5757,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 +5825,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 +5834,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 +5843,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 +5855,7 @@ int main() UpdateNavButtons(); UpdateImageSize(); }; - + // Function to open modal let OpenImageModal = (imgElement) => { let PreviewImages = [...document.querySelectorAll("img.xmoj-image-preview")]; @@ -5852,22 +5873,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 +5905,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 +5919,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 +5927,7 @@ int main() UpdateImageSize(); e.preventDefault(); }, { passive: false }); - + ModalContent.addEventListener("touchend", (e) => { if (IsTouchPanning) { IsTouchPanning = false; @@ -5925,7 +5946,7 @@ int main() } } }, { passive: true }); - + // Mouse drag to pan when zoomed ModalContent.addEventListener("mousedown", (e) => { if (CurrentZoom <= 1) return; @@ -5939,14 +5960,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 +5976,7 @@ int main() ModalContent.style.cursor = CursorStyle; } }); - + // Mouse wheel to zoom in/out ModalContent.addEventListener("wheel", (e) => { e.preventDefault(); @@ -5963,36 +5984,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 +6044,7 @@ int main() } }); }); - + // Apply to all images on the page let ApplyEnlargerToImage = (img) => { const effectiveSrc = img.currentSrc || img.src; @@ -6047,10 +6068,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 +6085,12 @@ int main() }); }); }); - + Observer.observe(document.body, { childList: true, subtree: true }); - + } catch (e) { console.error(e); if (UtilityEnabled("DebugMode")) { 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": {