您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Create request presets, set defaults and easily duplicate requests in the alternate currency
// ==UserScript== // @name GGn request presets // @namespace none // @version 3 // @description Create request presets, set defaults and easily duplicate requests in the alternate currency // @author ingts // @match https://gazellegames.net/requests.php // @match https://gazellegames.net/requests.php?action=new* // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // ==/UserScript== if (typeof GM_getValue('api_key') === 'undefined') GM_setValue('api_key', '') const category = document.getElementById('categories') const hasid = location.href.includes('groupid') const ulrequest = location.href.includes('upload') let elements = {} let checkboxGroups = [] function getElements(type = category.value) { if (hasid) { elements = { title: document.querySelector('input[name=title]'), description: document.querySelector('textarea[name=description]'), bounty: document.getElementById('amount_box') } if (type === 'Games') { Object.assign(elements, { releasetypes: document.querySelectorAll('#releasetypes_tr input[type=checkbox]'), languages: document.querySelectorAll('#languages_tr input[type=checkbox]'), regions: document.querySelectorAll('#regions_tr input[type=checkbox]') }) checkboxGroups = ['releasetypes', 'languages', 'regions'] } else if (type === 'OST') { Object.assign(elements, { formats: document.querySelectorAll('#formats_tr input[type=checkbox]'), bitrates: document.querySelectorAll('#bitrates_tr input[type=checkbox]') }) checkboxGroups = ['formats', 'bitrates'] } } else { elements = { type: category, tags: document.querySelector('input[name=tags]'), title: document.querySelector('input[name=title]'), image: document.querySelector('input[name=image]'), description: document.querySelector('textarea[name=description]'), bounty: document.getElementById('amount_box') } if (type === 'Games') { Object.assign(elements, { platform: document.getElementById('platform'), year: document.querySelector('input[name=year]'), releasetypes: document.querySelectorAll('#releasetypes_tr input[type=checkbox]'), languages: document.querySelectorAll('#languages_tr input[type=checkbox]'), regions: document.querySelectorAll('#regions_tr input[type=checkbox]') }) checkboxGroups = ['releasetypes', 'languages', 'regions'] } else if (type === 'OST') { Object.assign(elements, { year: document.querySelector('input[name=year]'), formats: document.querySelectorAll('#formats_tr input[type=checkbox]'), bitrates: document.querySelectorAll('#bitrates_tr input[type=checkbox]') }) checkboxGroups = ['formats', 'bitrates'] } if (ulrequest) Object.assign(elements, {unit: document.getElementById('current_unit')}) } } function save() { let saved = {} getElements() Object.keys(elements).forEach(key => { const element = elements[key] if (checkboxGroups.includes(key)) { saved[key] = Array.from(element).filter(c => c.checked).map(c => c.value) } else { saved[key] = element.value } }) return saved } function load(obj) { getElements(obj.type) for (const [key, val] of Object.entries(elements)) { if (hasid && key === 'title') { val.value = val.value + obj[key] continue } if (checkboxGroups.includes(key)) { val.forEach(c => { c.checked = c.value !== 'on' && obj[key].includes(c.value) }) } else val.value = obj[key] } category.dispatchEvent(new Event('change')) } const currency = location.href.includes('gold') || hasid ? 'GB' : 'Gold' if (GM_getValue('d')) { const duplicate = GM_getValue('duplicate') const groupid = GM_getValue('groupid') load(duplicate) elements.description.value += `\n\n${currency} request: https://gazellegames.net/requests.php?action=view&id=${GM_getValue('currentID') + 1}\n${groupid ? 'Group: https://gazellegames.net/torrents.php?id=' + groupid : ''}` if (location.href.includes('gold')) /* converting from gb */ { if (duplicate.unit === 'mb') elements.bounty.value = Math.ceil(duplicate.bounty / 2.048) if (duplicate.unit === 'gb') elements.bounty.value = Math.ceil(duplicate.bounty * 500) } else { elements.bounty.value = Math.ceil(duplicate.bounty * 2.048) elements.unit.value = 'mb' } GM_deleteValue('d') GM_deleteValue('duplicate') GM_deleteValue('currentID') if (groupid) GM_deleteValue('groupid') } else { let presets = GM_getValue('presets', {}) let deflt = GM_getValue('default') if (deflt) load(deflt) const end = document.querySelector("#request_form > table > tbody > tr:nth-child(16) > td > p") document.querySelector("#request_form > table > tbody > tr:nth-child(1)").insertAdjacentHTML('afterend', ` <tr> <td class="label">Presets</td> <td> <select id="presets" style="border: #44ff8d 1px dotted;"> <option></option> </select> <button type="button" id="deletepreset" class="hidden" style="background-color: red;;">Delete preset</button> </td> </tr>`) end.insertAdjacentHTML('afterend', ` <button type="button" id="duplicate">Make ${currency} request</button>`) const duplicatebtn = document.getElementById('duplicate') const presetselect = document.getElementById('presets') const deletepreset = document.getElementById('deletepreset') duplicatebtn.addEventListener('click', () => { GM_setValue('duplicate', save()) if (GM_getValue('api_key')) { let currentID fetch('https://gazellegames.net/api.php?request=search&search_type=requests', {headers: {'X-API-Key': GM_getValue('api_key')}}) .then(r => r.json()).then(reqs => { const keys = Object.keys(reqs.response) currentID = parseInt(keys[24]) GM_setValue('currentID', currentID) elements.description.value += `\n\n${currency} request: https://gazellegames.net/requests.php?action=view&id=${currentID + 2}` }) } GM_setValue('d', 1) if (hasid) GM_setValue('groupid', new URL(location.href).searchParams.get('groupid')) hasid ? window.open(`https://gazellegames.net/requests.php?action=new&request_currency=upload`, '_blank') : window.open(`https://gazellegames.net/requests.php?action=new&request_currency=${location.href.includes('gold') ? 'upload' : 'gold'}`, '_blank') }) Object.keys(presets).forEach(name => { let option = document.createElement('option') option.textContent = name option.value = name presetselect.append(option) }) presetselect.addEventListener('change', ev => { if (presetselect.value) { deletepreset.classList.remove('hidden') load(presets[presetselect.value]) } else { deletepreset.classList.add('hidden') document.getElementById('request_form').reset() } }) deletepreset.addEventListener('click', () => { delete presets[presetselect.value] presetselect.querySelector(`option[value="${presetselect.value}"]`).remove() presetselect.selectedIndex = 0 presetselect.dispatchEvent(new Event('change')) GM_setValue('presets', presets) }) if (!hasid) { duplicatebtn.insertAdjacentHTML('afterend', ` <button type="button" id="setdefault">${deflt ? 'Remove default' : 'Set as default'}</button> <button type="button" id="savepreset">Save preset</button> <input type="text" id="nameinput" style="margin-left: 10px;" class="hidden" placeholder="Name (required)"> `) const nameinput = document.getElementById('nameinput') const setdefault = document.getElementById('setdefault') document.getElementById('savepreset').addEventListener("click", () => { nameinput.classList.toggle('hidden') nameinput.focus() }) nameinput.addEventListener('keydown', ev => { if (ev.key === 'Enter') { ev.preventDefault() if (nameinput.value) { presets[nameinput.value] = save() GM_setValue('presets', presets) nameinput.value = 'Saved' nameinput.style.color = 'lightgreen' nameinput.disabled = true setTimeout(() => { nameinput.classList.toggle('hidden') nameinput.disabled = false nameinput.value = '' nameinput.style.removeProperty('color') }, 1500) } } }) setdefault.addEventListener("click", () => { if (GM_getValue('default')) { GM_deleteValue('default') setdefault.disabled = true setdefault.textContent = 'Default removed' setdefault.style.color = 'lightgreen' setTimeout(() => { setdefault.disabled = false setdefault.textContent = 'Set as default' setdefault.style.removeProperty('color') }, 1500) } else { GM_setValue('default', save()) setdefault.disabled = true setdefault.textContent = 'Default saved' setdefault.style.color = 'lightgreen' setTimeout(() => { setdefault.disabled = false setdefault.textContent = 'Remove default' setdefault.style.removeProperty('color') }, 1500) } }) } }