Greasy Fork

GGn PTPImg Enforcer

Disable submit unless the image URL contains ptpimg.me, with a force check button (in case auto-polling fails)

目前为 2025-04-18 提交的版本。查看 最新版本

// ==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
// ==/UserScript==

(function () {
    'use strict';

    let initialized = false;
    let imageInput, submitButton;
    let originalButtonText = '';

    function isValidImageURL(url) {
        return url.includes('ptpimg.me');
    }

    function setButtonState() {
        // No matter how hard I try to re-use `imageInput` here, it will randomly start failing. Why not just check the raw field again!
        const url = document.querySelector('#image')?.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);
})();