// ==UserScript==
// @name MH - H2P - Bricol' Trolls
// @namespace bricoltrolls
// @description Eléments supplémentaires pour le Système Tactique des Bricol' Trolls
// @include http*://trolls.ratibus.net/*
// @include https://it.mh.raistlin.fr/*
// @icon https://xballiet.github.io/ImagesMH/BricolTrolls.png
// @version 2.5
// @author 43406 - H2P
// ==/UserScript==
// Variables globales
var checkDate;
var indexHref;
var indexProfil;
var nodesHref;
var nodesProfil;
var timeout;
var now = new Date();
var one_day = 1000 * 60 * 60 * 24;
var one_month = 31 * one_day;
// Récupération de la date de la veille
yesterday = new Date(now.getTime() - one_day);
yyyy = yesterday.getFullYear();
mm = yesterday.getMonth() + 1;
if (mm < 10) {
mm = '0' + mm;
}
dd = yesterday.getDate();
if (dd < 10) {
dd = '0' + dd;
}
hh = yesterday.getHours();
if (hh < 10) {
hh = '0' + hh;
}
mi = yesterday.getMinutes();
if (mi < 10) {
mi = '0' + mi;
}
ss = yesterday.getSeconds();
if (ss < 10) {
ss = '0' + ss;
}
var yesterdayString = '' + yyyy + mm + dd + hh + mi + ss;
// Récupération de la date d'il y a un mois
yestermonth = new Date(now.getTime() - one_month);
yyyy = yestermonth.getFullYear();
mm = yestermonth.getMonth() + 1;
if (mm < 10) {
mm = '0' + mm;
}
dd = yestermonth.getDate();
if (dd < 10) {
dd = '0' + dd;
}
hh = yestermonth.getHours();
if (hh < 10) {
hh = '0' + hh;
}
mi = yestermonth.getMinutes();
if (mi < 10) {
mi = '0' + mi;
}
ss = yestermonth.getSeconds();
if (ss < 10) {
ss = '0' + ss;
}
var yestermonthString = '' + yyyy + mm + dd + hh + mi + ss;
// Fonction d'appel récursif aux liens de mises à jour
function nextNodeHref() {
if (checkDate) {
// Récupération de la date de dernière mise à jour
node = document.evaluate("../../td[@class='date']", nodesHref.snapshotItem(indexHref), null, XPathResult.STRING_TYPE, null).stringValue;
dateMAJ = node.substring(node.indexOf('MAJ : ') + 6);
yyyy = dateMAJ.substring(6, 10);
mm = dateMAJ.substring(3, 5);
dd = dateMAJ.substring(0, 2);
hh = dateMAJ.substring(11, 13);
mi = dateMAJ.substring(14, 16);
ss = dateMAJ.substring(17);
dateMAJString = yyyy + mm + dd + hh + mi + ss;
// On ne met à jour que si on a une date de dernière mise à jour et qu'elle est entre hier et il y a un mois
majOK = (dateMAJString == '' || (yestermonthString < dateMAJString && dateMAJString < yesterdayString));
//alert("hiddenFrame.src = _" + nodesHref.snapshotItem(indexHref).href + "_\r\nyestermonth = " + yestermonthString + ", dateMAJ = " + dateMAJString + " et yesterday = " + yesterdayString + " => majOK = " + majOK);
} else {
majOK = true;
}
if (majOK) {
hiddenFrame.src = nodesHref.snapshotItem(indexHref).href;
}
// On passe au lien de mise à jour suivant s'il y en a un, sinon on rafraîchit la page
indexHref++;
if (indexHref < nodesHref.snapshotLength) {
if (majOK) {
setTimeout(nextNodeHref, timeout);
} else {
nextNodeHref();
}
} else {
setTimeout("location.href = '" + location.href + "'", 1000);
alert("Mise à jour terminée.");
}
}
// Fonction d'appel récursif aux liens de profils (pas implémenté pour le moment)
function nextNodeProfil() {
hiddenFrameProfils.src = nodesProfil.snapshotItem(indexProfil).href;
//alert(document.getElementById('iFrameProfils').src);
alert(document.getElementById('iFrameProfils').getElementsByTagName('btnUpdateProfil'));
//alert("hiddenFrameProfils.src = _" + nodesProfil.snapshotItem(indexProfil).href + "_");
// On passe au lien de mise à jour suivant s'il y en a un, sinon on rafraîchit la page
indexProfil++;
if (indexProfil < nodesProfil.snapshotLength) {
setTimeout(nextNodeProfil, timeout);
} else {
setTimeout("location.href = '" + location.href + "'", 1000);
}
}
// Fonction générique de mise à jour
function updateAll(href, notHref, tempo, doubleHidden) {
// Récupération de tous les liens dont le href contient <href> et ne contient pas <notHref>
nodes = document.evaluate("//a[contains(@href, '" + href + "')][not(contains(@href, '" + notHref + "'))]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
// Appels récursifs dans la frame cachée des liens récupérés
timeout = tempo;
if (doubleHidden) {
indexProfil = 0;
nodesProfil = nodes;
nextNodeProfil();
} else {
indexHref = 0;
nodesHref = nodes;
nextNodeHref();
}
}
// Fonction de mise à jour de tous les trolls depuis la page d'accueil
function updateAllTrolls() {
checkDate = true;
updateAll('update_info.php?id=', 'XBT', 3000);
}
// Fonction de mise à jour de tous les trolls depuis la page d'accueil sans vérification de la date de dernière mise à jour
function updateAllTrollsWithoutDateTest() {
if (confirm("Voulez-vous vraiment tout mettre à jour ?\r\n(attention à la limite d'appel des scripts publics)")) {
checkDate = false;
updateAll('update_info.php?id=', 'XBT', 3000);
}
}
// Fonction de mise à jour de tous les profils depuis la page d'accueil (pas implémenté pour le moment)
function updateAllProfils() {
checkDate = true;
updateAll('profil.php?id=', 'XBT', 10000, true);
}
// Fonction de mise à jour de tous les trolls et leurs profils depuis la page d'accueil (pas implémenté pour le moment)
function updateAllTrollsAndProfils() {
checkDate = true;
alert("MàJ de tout");
}
// Fonction de mise à jour générique
function updateAllBroll() {
checkDate = true;
updateAll('update_', 'id_mouche', 3000);
}
// Fonction d'ajout d'un élément (bouton, frame cachée...)
function makeElement(type, appendto, attributes, checked, chkdefault) {
var element = document.createElement(type);
if (attributes != null) {
for (var i in attributes) {
element.setAttribute(i, attributes[i]);
}
}
if (checked != null) {
if (GM_getValue(checked, chkdefault) == 'checked') {
element.setAttribute('checked', 'checked');
}
}
if (appendto) {
appendto.appendChild(element);
}
return element;
}
// Pour le lien vers la page des compétences et sortilèges, on enlève les compétences/sortilèges que personne n'a
document.evaluate("//a[@href='competences-sortileges.php']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.href = "competences-sortileges.php?cleanEmpty=1";
// Suppression des publicités de bas de page
document.getElementById("footer").outerHTML = "";
// Suppression des cadres News (et Diplomatie) et réduction du cadre Mémo
if (document.getElementById("news") != null) {
document.getElementById("news").outerHTML = "";
}
/*if (document.getElementById("diplomatie") != null) {
document.getElementById("diplomatie").outerHTML = "";
}*/
if (document.getElementById("memoContent") != null) {
document.getElementById("memoContent").style = "display: none;";
}
// Frame cachée pour les mises à jour des profils depuis la page générale
var hiddenFrameProfils = makeElement('iframe', document.body, {'style':'position: absolute; top: 50%; left: 1px; width: 100%; height: 25%; border: 2px solid red; display: none;', 'name':'iFrameProfils', 'id':'iFrameProfils'});
// Frame cachée pour les mises à jour
var hiddenFrame = makeElement('iframe', document.body, {'style':'position: absolute; top: 75%; left: 1px; width: 100%; height: 25%; border: 2px solid red; display: none;', 'name':'iFrameHref', 'id':'iFrameHref'});
// Traitements pour la page d'accueil
if (location.href.indexOf('index.php') != -1) {
// Récupération de tous les liens des vues
var hrefVues = document.evaluate("//a[contains(@href, 'vue.php?vue=15&id=')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
// Parcours des liens des vues et remplacements avec des vues plus adéquates (vue max, pas de gowaps, pas de composants, pas de GG)
for (var index = 0 ; index < hrefVues.snapshotLength ; index++) {
hrefVues.snapshotItem(index).href = hrefVues.snapshotItem(index).href.replace('vue.php?vue=15&id=', 'vue.php?vue=100&gowapOff=1&composantOff=1&gigotsOff=1&id=');
}
// Bouton de mise à jour de tout
//var updateAllTrollsButton = makeElement('input', document.body, {'type':'submit', 'value':'MàJ tout', 'style':'font-family: comic; font-size: 16pt; position: absolute; left: 70px; top: 30px; width: 200px; height: 35px; cursor: pointer;'});
//updateAllTrollsButton.addEventListener('click', updateAllTrollsAndProfils, false);
// Bouton de mise à jour des trolls
var updateAllTrollsButton = makeElement('input', document.body, {'type':'submit', 'value':'MàJ tous les trolls', 'style':'font-family: comic; font-size: 16pt; position: absolute; left: 70px; top: 70px; width: 200px; height: 35px; cursor: pointer;'});
updateAllTrollsButton.addEventListener('click', updateAllTrolls, false);
// Bouton de mise à jour des trolls sans tester la date de dernière mise à jour
var updateAllTrollsWithoutDateTestButton = makeElement('input', document.body, {'type':'submit', 'value':'MàJ trolls sans check', 'style':'font-family: comic; font-style: italic; color: red; font-size: 16pt; position: absolute; left: 305px; top: 70px; width: 200px; height: 35px; cursor: pointer;'});
updateAllTrollsWithoutDateTestButton.addEventListener('click', updateAllTrollsWithoutDateTest, false);
// Bouton de mise à jour de tous les profils
//var updateAllProfilsButton = makeElement('input', document.body, {'type':'submit', 'value':'MàJ tous les profils', 'style':'font-family: comic; font-size: 16pt; position: absolute; left: 70px; top: 110px; width: 200px; height: 35px; cursor: pointer;'});
//updateAllProfilsButton.addEventListener('click', updateAllProfils, false);
}
// Traitements pour les pages de profils
if (location.href.indexOf('profil.php') != -1) {
// Bouton de mise à jour
var updateAllProfilButton = makeElement('input', document.body, {'type':'submit', 'name':'btnUpdateProfil', 'id':'btnUpdateProfil', 'value':'MàJ tout le profil', 'style':'font-family: comic; font-size: 16pt; position: absolute; left: 70px; top: 70px; width: 200px; height: 35px; cursor: pointer;'});
updateAllProfilButton.addEventListener('click', updateAllBroll, false);
}
// Traitements pour les pages de gowaps et tanières
if (location.href.indexOf('gowaps_tanieres.php') != -1) {
// Bouton de mise à jour
var updateAllGowapsTanieresButton = makeElement('input', document.body, {'type':'submit', 'name':'btnUpdateGowapsTanieres', 'id':'btnUpdateGowapsTanieres', 'value':'MàJ tous les Gowaps et Tanières', 'style':'font-family: comic; font-size: 16pt; position: absolute; left: 70px; top: 70px; width: 300px; height: 35px; cursor: pointer;'});
updateAllGowapsTanieresButton.addEventListener('click', updateAllBroll, false);
}
// Traitements pour les pages de possessions
if (location.href.indexOf('possessions.php') != -1) {
// Bouton de mise à jour
var updateAllPossessionsButton = makeElement('input', document.body, {'type':'submit', 'name':'btnUpdatePossessions', 'id':'btnUpdatePossessions', 'value':'MàJ les possessions', 'style':'font-family: comic; font-size: 16pt; position: absolute; left: 70px; top: 70px; width: 200px; height: 35px; cursor: pointer;'});
updateAllPossessionsButton.addEventListener('click', updateAllBroll, false);
}
// Traitements pour les pages de listes de vente
if (location.href.indexOf('listes_vente.php') != -1) {
// Bouton de mise à jour
var updateAllListesVenteButton = makeElement('input', document.body, {'type':'submit', 'name':'btnUpdateListesVente', 'id':'btnUpdateListesVente', 'value':'MàJ les listes de vente', 'style':'font-family: comic; font-size: 16pt; position: absolute; left: 70px; top: 70px; width: 300px; height: 35px; cursor: pointer;'});
updateAllListesVenteButton.addEventListener('click', updateAllBroll, false);
}