Bundle Key Lister

Show a list of the steam keys

// ==UserScript==
// @name         Bundle Key Lister
// @namespace    https://greasyfork.org/de/scripts/394604-bundle-key-lister
// @version      0.3
// @description  Show a list of the steam keys
// @author       Guitar Hero
// @grant        none
// @match        https://www.humblebundle.com/downloads*
// ==/UserScript==

(function() {
    'use strict';

	function insertBefore(el, referenceNode) {
		referenceNode.parentNode.insertBefore(el, referenceNode);
	}

	function getKeyList() {
		var keyList = '';
		document.querySelectorAll('.key-redeemer').forEach(function(item){
			keyList += "<br>" + item.querySelector('.heading-text').innerText.trim() + ": ";
            var keyField = item.querySelector('.keyfield.redeemed .keyfield-value');
            if (keyField == null || keyField.innerText == null) {
				keyList += "N/A";
                return;
			}
			keyList += keyField.innerText.trim();
		});
		return keyList;
	}

	function generateBox() {
		var keyBox = document.querySelector(".key-container").parentElement;

		var captionBox = document.createElement("div");
		captionBox.setAttribute("class", "wrapper");
		captionBox.innerHTML = "<h3 style='font-size:2em; font-weight:bold; text-transform:uppercase;'>Steam Key Summary</h3>";

		var keyListBox = document.createElement("div");
		keyListBox.setAttribute("class", "wrapper");
		keyListBox.innerHTML = "LOADING...";
		keyListBox.setAttribute("id", "key-list-box");
		keyListBox.setAttribute("style", "font-weight:bold;");

        var buttonBox = document.createElement("div");
		buttonBox.setAttribute("class", "wrapper");
        buttonBox.setAttribute("style", "margin-top:50px; text-align: center;");
		buttonBox.innerHTML = "<button class='bundleKeyListerButtonRevealAll' style='font-size:1.5em; font-weight:bold; padding: 10px 40px;'>Reveal ALL keys!<br/>(Warning: Use at your own risk)</button>";

		var outerBox = document.createElement("div");
		outerBox.setAttribute("class", "whitebox-redux small");
        outerBox.insertAdjacentElement("afterbegin", buttonBox);
		outerBox.insertAdjacentElement("afterbegin", keyListBox);
		outerBox.insertAdjacentElement("afterbegin", captionBox);

		insertBefore(outerBox, keyBox);
	}

	function setKeyListToBox() {
		console.log("KEY BOX length? "+(document.querySelectorAll('.key-redeemer').length));
		if (document.querySelectorAll('.key-redeemer').length == 0) {
			setTimeout(setKeyListToBox, 2000);
			return;
		}
		document.querySelector("#key-list-box").innerHTML = getKeyList();
	}

    function addRevealButtonListener() {
        document.querySelector(".bundleKeyListerButtonRevealAll").addEventListener('click', ()=> {
            console.log("Clicked: reveal ALL keys!");
            if (!confirm("Are you sure you want to reveal ALL keys?")) {
                return;
            }
            document.querySelectorAll('.key-container .keyfield:not(.redeemed) .keyfield-value').forEach(keyButton => {
                console.log(keyButton);
                keyButton.click();
            });
            document.querySelector("#key-list-box").innerHTML = "LOADING...";
            setTimeout(setKeyListToBox, 5000);
        });
    }

	generateBox();
	setKeyListToBox();
    addRevealButtonListener();

})();