DailyIndieGame Tool

try to take over the world!

目前为 2017-04-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         DailyIndieGame Tool
// @namespace    http://tampermonkey.net/
// @version      1.4.0
// @description  try to take over the world!
// @icon         http://www.dailyindiegame.com/dailyindiegame.png
// @author       Bisumaruko
// @include      http*://*dailyindiegame.com/account_digstore.html
// @include      http*://*dailyindiegame.com/account_trades.html
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

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

    var style = document.createElement('style');

    style.type = 'text/css';
    style.innerHTML = `
        .DIGTool_checkbox {
            display: none;
        }
        .DIGTool_checked {
            background-color: #222; !important
        }
    `;
    document.head.appendChild(style);

    var target = $('#form3').closest('tr').firstElementChild,
        DIGTool = document.createElement('div'),
        buttonSelectAll = document.createElement('button'),
        buttonPurchase = document.createElement('button');

    buttonPurchase.textContent = 'Purchase';
    buttonPurchase.classList.add('DIG3_Orange_15_Form');
    buttonPurchase.addEventListener('click', function () {
        var purchase = async function () {
            let list = $$('.DIGTool_checkbox:checked'),
                headers = new Headers(),
                bought = 0,
                balance = parseInt($('a[href^="account_transac"]').closest('div').textContent.slice(12)) || 0;
    
            headers.append('Content-Type', 'application/x-www-form-urlencoded');
            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) {
                    msg.alert('Not enough DIG points');
                    break;
                }
    
                let url = '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 (location.href.includes('account_trades')) {
                    url = 'account_buytrade_' + id + '.html';
                    init.body = 'gameid=' + id + '&send=Purchase';
                    init.referrer = location.origin + '/account_buytrade_' + id + '.html';
                }
    
                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';
        };

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

    buttonSelectAll.textContent = 'Select All';
    buttonSelectAll.classList.add('DIG3_Orange_15_Form');
    buttonSelectAll.addEventListener('click', function () {
        let checkboxes = $$('.DIGTool_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';
    });

    DIGTool.appendChild(buttonPurchase);
    DIGTool.appendChild(buttonSelectAll);

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

    target.appendChild(DIGTool);

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

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

        checkbox.type = 'checkbox';
        checkbox.classList.add('DIGTool_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('DIGTool_checked');
            else row.classList.remove('DIGTool_checked');
        });

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

    var msg = {
        box: null,
        init() {
            var 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);

            var 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();

})();