GGn Upload Blocker Manager

The "library" version of upload blocker. Import this with @require and use the APIs to standardize blocking uploads in GGn.

Versione datata 25/04/2025. Vedi la nuova versione l'ultima versione.

Questo script non dovrebbe essere installato direttamente. È una libreria per altri script da includere con la chiave // @require https://update.greatest.deepsurf.us/scripts/533781/1577273/GGn%20Upload%20Blocker%20Manager.js

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         GGn Upload Blocker Manager
// @namespace    https://greatest.deepsurf.us/users/1395131
// @version      1.0.2
// @author       SleepingGiant
// @description  The "library" version of upload blocker. Import this with @require and use the APIs to standardize blocking uploads in GGn.
// @match        https://gazellegames.net/*
// @grant        none
// ==/UserScript==
// @export UploadBlockerManager

(function (global) {
  'use strict';
  const reasonListId = 'ggn-block-reasons';

  class UploadBlockerManager {
    constructor(submitButton) {
      this.submitButton = submitButton;
      this.originalText = submitButton.value;
      this.reasonContainer = this._ensureReasonList();
    }

    _ensureReasonList() {
      let ul = document.getElementById(reasonListId);
      if (!ul) {
        ul = document.createElement('ul');
        ul.id = reasonListId;
        ul.style.marginTop = '0.5em';
        ul.style.color = 'red';
        ul.style.listStyleType = 'none';
        this.submitButton.parentNode.insertBefore(ul, this.submitButton.nextSibling);
      }
      return ul;
    }

    addReason(text) {
      if (!this._hasReason(text)) {
        const li = document.createElement('li');
        li.textContent = text;
        this.reasonContainer.appendChild(li);
      }
      this._updateButtonState();
    }

    removeReason(text) {
      for (const li of Array.from(this.reasonContainer.children)) {
        if (li.textContent === text) {
          li.remove();
          break;
        }
      }
      this._updateButtonState();
    }

    _hasReason(text) {
      return Array.from(this.reasonContainer.children)
        .some(li => li.textContent === text);
    }

    _updateButtonState() {
      const hasBlockers = this.reasonContainer.children.length > 0;
      const override = document.querySelector('#upload-blocker-override')?.checked;

      if (hasBlockers && !override) {
        this.submitButton.disabled = true;
        this.submitButton.style.opacity = '0.5';
        this.submitButton.style.pointerEvents = 'none';
        this.submitButton.value = 'Uploading Blocked';
      } else {
        this.submitButton.disabled = false;
        this.submitButton.style.opacity = '1';
        this.submitButton.style.pointerEvents = 'auto';
        this.submitButton.value = this.originalText;
      }
    }

    attachOverrideCheckbox() {
      if (!document.getElementById('upload-blocker-override')) {
        const cb = document.createElement('input');
        cb.type = 'checkbox';
        cb.id = 'upload-blocker-override';
        cb.style.marginLeft = '0.5em';
        cb.addEventListener('change', () => this._updateButtonState());

        const label = document.createElement('label');
        label.htmlFor = cb.id;
        label.textContent = ' Override blockers';
        label.style.marginLeft = '0.25em';

        this.submitButton.parentNode.insertBefore(cb, this.submitButton.nextSibling);
        this.submitButton.parentNode.insertBefore(label, cb.nextSibling);
      }
    }

  }

  // Export into global so other scripts can import it
  global.UploadBlockerManager = UploadBlockerManager;

})(window);