woodcutter-grabber

Grab logs from Dominion Online

As of 2018-05-11. See the latest version.

// ==UserScript==
// @name         woodcutter-grabber
// @namespace    http://tampermonkey.net/
// @version      0.70
// @description  Grab logs from Dominion Online
// @author       ceviri
// @match        https://dominion.games/*
// @grant        GM_xmlhttpRequest
// @grant        GM_setClipboard
// @grant        GM_openInTab
// @require      http://code.jquery.com/jquery-3.3.1.min.js
// @connect      ceviri.me
// @connect      pastebin.com
// ==/UserScript==

var currentlyWaiting;
function wait_until_condition(condition, interval, delayedFunction){
    if (condition()){
        setTimeout(delayedFunction, 500);
    }
    else{
        currentlyWaiting = setTimeout(function(){wait_until_condition(condition, interval, delayedFunction);}, interval);
    }
}

function abort(){
    clearTimeout(currentlyWaiting);
}

WC_grabber = {
    loopclock: function(){
          WC_grabber.timeout = setTimeout(WC_grabber.loopclock, 500);
          WC_grabber.redraw();
    },

    redraw: function(){
        if (angular.element($('table-starter')).controller('tableStarter')){
            if (angular.element($('table-starter')).controller('tableStarter').replayService.shouldShowReplayWindow()) {
                if ($('table-starter .wc-grab-logs').length == 0){
                    var log_grab_button = $('<button class="lobby-button wc-grab-logs" onclick="WC_grabber.setupTable()">Grab Logs</button>');
                    $('table-starter div[class=""]').append(log_grab_button);
                }
            }
        }
        if (angular.element($('my-table')).controller('myTable')){
            if ($('.table-buttons .wc-grab-logs').length == 0){
                var log_grab_button = $('<button class="lobby-button wc-grab-logs" onclick="WC_grabber.askForMultiLogs()">Grab Logs</button>');
                $('table-buttons div.table-buttons').append(log_grab_button);
            }
        }
    },


    grabLogs: function(){
        log = Object.values(angular.element($(".log-container")).controller().log.getBulletedEntries()).map(x=>x.string).join("~");
        x=activeGame.model.gameState.cards.map(x =>LANGUAGE.getCardName[x.cardName.name].singular);
        supply = Array.from(new Set(x)).map( i => i+"-"+x.filter(j=>j==i).length).join("~");

        angular.element($('top-controls')).controller('topControls').getControls()[3].execute();
        angular.element($('game-ended-notification')).controller('gameEndedNotification').ok();
        return [log, supply]
    },


    sendLogs: function(logOne, logTwo, supply, players, gameId){
        datastring = "fileone=" + encodeURIComponent(logOne) + "&filetwo=" + encodeURIComponent(logTwo) +
                     "&supply=" + encodeURIComponent(supply) + "&players="+encodeURIComponent(players);

        GM_xmlhttpRequest({
            method: "POST",
            url: "http://ceviri.me/woodcutter/submit",
            data: datastring,
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            onload: function(response) {
                GM_openInTab("http://ceviri.me/woodcutter/"+gameId+"/display");
            }
        });
    },


    setupTable: function(){
        angular.element($('table-starter')).controller('tableStarter').submitReplay();

        wait_until_condition(function(){return $('.lobby-page').length > 0;}, 100,function(){
            angular.element($('rules-editor')).controller('rulesEditor').addBot();
            thisLog = angular.element($('rules-editor')).controller('rulesEditor').gameId;

            setTimeout(function(){
                angular.element($('order-players')).controller('orderPlayers').playerOrderService.shouldRandomize = false;
                angular.element($('order-players')).controller('orderPlayers').playerOrderService.done();

                WC_grabber.parseReplays([thisLog]);
            }, 1000);
        });
    },


    parseReplays: function(replayList){
        wait_until_condition(function(){return $('.lobby-page').length > 0;}, 100, function(){
            gameId = replayList.pop();
            console.log("Parsing replay #"+gameId);
            console.log("Remaining Queue:");
            console.log(replayList)

            angular.element($('rules-editor')).controller('rulesEditor').gameId = gameId;
            angular.element($('rules-editor')).controller('rulesEditor').decisionIndex = ""
            angular.element($('rules-editor')).controller('rulesEditor').submitReplay();

            playerNames = [];
            for (i=0;i<2;i++){
                playerNames[i] = angular.element($('order-players')).controller('orderPlayers').getOriginalPlayerName(i);
            }
            playerNameString = playerNames.join('~');

            firstPlayer = angular.element($('order-players')).controller('orderPlayers').playerOrderService.getOrderedPlayers()[0].namedId.name;

            wait_until_condition(function(){return angular.element($('order-players')).controller('orderPlayers').playerOrderService.shouldRandomize == false;}, 100, function(){
                unsafeWindow.publicTableService.ready();

                var oldAlert = unsafeWindow.alert;
                unsafeWindow.alert = () => {abort();};
                var oldConfirm = unsafeWindow.confirm;
                unsafeWindow.confirm = () => {return true;};

                wait_until_condition(function(){return $('.base-hero-bar .opponent-name-counter-pane').length > 0;},100,function(){
                    results = WC_grabber.grabLogs();
                    logOne = results[0];
                    supply = results[1];

                    wait_until_condition(function(){return $('score-table-buttons').length > 0;}, 100, function(){
                        angular.element($('score-table-buttons')).controller('scoreTableButtons').editTable();

                        wait_until_condition(function(){return $('.lobby-page').length > 0;}, 100, function(){
                            angular.element(document.querySelector('.window.my-table')).injector().get('playerOrderService').moveDown(0);
                            angular.element(document.querySelector('.window.my-table')).injector().get('playerOrderService').done();

                            wait_until_condition(function(){return angular.element($('order-players')).controller('orderPlayers').playerOrderService.getOrderedPlayers()[0].namedId.name != firstPlayer;}, 100, function(){
                                unsafeWindow.publicTableService.ready();

                                wait_until_condition(function(){return $('.base-hero-bar .opponent-name-counter-pane').length > 0;},100,function(){
                                    results = WC_grabber.grabLogs();
                                    logTwo = results[0];

                                    WC_grabber.sendLogs(logOne, logTwo, supply, playerNameString, gameId);

                                    unsafeWindow.confirm = oldConfirm;
                                    unsafeWindow.alert = oldAlert;
                                    wait_until_condition(function(){return $('score-table-buttons').length > 0;}, 100,function(){
                                        angular.element($('score-table-buttons')).controller('scoreTableButtons').editTable();
                                        if (replayList.length > 0){
                                            WC_grabber.parseReplays(replayList);
                                        } else {
                                            wait_until_condition(function(){return $('.lobby-page').length > 0;}, 100, function(){
                                                angular.element($('my-table')).controller('myTable').leave();
                                            });
                                        }
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    },


    setupMultiParse: function(replayList){
        angular.element($('rules-editor')).controller('rulesEditor').addBot();
        angular.element($('rules-editor')).controller('rulesEditor').replayGame();

        setTimeout(function(){
            angular.element($('order-players')).controller('orderPlayers').playerOrderService.shouldRandomize = false;
            angular.element($('order-players')).controller('orderPlayers').playerOrderService.done();
            WC_grabber.parseReplays(replayList);
        }, 1000);
    },


    askForMultiLogs: function(){
        var rawText = prompt("Enter game IDs, separated with commas. No spaces!");
        WC_grabber.setupMultiParse(rawText.split(","));
    }
}

WC_grabber.loopclock();