Greasy Fork is available in English.
Displays a text area with game titles and keys.
Per
// ==UserScript==
// @name IndieGala Keys to TextArea
// @namespace http://tampermonkey.net/
// @version 0.1.4
// @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';
// 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);
}
// Ignore games which do not have keys revealed
let games = getGames().filter(e => e[1]);
// Format the output as CSV
area.value = games.map(e => e[0]+","+e[1]).join("\n");
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();
})();