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