Greasy Fork is available in English.
Disable submit unless images use ptpimg.me (cover and screenshots).
当前为
// ==UserScript==
// @name GGn PTPImg Enforcer
// @namespace http://greasyfork.icu/users/1395131
// @version 1.3
// @description Disable submit unless images use ptpimg.me (cover and screenshots).
// @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 = '';
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() {
const override = document.querySelector('#ptpimg-override')?.checked;
const valid = override || checkAllURLsValid();
if (!submitButton) return;
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 : 'All images must be PTPImg';
}
function attachLogic() {
if (initialized) return;
imageInput = document.querySelector('input[name="image"]');
// Find submit button for both new upload and edit pages
submitButton = document.querySelector('#post') || document.querySelector('input[type="submit"][value="Submit"]');
if (!imageInput || !submitButton) return;
originalButtonText = submitButton.value;
const overrideCheckbox = document.createElement('input');
overrideCheckbox.type = 'checkbox';
overrideCheckbox.id = 'ptpimg-override';
overrideCheckbox.style.marginLeft = '3px';
const overrideLabel = document.createElement('label');
overrideLabel.htmlFor = 'ptpimg-override';
overrideLabel.innerText = ' Override image URL checks';
overrideLabel.style.display = 'inline';
overrideLabel.style.marginLeft = '5px';
submitButton.parentNode.insertBefore(overrideCheckbox, submitButton.nextSibling);
submitButton.parentNode.insertBefore(overrideLabel, submitButton.nextSibling);
// We rely on polling mainly (because these event listeners won't find non user based changes, e.g. using PTPImg button to auto-change it for you). But this is nice to be "instant" if user pastes it.
imageInput.addEventListener('input', setButtonState);
imageInput.addEventListener('change', setButtonState);
// Add force-check button (optional, remove if not needed on edit page)
const forceBtn = document.createElement('button');
forceBtn.innerText = 'Force Check All Image URLs';
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();
}, 500);
})();