NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Grepolis Stats Eroberungsstatistiken
// @namespace GrepolisStats
// @description Erstellt Statistiken für die Eroberungen von Allianzen.
// @include http://*.grepostats.com/world/*/alliance/*
// @exclude http://*.grepostats.com/world/*/alliance/*/members
// @exclude http://*.grepostats.com/world/*/alliance/*/towns
// @exclude http://*.grepostats.com/world/*/alliance/*/alliancechanges
// @exclude http://*.grepostats.com/world/*/alliance/*/colonitations
// @version 1.2
// @grant none
// ==/UserScript==
function error (wrappedFunction) {
return function () {
try {
wrappedFunction.apply (this, arguments);
} catch (ex) {
console.log ("error:", ex);
throw ex;
}
}
}
var creationFormHeader =
'<div class="table_header smaller">\
<table style="width: 100%">\
<tbody>\
<tr>\
<td>Eroberungsstatistik</td>\
</tr>\
</tbody>\
</table>\
</div>';
var creationFormTemplate =
'<div class="table_content">\
<table style="width: 100%">\
<tbody>\
<tr class="even">\
<td>\
Verbündete:\
<input type="text" value="6500,2516" />\
<br />\
Feinde:\
<input type="text" value="678" />\
<br />\
<input type="checkbox" id="eo-stats-count-points" />\
<label for="eo-stats-count-points">Punkte statt Städte zählen</label>\
<br />\
<a href="#">» Statistik erstellen</a>\
<br />\
<div style="text-align: center;">0 / 0</div>\
</td>\
</tr>\
</tbody>\
</table>\
</div>';
var world = location.pathname.match (/world\/(.*)\/alliance/) [1];
var allianceId = location.pathname.match (/alliance\/(\d+)/) [1];
var statisticsDiv;
var countPointsCheckbox;
function start () {
var creationFormContainer = $ ("<div>").css ({
width: "350px",
float: "left",
margin: "10px 5px 0"
}).appendTo (".main > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1) > table:nth-child(2) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1)");
$ (creationFormHeader).appendTo (creationFormContainer);
var creationForm = $ (creationFormTemplate).appendTo (creationFormContainer);
var creationFormCreate = creationForm.find ("a").click (error (function () {
var enemyIdList = creationForm.find ("input").get (1).value.replace (/\s/g, "");
enemyIdList = enemyIdList.length ? enemyIdList.split (",") : [];
var allyIdList = creationForm.find ("input").get (0).value.replace (/\s/g, "");
allyIdList = allyIdList.length ? allyIdList.split (",") : [];
function testId (id) {
return /^\d+$/.test (id);
}
if (! enemyIdList.every (testId) || ! allyIdList.every (testId)) {
alert ("Falsches Eingabeformat. Durch Kommata getrennte Liste von Zahlen erwartet.");
return;
}
if (enemyIdList.length)
createStatistics (enemyIdList, allyIdList);
else
alert ("Keine Feinde angegeben");
}));
loadingBar = creationForm.find ("div").get (0);
statisticsDiv = $ ("<div>").appendTo (creationForm.find ("td"));
countPointsCheckbox = $ ("#eo-stats-count-points");
}
var visitedPagesCount = 0;
var pagesToVisitCount = 0;
var loadingBar;
function onPageVisited () {
++visitedPagesCount;
refreshLoadingBar ();
}
function onVisitPage () {
++pagesToVisitCount;
refreshLoadingBar ();
}
function refreshLoadingBar () {
loadingBar.innerHTML = visitedPagesCount + " / " + pagesToVisitCount;
}
function createStatistics (enemyIdList, allyIdList) {
visitedPagesCount = pagesToVisitCount = 0;
refreshLoadingBar ();
// month id
//{"2012-11": {623: {won: 19, lost: 7, wonPoints: 201354, lostPoints: 68108}}};
var monthTable = {};
allyIdList.push (allianceId);
for (var i = 0; i < allyIdList.length; ++i) {
for (var j = 0; j < enemyIdList.length; ++j) {
visitPage (allyIdList [i], enemyIdList, monthTable, enemyIdList [j], "win", 0);
visitPage (allyIdList [i], enemyIdList, monthTable, enemyIdList [j], "lose", 0);
}
}
allyIdList.pop ();
}
function statisticsCreated (enemyIdList, monthTable) {
getAllianceNames (enemyIdList, error (function (nameTable) {
var styleElement =
'<style type="text/css" scoped="scoped">\
td:not(:first-child) {\
text-align: right;\
}\
</style>';
var html = "<table border=1>" + styleElement + "<tr><th>Monat</th>";
var bb = "[table]\n[**]Monat";
if (enemyIdList.length == 1) {
html += "<th>Erobert</th><th>Verloren</th>";
bb += "[||]Erobert[||]Verloren";
} else {
for (var i = 0; i < enemyIdList.length; ++i) {
html += "<th>Erobert von " + nameTable [enemyIdList [i]] + "</th><th>Verloren an " + nameTable [enemyIdList [i]] + "</th>";
bb += "[||]Erobert von " + nameTable [enemyIdList [i]] + "[||]Verloren an " + nameTable [enemyIdList [i]];
}
html += "</tr>";
bb += "[/**]\n";
}
var data = [];
var sum = createMonth (enemyIdList);
for (var month in monthTable) {
var monthParts = month.match (/(\d+)-(\d+)/);
var year = parseInt (monthParts [1]);
data.push ({year: year, month: parseInt (monthParts [2]), data: monthTable [month]});
}
data.sort (function (month1, month2) { return (month1.year * 12 + month1.month) - (month2.year * 12 + month2.month); });
monthNameList = ["", "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
for (var i = 0; i < data.length; ++i) {
html += "<tr><td>" + monthNameList [data [i].month] + " " + data [i].year + "</td>";
bb += "[*]" + monthNameList [data [i].month] + " " + data [i].year;
for (var j = 0; j < enemyIdList.length; ++j) {
if (countPointsCheckbox.get (0).checked) {
html += "<td>" + formatNumber (data [i].data [enemyIdList [j]].wonPoints) + "</td><td>" + formatNumber (data [i].data [enemyIdList [j]].lostPoints) + "</td>";
bb += "[|]" + formatNumber (data [i].data [enemyIdList [j]].wonPoints) + "[|]" + formatNumber (data [i].data [enemyIdList [j]].lostPoints);
} else {
html += "<td>" + formatNumber (data [i].data [enemyIdList [j]].won) + "</td><td>" + formatNumber (data [i].data [enemyIdList [j]].lost) + "</td>";
bb += "[|]" + formatNumber (data [i].data [enemyIdList [j]].won) + "[|]" + formatNumber (data [i].data [enemyIdList [j]].lost);
}
sum [enemyIdList [j]].won += data [i].data [enemyIdList [j]].won;
sum [enemyIdList [j]].lost += data [i].data [enemyIdList [j]].lost;
sum [enemyIdList [j]].wonPoints += data [i].data [enemyIdList [j]].wonPoints;
sum [enemyIdList [j]].lostPoints += data [i].data [enemyIdList [j]].lostPoints;
}
html += "</tr>";
bb += "[/*]\n";
}
html += '<tr><td style="font-weight: bold;">Gesamt</td>';
bb += "[*][b]Gesamt[/b]";
for (var i = 0; i < enemyIdList.length; ++i) {
if (countPointsCheckbox.get (0).checked) {
html += '<td style="font-weight: bold;">' + formatNumber (sum [enemyIdList [i]].wonPoints) + '</td><td style="font-weight: bold">' + formatNumber (sum [enemyIdList [i]].lostPoints) + "</td>";
bb += "[|][b]" + formatNumber (sum [enemyIdList [i]].wonPoints) + "[/b][|][b]" + formatNumber (sum [enemyIdList [i]].lostPoints) + "[/b]";
} else {
html += '<td style="font-weight: bold;">' + formatNumber (sum [enemyIdList [i]].won) + '</td><td style="font-weight: bold">' + formatNumber (sum [enemyIdList [i]].lost) + "</td>";
bb += "[|][b]" + formatNumber (sum [enemyIdList [i]].won) + "[/b][|][b]" + formatNumber (sum [enemyIdList [i]].lost) + "[/b]";
}
}
html += "</tr></table>";
bb += "[/*][/table]";
$ (statisticsDiv).html (html + "<textarea>" + bb + "</textarea>");
}));
}
function formatNumber (number) {
// s. http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript/2901298#2901298
return number.toString ().replace (/\B(?=(\d{3})+(?!\d))/g, ".");
}
function visitPage (allianceId, enemyIdList, monthTable, enemyId, colonizationType, pageNumber) {
onVisitPage ();
var request = new XMLHttpRequest ();
request.addEventListener ("load", error (pageVisited).bind (null, allianceId, enemyIdList, monthTable, enemyId, colonizationType, pageNumber, request));
request.url = "/world/" + world + "/alliance/" + allianceId + "/colonizations?type=" + colonizationType + "&enemy_alliance=" + enemyId + "&page=" + pageNumber;
request.open ("get", request.url, true);
request.send ();
}
function pageVisited (allianceId, enemyIdList, monthTable, enemyId, colonizationType, pageNumber, request) {
if (request.readyState == 4) {
if (request.status != 200) {
alert ("error while visiting page " + request.url);
return;
}
onPageVisited ();
var html = request.responseText;
var parser = new DOMParser ();
var xmlDocument = parser.parseFromString (html, "text/html");
var contentTable = xmlDocument.querySelectorAll (".table_content") [1];
if (pageNumber == 0) {
var pages = contentTable.querySelectorAll (".footer a");
var pageCount = pages.length ? parseInt (pages [pages.length - 1].href.match (/page=(\d+)/) [1]) : 0;
for (var i = 1; i < pageCount; ++i)
visitPage (allianceId, enemyIdList, monthTable, enemyId, colonizationType, i);
}
var lines = contentTable.querySelectorAll ("tr");
for (var i = 0; i < lines.length - 1; ++i) {
var line = lines [i];
var points = parseInt (line.children [2].innerHTML.replace (/\D/g, ""));
var month = line.children [7].innerHTML.substring (0, 7);
monthTable [month] = monthTable [month] || createMonth (enemyIdList);
if (colonizationType == "win") {
monthTable [month] [enemyId].won += 1;
monthTable [month] [enemyId].wonPoints += points;
} else {
monthTable [month] [enemyId].lost += 1;
monthTable [month] [enemyId].lostPoints += points;
}
}
if (visitedPagesCount == pagesToVisitCount)
statisticsCreated (enemyIdList, monthTable);
}
}
function createMonth (enemyIdList) {
var data = {};
for (var i = 0; i < enemyIdList.length; ++i)
data [enemyIdList [i]] = {won: 0, lost: 0, wonPoints: 0, lostPoints: 0};
return data;
}
function getAllianceNames (allianceIdList, callback) {
var nameTable = {};
for (var i = 0; i < allianceIdList.length; ++i)
visitAlliancePage (allianceIdList, allianceIdList [i], nameTable, callback);
}
function visitAlliancePage (allianceIdList, allianceId, nameTable, callback) {
onVisitPage ();
var request = new XMLHttpRequest ();
request.addEventListener ("load", error (alliancePageVisited).bind (null, allianceIdList, allianceId, nameTable, callback, request));
request.url = "/world/" + world + "/alliance/" + allianceId;
request.open ("get", request.url, true);
request.send ();
}
function alliancePageVisited (allianceIdList, allianceId, nameTable, callback, request) {
if (request.readyState == 4) {
if (request.status != 200) {
alert ("error while visiting page " + request.url);
return;
}
onPageVisited ();
var html = request.responseText;
var parser = new DOMParser ();
var xmlDocument = parser.parseFromString (html, "text/html");
var nameElement = xmlDocument.querySelector (".main > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1) > h2:nth-child(1) > a:nth-child(1)");
nameTable [allianceId] = nameElement ? nameElement.innerHTML : "(Fehler, ID: " + allianceId + ")";
if (visitedPagesCount == pagesToVisitCount)
callback (nameTable);
}
}
error (start) ();