Displays a text area with game titles and keys.
当前为
// ==UserScript==
// @name IndieGala Keys to TextArea
// @namespace http://tampermonkey.net/
// @version 0.1.5
// @description Displays a text area with game titles and keys.
// @author Lex
// @match https://www.indiegala.com/library*
// @match https://www.indiegala.com/gift*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// Formats games array to a string to be displayed
// Games is an array [ [title, key], ... ]
function formatGames(games) {
// Ignore games which do not have keys revealed
games = games.filter(e => e[1]);
// Format the output as tab-separated
games = games.map(e => e[0]+"\t"+e[1]);
return games.join("\n");
}
// Return a list of games as an array of [title, key] pairs
function getGames() {
// The active bundle (the rest are all hidden)
const active = document.querySelector("ul.profile-private-page-library-sublist-active");
// Individual items
const es = active.querySelectorAll(".profile-private-page-library-key-cont");
// Take each item element and convert to an array of [title, key] pairs
return Array.prototype.map.call(es, e => {
const title = e.querySelector(".profile-private-page-library-title div").textContent.trim();
const inps = e.getElementsByTagName("input");
const key = (inps.length > 0) ? inps[0].value : "";
return [title, key];
});
}
// Adds a textarea to the bottom of the games listing with all the titles and keys
function injectTextbox() {
console.log("Dumping keys");
// The active bundle (the rest are all hidden)
const active = document.querySelector("ul.profile-private-page-library-sublist-active");
// Find an old textarea on the active bundle
let area = active.querySelector("textarea.igktt");
// otherwise make a new one
if (!area) {
area = document.createElement("textarea");
area.className = "igktt";
active.append(area);
}
let games = getGames();
area.value = formatGames(games);
area.style.width = "100%";
// Adjust the height so all the contents are visible
area.style.height = "";
area.style.height = area.scrollHeight + 20 + "px";
}
/* When a user clicks a different bundle, it takes a while to load
Watches for the load to finish before adding the textarea */
function waitForBundleLoaded() {
const loader = document.querySelector("ul.profile-private-page-library-sublist-active .profile-private-page-library-subitem-loading");
// If the loading indicator both exists and is hidden (no longer needed)
if (loader && loader.style.display == "none") {
injectTextbox();
} else {
setTimeout(waitForBundleLoaded, 100);
}
}
/* Add event listeners to every bundle link for clicks */
function injectLoaders() {
const as = document.querySelectorAll(".profile-private-page-library-list .fit-click");
as.forEach(a => {a.addEventListener("click", waitForBundleLoaded)});
}
injectLoaders();
injectTextbox();
})();