您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Display images of selected languages on store search steam page.
当前为
// ==UserScript== // @name Steam | Display game languages // @name:uk Steam | Відобразити мови гри // @namespace http://tampermonkey.net/ // @version 06.06.2024 // @description Display images of selected languages on store search steam page. // @description:uk Виводить обрані мови (svg картинка) на сторінці пошуку ігор в steam. // @author Black_Yuzia // @match https://store.steampowered.com/search* // @match https://store.steampowered.com/charts/* // @icon https://store.steampowered.com/favicon.ico // @grant GM_addStyle // @grant GM.xmlHttpRequest // @grant GM.getValue // @grant GM.setValue // @grant GM.registerMenuCommand // @grant GM.notification // @run-at document-end // @license CC BY-NC-ND 4.0 // @license-url https://creativecommons.org/licenses/by-nc-nd/4.0/ // @compatible firefox // @compatible chrome // @compatible opera // @compatible safari // @compatible edge // @connect localhost:1500 // @connect tm.starserv.net // ==/UserScript== (() => { // src/index.ts (async function() { "use strict"; GM_addStyle(` .mr-2 { margin-right: 2px } `); const languages = await initLanguages(); await registerMenuCommands(); const leftcol = document.querySelector(".leftcol"); const charts = waitForElement("div[class*=steamchartsshell_SteamChartsShell]"); if (leftcol) { await proceedStoreGames(); const searchObserver = new MutationObserver(proceedStoreGames); searchObserver.observe(leftcol, { childList: true, subtree: true }); } if (await charts) { await proceedChartsGames(); const chartsObserver = new MutationObserver(proceedChartsGames); chartsObserver.observe(await charts, { childList: true, subtree: true }); } async function proceedStoreGames() { const games = [...document.querySelectorAll(".search_result_row:not(.sld_process)")]; for (const game of games) { game.className += " sld_process"; } if (games.length > 0) { const ids = games.map(parseGameID); const res = await GM.xmlHttpRequest({ // @ts-expect-error url: `${"https://tm.starserv.net"}/steam/games/lang?id=${ids.join(",")}`, method: "GET", responseType: "json", fetch: true }); if (res.status === 200) { const { response } = res; for (let i = 0; i < response.length; i++) { const items = response[i]; if (items.length > 0) { for (const lang of languages) { if (items.includes(lang)) { const game = games[i]; const img = document.createElement("img"); img.height = 20; img.width = 20; img.className = "mr-2"; img.src = `https://fastdl.starserv.net/languages/${lang}@2x.svg`; game.querySelector(".platform_img")?.parentElement.prepend(img); } } } } } } } async function proceedChartsGames() { const games = [...document.querySelectorAll("tr[class*=weeklytopsellers_TableRow]:not(.sld_process)")]; for (const game of games) { game.className += " sld_process"; } if (games.length > 0) { const ids = games.map((game) => parseGameID(game.querySelector("a"))); const res = await GM.xmlHttpRequest({ // @ts-expect-error url: `${"https://tm.starserv.net"}/steam/games/lang?id=${ids.join(",")}`, method: "GET", responseType: "json", fetch: true }); if (res.status === 200) { const { response } = res; for (let i = 0; i < response.length; i++) { const items = response[i]; if (items.length > 0) { for (const lang of languages) { if (items.includes(lang)) { const game = games[i]; const img = document.createElement("img"); img.height = 20; img.width = 20; img.className = "mr-2"; img.src = `https://fastdl.starserv.net/languages/${lang}@2x.svg`; game.querySelector("div[class*=weeklytopsellers_GameName]")?.prepend(img); } } } } } } } })(); function parseGameID(e) { const [id] = e?.href?.match(/\d+/) || []; return id; } async function initLanguages() { const notification = await GM.getValue("notification", false); const languages = await GM.getValue("languages", ["ukrainian", "russian"]); console.log("lang", languages); if (!notification) { GM.notification("Please choose languages in menu! Default lang: 'Ukrainian,\u0279ussian'", "Warning"); } return languages.reverse(); } async function registerMenuCommands() { await GM.registerMenuCommand("Set Languages", async () => { const languages = prompt("Set language(s) [example: Ukrainian,English,\u0279ussian]"); if (languages) { await GM.setValue("notification", true); await GM.setValue("languages", languages.split(",").map((v) => v.trim().toLowerCase())); } }); } function waitForElement(selector) { return new Promise((resolve) => { if (document.querySelector(selector)) { return resolve(document.querySelector(selector)); } const observer = new MutationObserver(() => { if (document.querySelector(selector)) { observer.disconnect(); resolve(document.querySelector(selector)); } }); observer.observe(document.body, { childList: true, subtree: true }); setTimeout(() => { resolve(null); }, 3e4); }); } })();