DailyIndieGame Tool

Add handy features to DailyIndieGame

// ==UserScript==
// @name         DailyIndieGame Tool
// @namespace    http://tampermonkey.net/
// @version      2.1.1
// @description  Add handy features to DailyIndieGame
// @icon         http://www.dailyindiegame.com/dailyindiegame.png
// @author       Bisumaruko
// @include      http*://*dailyindiegame.com/*
// @grant        GM_openInTab
// ==/UserScript==

// notify users newer version script available
if (confirm("[DailyIndieGame Tool] This script is no longer maintained, please click yes to install the upgraded version of this script\n[DailyIndieGame Tool] 此腳本已不再維護,請點擊確認安裝此腳本的升級版本")) {
    GM_openInTab('https://greasyfork.org/scripts/32865-steam-bundle-sites-extension/code/Steam%20Bundle%20Sites%20Extension.user.js');
}

(function() {
    'use strict';

    const pathname = location.pathname;

    var $ = selector => document.querySelector(selector),
        $$ = selector => Array.from(document.querySelectorAll(selector));

    if (pathname.includes('/account_page')) {
        let style = document.createElement('style');

        style.type = 'text/css';
        style.innerHTML = `
            .DIGRetrive {
                padding: 5px;
                box-sizing: border-box;
                border: 1px solid #424242;
            }
            .DIGRetrive > textarea {
                width: 100%;
                height: 150px;
                box-sizing: border-box;
                resize: none;
            }
            .DIGRetrive > div {
                padding-top: 5px;
            }
            .DIGRetrive button {
                width: 130px;
                height: 25px;
                margin-right: 10px;
                border: none;
                background-color: #FD5E0F;
                color: rgb(49, 49, 49);
                font-family: Ropa Sans;
                font-size: 15px;
                font-weight: 600;
                outline: none;
                cursor: pointer;
            }
            .DIGRetrive label {
                margin-right: 10px;
            }
        `;

        document.head.appendChild(style);

        let DIGRetrive = document.createElement('div');

        DIGRetrive.className = 'DIGRetrive';
        DIGRetrive.innerHTML = `
            <textarea></textarea>
            <div>
                <button class="DIGButtonRetrieve">Retrieve</button>
                <button class="DIGButtonCopy">Copy</button>
                <button class="DIGButtonReset">Reset</button>
                <label><input type="checkbox" class="DIGCheckboxTitle">Include Game Title</label>
                <label><input type="checkbox" class="DIGCheckboxJoin">Join Keys</label>
            </div>
        `;

        $('#TableKeys').parentNode.insertBefore(DIGRetrive, $('#TableKeys'));

        $('.DIGButtonRetrieve').addEventListener('click', () => {
            let keys = [],
                trs = $$('#TableKeys tr'),
                separator = $('.DIGCheckboxJoin').checked ? ',' : "\n";

            for (let tr of trs) {
                let tds = tr.querySelectorAll('td'),
                    title = tds[2].textContent.trim(),
                    key = tds[4].textContent.trim();

                if (!key.includes('-')) continue;
                if ($('.DIGCheckboxTitle').checked) key = title + ', ' + key;
                keys.push(key);
            }

            $('.DIGRetrive > textarea').textContent = keys.join(separator);
        });

        $('.DIGButtonCopy').addEventListener('click', () => {
            $('.DIGRetrive > textarea').select();
    		document.execCommand('copy');
        });

        $('.DIGButtonReset').addEventListener('click', () => {
            $('.DIGRetrive > textarea').textContent = '';
        });
    }

    if (pathname === '/account_digstore.html' || pathname === '/account_trades.html') {
        let style = document.createElement('style');

        style.type = 'text/css';
        style.innerHTML = `
            .DIGEasyBuy button {
                padding: 4px 8px;
                outline: none;
            }
            .DIGEasyBuy_checkbox {
                display: none;
            }
            .DIGEasyBuy_checked {
                background-color: #222; !important
            }
        `;

        document.head.appendChild(style);

        let target = $('#form3').closest('tr').firstElementChild,
            DIGEasyBuy = document.createElement('div');

        DIGEasyBuy.className = 'DIGEasyBuy';
        DIGEasyBuy.innerHTML = `
            <button class="DIGButtonPurchase DIG3_Orange_15_Form">Purchase</button>
            <button class="DIGButtonSelectAll DIG3_Orange_15_Form">Select All</button>
        `;

        while (target.lastChild) {
            target.removeChild(target.lastChild);
        }

        target.appendChild(DIGEasyBuy);

        $('.DIGButtonPurchase').addEventListener('click', function () {
            let purchase = async function () {
                let button = $('.DIGButtonPurchase'),
                    list = $$('.DIGEasyBuy_checkbox:checked'),
                    headers = new Headers(),
                    bought = 0,
                    balance = parseFloat($('a[href^="account_transac"]').parent('div').text().slice(19)) || 0;

                button.disabled = true;
                button.textContent = 'Purchasing...';

                headers.append('Content-Type', 'application/x-www-form-urlencoded');

                console.log('Start purchasing, initial balance: ' + balance + ' DIG points');

                for (let item of list) {
                    let id = parseInt(item.dataset.id),
                        price = parseInt(item.dataset.price),
                        res;

                    if (!id || isNaN(price)) continue;
                    if (balance - price < 0) {
                        console.log('Current balance: ' + balance + ', game price: ' + price);
                        msg.alert('Not enough DIG points');
                        break;
                    }

                    let url = location.origin + '/account_buy.html',
                        init = {
                            method: 'POST',
                            headers: headers,
                            body: 'quantity=1&xgameid=' + id + '&xgameprice1=' + price + '&send=Purchase',
                            mode: 'same-origin',
                            credentials: 'same-origin',
                            cache: 'no-store',
                            referrer: location.origin + '/account_buy_' + id + '.html'
                        };

                    if (pathname === '/account_trades.html') {
                        url = location.origin + '/account_buytrade_' + id + '.html';
                        init.body = 'gameid=' + id + '&send=Purchase';
                        init.referrer = url;
                    }

                    try {
                        res = await fetch(url, init);

                        if (res.ok) {
                            item.click();
                            bought++;
                            balance -= price;
                        } else msg.alert('Purchase failed, server responded an error');
                    } catch (e) {
                        console.log(e);
                        msg.alert('An error occured while making purchase request');
                    }
                }

                if (bought) window.location = location.origin + '/account_page.html';
                else {
                    button.disabled = false;
                    button.textContent = 'Purchase';
                }
            };

            try {
                purchase();
            } catch (e) {
                console.log(e);
                msg.alert('An error occured while preparing pruchase');
            }
        });

        $('.DIGButtonSelectAll').addEventListener('click', function () {
            let checkboxes = $$('.DIGEasyBuy_checkbox');

            for (let checkbox of checkboxes) {
                if (this.textContent === 'Select All' && !checkbox.checked) checkbox.click();
                if (this.textContent === 'Cancel' && checkbox.checked) checkbox.click();
            }
            this.textContent = this.textContent === 'Select All' ? 'Cancel' : 'Select All';
        });

        let games = $$('a[href^="account_buy"]');

        for (let game of games) {
            let row = game.closest('tr'),
                checkbox = document.createElement('input');

            checkbox.type = 'checkbox';
            checkbox.className = 'DIGEasyBuy_checkbox';
            checkbox.dataset.id = game.href.replace(/\D/g,'');
            checkbox.dataset.price = parseInt(game.closest('td').previousElementSibling.textContent) || 0;
            checkbox.addEventListener('change', function () {
                let row = this.closest('tr');

                if (this.checked) row.classList.add('DIGEasyBuy_checked');
                else row.classList.remove('DIGEasyBuy_checked');
            });

            row.firstElementChild.appendChild(checkbox);
            row.addEventListener('click', function () {
                this.querySelector('input[type="checkbox"]').click();
            });
        }
    }

    var msg = {
        box: null,
        init() {
            let style = document.createElement('style');

            style.type = 'text/css';
            style.innerHTML = `
                .DIGTool_msg {
                    display: none;
                    position: fixed;
                    top: 50%;
                    left: 50%;
                    transform: translate(-50%, -50%);
                    padding: 10px 20px;
                    border: 1px solid #424242;
                    background-color: rgb(32, 32, 32);
                    color: #FFF;
                    font-size: larger;
                }
                .DIGTool_msg-show {
                    display: block;
                }
            `;
            document.head.appendChild(style);

            let DIGTool_msg = document.createElement('div');

            DIGTool_msg.classList.add('DIGTool_msg');
            document.body.appendChild(DIGTool_msg);
            this.box = DIGTool_msg;
        },
        alert(text) {
            this.box.textContent = text;
            this.box.classList.add('DIGTool_msg-show');
            setTimeout(this.hide.bind(this), 3000);
        },
        hide() {
            this.box.classList.remove('DIGTool_msg-show');
        }
    };

    msg.init();

})();