// ==UserScript== // @name GGn PTPImg Enforcer // @namespace https://greasyfork.org/users/1395131 // @version 1.0 // @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 = null; let submitButton = null; let originalButtonText = ''; function isValidImageURL(url) { return url.includes('ptpimg.me'); } function setButtonState() { if (!submitButton || !imageInput) return; const valid = isValidImageURL(imageInput.value); 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'; // Prevent rogue clicks submitButton.onclick = function (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) return false; if (initialized) return true; originalButtonText = submitButton.value; setButtonState(); imageInput.addEventListener('input', setButtonState); imageInput.addEventListener('change', setButtonState); const inputObserver = new MutationObserver(setButtonState); inputObserver.observe(imageInput, { attributes: true, attributeFilter: ['value'] }); const forceBtn = document.createElement('button'); forceBtn.innerText = 'Force Check Image URL'; forceBtn.type = 'button'; forceBtn.style.marginLeft = '10px'; forceBtn.classList.add('button'); forceBtn.addEventListener('click', setButtonState); submitButton.parentNode.insertBefore(forceBtn, submitButton.nextSibling); initialized = true; return true; } setInterval(() => { if (!initialized) { attachLogic(); } if (imageInput && submitButton) { setButtonState(); } }, 250); })();