// ==UserScript== // @name GGn PTPImg Enforcer // @namespace https://greasyfork.org/users/1395131 // @version 1.1 // @description Disable submit unless the image URL contains ptpimg.me, with a force check button (in case auto-polling fails) // @match https://gazellegames.net/upload.php // @author SleepingGiant // @grant none // @downloadURL none // ==/UserScript== (function () { 'use strict'; let initialized = false; let imageInput, submitButton; let originalButtonText = ''; function isValidImageURL(url) { return url.includes('ptpimg.me'); } function setButtonState() { const url = imageInput.value.trim(); const valid = isValidImageURL(url); submitButton.disabled = !valid; submitButton.style.pointerEvents = valid ? 'auto' : 'none'; submitButton.style.opacity = valid ? '1' : '0.5'; submitButton.style.cursor = valid ? 'pointer' : 'not-allowed'; submitButton.value = valid ? originalButtonText : 'Image not PTPImg'; } function preventInvalidSubmit(e) { if (!isValidImageURL(imageInput.value)) { e.preventDefault(); e.stopImmediatePropagation(); alert('Image URL must contain ptpimg.me before uploading.'); return false; } } function attachLogic() { imageInput = document.querySelector('#image'); submitButton = document.querySelector('#post'); if (!imageInput || !submitButton || initialized) return; originalButtonText = submitButton.value; imageInput.addEventListener('input', setButtonState); imageInput.addEventListener('change', setButtonState); // Watch for value changes (e.g., by scripts) new MutationObserver(setButtonState).observe(imageInput, { attributes: true, attributeFilter: ['value'] }); // Prevent invalid form submission submitButton.addEventListener('click', preventInvalidSubmit); // Add force-check button const forceBtn = document.createElement('button'); forceBtn.innerText = 'Force Check Image URL'; forceBtn.type = 'button'; forceBtn.className = 'button'; forceBtn.style.marginLeft = '10px'; forceBtn.addEventListener('click', setButtonState); submitButton.parentNode.insertBefore(forceBtn, submitButton.nextSibling); initialized = true; setButtonState(); } setInterval(() => { if (!initialized) attachLogic(); else setButtonState(); }, 250); })();