您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
The "library" version of upload blocker. Import this with @require and use the APIs to standardize blocking uploads in GGn.
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyforks.org/scripts/533781/1578387/GGn%20Upload%20Blocker%20Manager.js
// ==UserScript== // @name GGn Upload Blocker Manager // @namespace https://greasyforks.org/users/1395131 // @version 1.1 // @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);