优化回收流程
// ==UserScript== // @name:zh-CN DIG批量回收 // @name Fast_Trade_In // @namespace https://blog.chrxw.com // @supportURL https://blog.chrxw.com/scripts.html // @contributionURL https://afdian.com/@chr233 // @version 1.2 // @description 优化回收流程 // @description:zh-CN 添加删除按钮 // @author Chr_ // @include https://www.dailyindiegame.com/account_*.html // @license AGPL-3.0 // @icon https://blog.chrxw.com/favicon.ico // @grant GM_addStyle // ==/UserScript== // 初始化 (() => { "use strict"; initPanel(); function initPanel() { function genChk(name, title, checked = false) { const l = document.createElement("label"); const i = document.createElement("input"); const s = document.createElement("span"); s.textContent = name; i.title = title; i.type = "checkbox"; i.checked = checked; l.title = title; l.className = "fti_chk"; l.appendChild(i); l.appendChild(s); return [l, i]; } function genBtn(text, title, onclick) { let btn = document.createElement("button"); btn.textContent = text; btn.title = title; btn.className = "fti_btn"; btn.addEventListener("click", onclick); return btn; } const [lblAlert, chkAlert] = genChk("直接回收", "回收前是否弹出提示框", false); const btnAllTradeIn = genBtn("全部回收", "回收所有选中的游戏", doTradeIn); const tradeInLinks = document.querySelectorAll("a[href^='account_buyback']"); for (let link of tradeInLinks) { const href = link.href; link.href = "#"; link.data = href; link.addEventListener("click", async (e) => { e.preventDefault(); if (!chkAlert.checked && !confirm("确定要回收吗?")) { return; } const r###lt = await makeTradeIn(href); if (r###lt === 200) { link.style.textDecoration = "line-through"; link.disabled = true; } }); } async function doTradeIn() { if (!chkAlert.checked && !confirm("确定要回收吗?")) { return; } for (let link of tradeInLinks) { if (link.disabled) { continue; } const r###lt = await makeTradeIn(link.data); if (r###lt === 200) { link.style.textDecoration = "line-through"; link.disabled = true; } } } if (tradeInLinks.length > 0) { document.body.appendChild(lblAlert); document.body.appendChild(btnAllTradeIn); } } function makeTradeIn(url) { return new Promise((resolve, reject) => { fetch(url, { method: "POST", credentials: "include", data: "send=Trade KEY", }) .then(async (response) => { if (response.ok) { const text = await response.text(); resolve(200); } else { resolve(response.status); } }) .catch((err) => { console.error(err); resolve(-1); }); }); } })(); GM_addStyle(` .fti_chk { color: orange; } `);