Query when the discounts expired
// ==UserScript== // @name:zh-CN Steam折扣截止日期查询 // @name Steam_Discount_Query // @namespace https://blog.chrxw.com // @supportURL https://blog.chrxw.com/scripts.html // @contributionURL https://afdian.com/@chr233 // @version 1.5 // @description:zh-CN 查询折扣截止日期 // @description Query when the discounts expired // @author Chr_ // @match https://store.steampowered.com/wishlist/* // @license AGPL-3.0 // @icon https://blog.chrxw.com/favicon.ico // @grant GM_addStyle // ==/UserScript== (async () => { "use strict"; const g_cache = {}; //初始化 const t = setInterval(() => { for (let ele of document.querySelectorAll("div.Panel div[data-index]")) { addQueryButton(ele); } }, 1000); const matchAppId = /app\/(\d+)/; //添加按钮 function addQueryButton(element) { const oldBtn = element.querySelector("button.sdq_listbtns"); if (oldBtn) { return; } const href = element.querySelector("a")?.getAttribute("href"); const match = href.match(matchAppId); if (!match) { return; } const appId = match[1]; const btn = document.createElement("button"); btn.addEventListener( "click", (e) => { displaySaleEnds(appId, btn); e.preventDefault(); }, false ); btn.className = "sdq_listbtns"; btn.textContent = g_cache[appId] ?? "🔍"; if (btn.textContent.search(":") !== -1) { btn.className += " sdq_listbtns_alert"; } var inner = element.querySelector("div>div"); inner.appendChild(btn); } //显示折扣结束时间 async function displaySaleEnds(appId, ele) { ele.enabled = false; ele.className += " sdq_listbtns_show"; ele.textContent = "🔍……"; fetchSaleEnds(appId) .then((endDate) => { ele.textContent = endDate; g_cache[appId] = endDate; if (endDate.search(":") !== -1) { ele.className += " sdq_listbtns_alert"; } }) .catch((err) => { let done = showAlert("网络错误", `<p>${err}</p>`, false); setTimeout(() => { done.Dismiss(); }, 2000); dialog.Dismiss(); }) .finally(() => { ele.enabled = true; }); } //读取折扣结束时间 function fetchSaleEnds(appId) { const regSaleEnds = new RegExp( /<p class="game_purchase_discount_countdown">(.+)<\/p>/, "" ); const regDate = new RegExp(/\d+ 月 \d+ 日/, ""); const regTimestamp = new RegExp( /InitDailyDealTimer\( \$DiscountCountdown, (\d+) \);/, "" ); return new Promise((resolve, reject) => { fetch(`https://store.steampowered.com/app/${appId}/?lang=schinese`, { method: "GET", credentials: "include", }) .then(async (response) => { if (response.ok) { const html = await response.text(); const saleEnds = html.match(regSaleEnds)?.pop(); let endDate; if (saleEnds) { endDate = saleEnds.match(regDate)?.pop(); if (!endDate) { const endsTimestamp = html.match(regTimestamp)?.pop(); const timestamp = parseInt(endsTimestamp) * 1000; const date = new Date(timestamp); if (date.getDate() === date.getDate()) { endDate = `${date.getMonth() + 1 } 月 ${date.getDate()} 日 ${date .getHours() .toString() .padStart(2, "0")}:${date .getMinutes() .toString() .padStart(2, "0")}`; } else { endDate = "解析失败"; } } } else { endDate = "未打折"; } console.info(endDate); resolve(endDate); } else { resolve("请求失败"); } }) .catch((err) => { reject(err); }); }); } //显示提示 function showAlert(title, text, succ = true) { return ShowAlertDialog(`${succ ? "✅" : "❌"}${title}`, text); } })(); GM_addStyle(` button.sdq_listbtns { position: absolute; z-index: 100; padding: 1px; right: 20px; top: 20px; } div.wishlist_row > button.sdq_listbtns { top: 35%; right: 33%; position: absolute; } button.sdq_listbtns_show, div.wishlist_row:hover button.sdq_listbtns { display: flex; } button.sdq_listbtns_alert { color: red; } `);