Greasy Fork

Greasy Fork is available in English.

DailyIndieGame Tool

Add handy features to DailyIndieGame

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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('http://greasyfork.icu/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();

})();