// ==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();