Greasy Fork

GGn PTPImg Enforcer

Disable submit unless images use ptpimg.me and album_desc has proper format.

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

// ==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);
})();