您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Disable submit unless images use ptpimg.me and album_desc has proper format.
当前为
// ==UserScript== // @name GGn PTPImg Enforcer // @namespace https://greasyfork.org/users/1395131 // @version 1.4 // @description Disable submit unless images use ptpimg.me and album_desc has proper format. // @include https://gazellegames.net/upload.php* // @match https://gazellegames.net/torrents.php?action=editgroup* // @author SleepingGiant // @grant none // ==/UserScript== (function () { 'use strict'; let initialized = false; let imageInput, submitButton; let originalButtonText = ''; // This reason list is shared between scripts. const reasonListId = 'ggn-block-reasons'; function isValidImageURL(url) { return url.includes('ptpimg.me'); } function checkAllURLsValid() { const mainURL = document.querySelector('input[name="image"]')?.value.trim(); if (!isValidImageURL(mainURL)) return false; const screenInputs = document.querySelectorAll('#image_block input[name="screens[]"]'); for (let input of screenInputs) { if (!isValidImageURL(input.value.trim())) { return false; } } return true; } function setButtonState() { if (!submitButton) return; const override = document.querySelector('#upload-blocker-override')?.checked; const validImages = checkAllURLsValid(); const reasonContainer = document.getElementById(reasonListId) || createReasonList(); const ptpimgReason = 'All images must be hosted on ptpimg.me.'; const existingReasons = Array.from(reasonContainer.children).map(li => li.textContent); // Add reason if it's not valid (even if overridden) if (!validImages && !existingReasons.includes(ptpimgReason)) { const li = document.createElement('li'); li.textContent = ptpimgReason; reasonContainer.appendChild(li); } if (validImages && existingReasons.includes(ptpimgReason)) { for (const li of Array.from(reasonContainer.children)) { if (li.textContent === ptpimgReason) { li.remove(); break; } } } // Button logic — allow override to enable submission const hasReasons = reasonContainer.children.length > 0; if (hasReasons && !override) { submitButton.disabled = true; submitButton.style.pointerEvents = 'none'; submitButton.style.opacity = '0.5'; submitButton.style.cursor = 'not-allowed'; submitButton.value = 'Blocked'; } else { submitButton.disabled = false; submitButton.style.pointerEvents = 'auto'; submitButton.style.opacity = '1'; submitButton.style.cursor = 'pointer'; submitButton.value = originalButtonText; } } function createReasonList() { const ul = document.createElement('ul'); ul.id = reasonListId; ul.style.marginTop = '10px'; ul.style.color = 'red'; submitButton.parentNode.insertBefore(ul, submitButton.nextSibling); return ul; } function attachLogic() { if (initialized) return; imageInput = document.querySelector('input[name="image"]'); submitButton = document.querySelector('#post') || document.querySelector('input[type="submit"][value="Submit"]'); if (!imageInput || !submitButton) return; originalButtonText = submitButton.value; // This is a generic function structure used by ALL scripts relying on this same blocker approach. if (!document.getElementById('upload-blocker-override')) { const overrideCheckbox = document.createElement('input'); overrideCheckbox.type = 'checkbox'; overrideCheckbox.id = 'upload-blocker-override'; overrideCheckbox.style.marginLeft = '3px'; const overrideLabel = document.createElement('label'); overrideLabel.htmlFor = 'upload-blocker-override'; overrideLabel.innerText = ' Override blockers'; overrideLabel.style.display = 'inline'; overrideLabel.style.marginLeft = '5px'; submitButton.parentNode.insertBefore(overrideCheckbox, submitButton.nextSibling); submitButton.parentNode.insertBefore(overrideLabel, submitButton.nextSibling); } imageInput.addEventListener('input', setButtonState); imageInput.addEventListener('change', setButtonState); initialized = true; setButtonState(); } setInterval(() => { if (!initialized) attachLogic(); else setButtonState(); }, 500); })();