Greasy Fork is available in English.

woodcutter-grabber

Grab logs from Dominion Online

As of 2018-12-30. See the latest version.

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

// Todo: Check in advance if kingdom contains problematic cards.


WC_grabber = {
    shouldDisplay: false,
    currentlyWaiting: null,
    longWait: null,
    oldAlert: null,
    oldConfirm: null,

    wait_until_condition: function(condition, interval, delayedFunction){
        clearTimeout(WC_grabber.currentlyWaiting);
        if (condition()){
            delayedFunction();
        }
        else{
            WC_grabber.currentlyWaiting = setTimeout(function(){WC_grabber.wait_until_condition(condition, interval, delayedFunction);}, interval);
        }
    },
    abort: function () {
        clearTimeout(WC_grabber.currentlyWaiting);
    },

    angular_debug_check: function () {
        if (typeof angular.element(document.body).scope() == 'undefined') {
            angular.reloadWithDebugInfo();
            return false;
        } else {
            return true;
        }
    },

    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);
                }
            }
        }
    },

    tryQuit: function(){
        angular.element(document.body).injector().get('gameServerMessenger').resign();
        angular.element(document.body).injector().get('gameServerConnection').disconnect();
        if (angular.element(document.body).injector().get('gameServerConnection').isAlive()) {
            setTimeout( function(){ WC_grabber.tryQuit();}, 500);
        }
    },


    forceQuit: function(){
        if (!angular.element(document.body).injector().get('game').isRunning() && angular.element(document.body).injector().get('connection').gameIsConnected()){
            angular.element(document.body).injector().get('gameServerConnection').disconnect();
        } else {
            WC_grabber.longWait = setTimeout(WC_grabber.forceQuit, 1000);
        }
    },


    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) {
                if (WC_grabber.shouldDisplay){
                    GM_openInTab("http://ceviri.me/woodcutter/"+gameId+"/display");
                }
            },
        });
    },


    parseReplays: function(replayList){
        if (angular.element(document.body).injector().get('tableService').hasTable()){
            angular.element(document.body).injector().get('tableService').leave();
        }
        gameId = replayList.pop();
        console.log("Parsing replay #"+gameId);
        console.log("Remaining Queue:");
        console.log(replayList)
        angular.element(document.body).injector().get('replayService').startReplayTable(gameId, -1);
        angular.element(document.body).injector().get('log').entries = [];
        WC_grabber.wait_until_condition(function(){return angular.element(document.body).injector().get('tableService').hasTable();}, 100, function(){
            angular.element(document.body).injector().get('tableService').changeRule(new TableRule(TableRuleIds.SPECTATE_RULES, GroupIds.NOBODY, -1));
            playerNames = [];
            for (i=0;i<2;i++){
                playerNames[i] = angular.element($('order-players')).controller('orderPlayers').getOriginalPlayerName(i);
            }
            playerNameString = playerNames.join('~');
            if (angular.element(document.body).injector().get('tableService').getBeings().length < 2){
                angular.element(document.body).injector().get('tableService').addBot();
            }
            WC_grabber.wait_until_condition(function(){return angular.element(document.body).injector().get('tableService').getBeings().length == 2;}, 100, function(){
                gameResult = angular.element(document.body).injector().get('tableService').gameResult;

                angular.element(document.body).injector().get('playerOrderService').shouldRandomize = false;
                angular.element(document.body).injector().get('playerOrderService').done();

                WC_grabber.wait_until_condition(function(){return angular.element(document.body).injector().get('tableService').getRuleValue(TableRuleIds['PLAYER_ORDER'])['players'].length > 0;},100,function(){
                    angular.element(document.body).injector().get('metaServerMessenger').startGameRequest(angular.element(document.body).injector().get('tableService').getTableId(), true);
                    WC_grabber.longWait = setTimeout(WC_grabber.forceQuit, 1000);

                    WC_grabber.wait_until_condition(function(){return angular.element(document.body).injector().get('log').entries.length > 0 ;},100,function(){
                        if (WC_grabber.longWait != null){
                            clearTimeout(WC_grabber.longWait);
                            WC_grabber.longWait = null;
                        }
                        logOne = Object.values(angular.element(document.body).injector().get('log').entries).map(x=>x.string).join("~");
                        x=angular.element(document.body).injector().get('game').state.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(document.body).injector().get('log').entries = [];
                        WC_grabber.tryQuit();

                        WC_grabber.wait_until_condition(function(){return angular.element(document.body).controller().shouldShowScorePage;}, 100, function(){
                            oldFirst = angular.element(document.body).injector().get('tableService').getRuleValue(TableRuleIds['PLAYER_ORDER'])['players'][0]['namedId']['name'];
                            angular.element(document.body).injector().get('playerOrderService').moveDown(0);
                            angular.element(document.body).injector().get('playerOrderService').done();
                            WC_grabber.wait_until_condition(
                                function(){
                                    return angular.element(document.body).injector().get('tableService').getRuleValue(TableRuleIds['PLAYER_ORDER'])['players'][0]['namedId']['name'] != oldFirst;
                                },100,function(){
                                    angular.element(document.body).injector().get('metaServerMessenger').startGameRequest(angular.element(document.body).injector().get('tableService').getTableId(), true);
                                    WC_grabber.longWait = setTimeout(WC_grabber.forceQuit, 1000);

                                    WC_grabber.wait_until_condition(function(){return angular.element(document.body).injector().get('log').entries.length > 0 ;},100,function(){
                                        if (WC_grabber.longWait != null){
                                            clearTimeout(WC_grabber.longWait);
                                            WC_grabber.longWait = null;
                                        }
                                        WC_grabber.tryQuit();
                                        logTwo = Object.values(angular.element(document.body).injector().get('log').entries).map(x=>x.string).join("~");
                                        WC_grabber.wait_until_condition(function(){return angular.element(document.body).controller().shouldShowScorePage;}, 100, function(){
                                            WC_grabber.sendLogs(logOne, logTwo, supply, playerNameString, gameId);
                                            angular.element(document.body).injector().get('tableService').leave();

                                            if (replayList.length > 0){
                                                WC_grabber.wait_until_condition(function(){return !angular.element(document.body).injector().get('tableService').hasTable();}, 100, function(){
                                                    WC_grabber.parseReplays(replayList);
                                                });
                                            } else {
                                                unsafeWindow.confirm = WC_grabber.oldConfirm;
                                                unsafeWindow.alert = WC_grabber.oldAlert;
                                                angular.element(document.body).controller().hideAllPages();
                                                angular.element(document.body).controller().showLobbyPage();
                                            }
                                        });
                                    });
                                });
                        });
                    });
                });
            });
        });
    },


    setupTable: function(){
        WC_grabber.shouldDisplay = true;
        publicPreferences.setUserPrefValue(UserPrefIds["LOG_FIXED_BASIC_BONUS"], true);
        input = angular.element($('table-starter .table-rule-text-input'))[0].value;
        replayList = input.split(",");
        if (replayList.length > 1){
            WC_grabber.shouldDisplay = false;
        }
        WC_grabber.oldAlert = unsafeWindow.alert;
        WC_grabber.oldConfirm = unsafeWindow.confirm;
        unsafeWindow.alert = () => {WC_grabber.abort();};
        unsafeWindow.confirm = () => {return true;};
        setTimeout(function(){
            WC_grabber.parseReplays(replayList);
        }, 500);
    },
}

WC_grabber.angular_debug_check();
setInterval(WC_grabber.redraw, 500);