Notify Nations in your turn (mabiweb.com)
// ==UserScript==
// @name Nations Your turn Notifier
// @namespace tequila_j-script
// @version 0.1.1
// @description Notify Nations in your turn (mabiweb.com)
// @match http://www.mabiweb.com/modules.php?name=GM_Nations*
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant GM_addStyle
// @run-at document-ready
// ==/UserScript==
// request permission on page load
document.addEventListener('DOMContentLoaded', function () {
if (Notification.permission !== "granted")
Notification.requestPermission();
});
GM_addStyle( `
div.playerboardinfo {
position: absolute;
top: 10px;
left: 1150px;
}
div.playerboardinfo dl {
}
div.playerboardinfo dt {
margin-bottom: 4px;
padding-left: 10px;
}
div.playerboardinfo dd {
margin: 0px;
}
div.playerboardinfo ul {
list-style-type: disc;
margin: 0px;
padding:0px;
}
div.playerboardinfo ul li {
display: inline-block;
width: 40px;
height: 30px;
margin: 0px 5px;
}
div.playerboardinfo li p {
margin: 0px;
width: 20px;
height: 20px;
display: inline-block;
}
div.playerboardinfo li p.desc {
background-repeat: no-repeat;
background-position: center;
background-size: 100% 100%;
}
div.playerboardinfo li.food p.desc {
background-image: url(modules/GM_Nations/images/Token_Food.png);
}
div.playerboardinfo li.stone p.desc {
background-image: url(modules/GM_Nations/images/Token_Stone.png);
}
div.playerboardinfo li.gold p.desc {
background-image: url(modules/GM_Nations/images/Token_Gold.png);
}
div.playerboardinfo li.point p.desc {
background-image: url(modules/GM_Nations/images/Token_VP.png);
}
div.playerboardinfo li.spare p.desc {
opacity: 0.5;
}
div.playerboardinfo li.worker-Blue p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Blue.png);
}
div.playerboardinfo li.worker-Yellow p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Yellow.png);
}
div.playerboardinfo li.worker-Red p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Red.png);
}
div.playerboardinfo li.worker-Green p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Green.png);
}
div.playerboardinfo li.worker-Purple p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Purple.png);
}
div.playerboardinfo li.worker-Orange p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Orange.png);
}
div.playerboardinfo li.worker-Gray p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Gray.png);
}
div.playerboardinfo li.worker-Pink p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Pink.png);
}
div.playerboardinfo li.worker-Cyan p.desc {
background-image: url(modules/GM_Nations/images/Meeple_Cyan.png);
}
`);
//console.log = function() {};
(function() {
'use strict';
/*jshint multistr: true */
//avoid double loading
if (window.location.href.indexOf('show_message') > 0) return;
// Game finished
if ($("#nations-gameheader:contains('Game fini')").length > 0) return;
//finds username
var $userNameBox = $("a[href='modules.php?name=Your_Account&op=logout'").parent();
var userName = $userNameBox.text().replace(/.*welcome /i,"").replace(/!.*/,"");
console.log("Username:" + userName + ".");
var currentUser = $("#nations-gameheader").children("img").next("b").text();
console.log("Current user:"+ currentUser + ".");
var gameUrl = "http://www.mabiweb.com/modules.php?name=GM_Nations&g_id="+ urlParam("g_id") + "&op=view_game_reset";
console.log(gameUrl);
var numberOfPlayers = $("#nations-gameheader").children("img").length;
console.log("Number of players:" + numberOfPlayers);
var $playerboards = $("#placeholder > div");
var $playernameboxes = $("#placeholder > ul.tab > li");
var playercolors = $("#nations-gameheader").children("img").map(function() {
var ptoken = $(this).attr('src');
var color = ptoken.replace(/.*Disc_/,"").replace(/\.png/,"");
return color;}).get();
var $newPlayerBoxes = $("<div class='playerboardinfo'/>");
$("div#nations-board").append($newPlayerBoxes);
for (var i = 0; i < numberOfPlayers; i++) {
var $playerDiv = $($playerboards[i]);
var playerName = $($playernameboxes[i]).text();
var playerColor = playercolors[i];
console.log("player: " + playerName);
var resources = $playerDiv.find(".resource_text").map(function() {
return $(this).text();
}).get();
var spareWorkFinder = $playerDiv.find(".resource_text:first").prev();
if (spareWorkFinder.hasClass('outline_text')) {
resources.push(spareWorkFinder.text())
} else {
resources.push(0);
}
$newPlayerBoxes.append(buildPlayerAF(playerName,playerColor,resources));
}
function buildPlayerAF(playerName, playercolor, resources) {
var playerTable = "<dl><dt>" + playerName + "</dt>"
+ "<dd><ul>"
+ "<li class='food'><p class='desc'></p><p class='qdt'>" + resources[0] + "</p></li>"
+ "<li class='stone'><p class='desc'></p><p class='qdt'>" + resources[1] + "</p></li>"
+ "<li class='gold'><p class='desc'></p><p class='qdt'>" + resources[2] + "</p></li>"
+ "<li class='point'><p class='desc'></p><p class='qdt'>" + resources[3] + "</p></li>"
+ "<li class='worker-"+playercolor+"'><p class='desc'></p><p class='qdt'>" + resources[4] + "/" + resources[5] + "</p></li>"
+ "</ul></dd></dl>"
;
return $(playerTable);
}
window.setCheckTurn = function(callbackFunc, timing) {
var variableInterval = {
config: timing,
callback: callbackFunc,
stopped: false,
runLoop: function() {
if (variableInterval.stopped) return;
var result = variableInterval.callback.call(variableInterval);
if (typeof result == 'number') {
if (result === 0) return;
variableInterval.interval = result;
};
variableInterval.loop();
},
stop: function() {
this.stopped = true;
console.log("Auto refresh stopped");
window.clearTimeout(this.timeout);
},
start: function() {
this.stopped = false;
console.log("Auto refresh started");
return this.loop();
},
loop: function() {
this.timeout = window.setTimeout(this.runLoop, this.getInterval());
return this;
},
incrementInterval: function(multiply) {
if (multiply !== undefined) multiply = 1;
var alic = this.getInterval() + this.config.step*multiply;
if (alic > this.config.max) {
this.setInterval(this.config.max);
console.log("Interval already set to maximum:" + this.getInterval());
} else {
this.setInterval(this.getInterval() + this.config.step);
console.log("Interval increased to:" + this.getInterval());
}
return this;
},
resetInterval: function() {
this.setInterval(this.config.start);
console.log("Interval reset to:" + this.getInterval());
},
getInterval: function() {
if (sessionStorage.getItem("currentTime") === null) {
sessionStorage.setItem("currentTime", this.config.start);
}
return Number(sessionStorage.getItem("currentTime"));
},
setInterval: function(val) {
sessionStorage.setItem("currentTime", val);
}
}
return variableInterval;
};
var notificationTimeout = {
start: 10000,
max: 120000,
step: 5000,
current: 10000
};
function urlParam(param) {
var vars = {};
window.location.href.replace( location.hash, '' ).replace(
/[?&]+([^=&]+)=?([^&]*)?/gi, // regexp
function( m, key, value ) { // callback
vars[key] = value !== undefined ? value : '';
}
);
if ( param ) {
return vars[param] ? vars[param] : null;
}
return vars;
}
var honkSound = new Audio("https://www.soundjay.com/misc/sounds/briefcase-lock-4.mp3");
var isDefaultTitle = true;
var origTitle = document.title;
var yourTurnTitle = origTitle + " - Your turn!";
function blinkTitle() {
document.title = isDefaultTitle ? origTitle : yourTurnTitle;
isDefaultTitle = !isDefaultTitle;
}
function notify(message) {
if (!Notification) {
console.log('Desktop notifications are not available for your browser.');
return;
}
if (Notification.permission !== "granted")
Notification.requestPermission();
else {
var notification = new Notification('Mabiweb: it is your turn!', {
icon: 'http://www.boiteajeux.net/jeux/kan/img/sandra_1.png',
body: message,
requireInteraction: true
});
notification.onclick = function () {
window.focus();
};
}
honkSound.play();
var titleNotification = setInterval(blinkTitle, 1500);
}
function updatePage() {
turnNotifier.incrementInterval(numberOfPlayers-1);
window.location.href = gameUrl;
}
var turnNotifier = setCheckTurn(function() {
updatePage();
}, notificationTimeout
);
var isMyTurn = function() {
return userName == currentUser;
};
function startNotification() {
console.log("Is my turn?" + isMyTurn());
if (! isMyTurn()) {
console.log("Next reload:" + turnNotifier.getInterval());
turnNotifier.start();
} else {
turnNotifier.resetInterval(); //ugly hack for double reload
notify("Table " + urlParam("g_id"));
}
}
startNotification();
})() ;//end of script