您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Comparaison de tableaux de chasse
// ==UserScript== // @name cmp_chasse // @namespace MH // @description Comparaison de tableaux de chasse // @match *MH_Play/Play_ev_chasse.php* // @exclude *mh2.mh.raistlin.fr* // @exclude *mhp.mh.raistlin.fr* // @exclude *mzdev.mh.raistlin.fr* // @version 1.0 // @licence GNU GPLv3 // ==/UserScript== // vérif UTF-8 ş /** ***************************************************************************** * This file is part of Mountyzilla. * * * * Mountyzilla is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * Mountyzilla is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with Mountyzilla; if not, write to the Free Software * * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *******************************************************************************/ "use strict"; class MZ_cmpChasse { static result; // array pour result0 et result1 static nomTroll; // array static idIDTroll = ['cmpChasseTroll0', 'cmpChasseTroll1']; static idResultDiv = 'compChasseResult'; //static idTableResult = 'compChasseResult'; static msgTrollVide = 'non saisi'; static nomTrollInconnu = '??'; static colorEmptyCell = 'white'; static baseURL = '/mountyhall/View/PJView_Chasse.php?ai_IDPJ='; static idTableDataMH = 'foo_fait_de_chasse'; static init() { //console.log('MZ_cmpChasse.init ici'); let footer1 = document.getElementById('footer1'); let mainDiv = document.createElement('div'); if (footer1) { footer1.parentNode.insertBefore(mainDiv, footer1); } else { document.body.appendChild(mainDiv); } //mainDiv.appendChild(document.createTextNode('ici')); let title = document.createElement('h3'); title.appendChild(document.createTextNode('[extension] Comparaison de tableaux de chasse')); mainDiv.appendChild(title); let form = document.createElement('div'); let inp1 = MZ_cmpChasse.appendInputID(form, MZ_cmpChasse.idIDTroll[0], 'premier'); MZ_cmpChasse.appendInputID(form, MZ_cmpChasse.idIDTroll[1], 'second'); let but = document.createElement('button'); but.appendChild(document.createTextNode('Go !')); but.onclick = MZ_cmpChasse.go; let thisTroll = MZ_cmpChasse.getNumTroll(); if (thisTroll) inp1.value = thisTroll; form.appendChild(but); mainDiv.appendChild(form); let resultDiv = document.createElement('div'); resultDiv.id = MZ_cmpChasse.idResultDiv; mainDiv.appendChild(resultDiv); } static appendInputID(form, idInput, texte) { let lab = document.createElement('label'); lab.appendChild(document.createTextNode('ID du ' + texte + ' Trõll')); let inp = document.createElement('input'); inp.type = 'text'; inp.style.width = '80px'; inp.style.marginLeft = '5px'; inp.id = idInput; lab.appendChild(inp); lab.style.marginRight = '10px'; form.appendChild(lab); return inp; } static go() { //console.log('MZ_cmpChasse.go start'); MZ_cmpChasse.clearResult(); MZ_cmpChasse.result = [null, null]; MZ_cmpChasse.nomTroll = []; MZ_cmpChasse.getInfo(0); MZ_cmpChasse.getInfo(1); } static async getInfo(iTroll) { //console.log('MZ_cmpChasse.getInfo ' + iTroll); let sTroll = document.getElementById(MZ_cmpChasse.idIDTroll[iTroll]).value.trim(); if (sTroll == '') { //console.log('MZ_cmpChasse.getInfo(' + iTroll + ') sTroll vide'); MZ_cmpChasse.result[iTroll] = MZ_cmpChasse.msgTrollVide; MZ_cmpChasse.tryAfficheResult(); return; } let idTroll = parseInt(sTroll); if (isNaN(idTroll) || idTroll <= 0) { //console.log('MZ_cmpChasse.getInfo(' + iTroll + ') sTroll non numérique'); MZ_cmpChasse.result[iTroll] = 'N° Troll incorrect : ' + sTroll; MZ_cmpChasse.tryAfficheResult(); return; } try { let response = await fetch(MZ_cmpChasse.baseURL + idTroll); if (!response.ok) { MZ_cmpChasse.result[iTroll] = "Erreur à l'appel MH pour le Troll n°" + idTroll; MZ_cmpChasse.tryAfficheResult(); return; } // convert to UTF8 let charset = (response.headers.get("content-type").match(/;\s*charset=(.*)(?:;|$)/) || [])[1]; let html; if (charset && charset != "UTF-8") { // TODO check more? utf-8, utf8, UTF8, ... let decoder = new TextDecoder(charset) let buffer = await response.arrayBuffer() html = decoder.decode(buffer) // convert to utf8 } else { html = await response.text() } if (html.includes("n'existe")) { MZ_cmpChasse.result[iTroll] = 'Le Troll n°' + idTroll + " n'existe pas"; MZ_cmpChasse.tryAfficheResult(); return; } let parser = new DOMParser(); let doc = parser.parseFromString(html, "text/html"); // Nom du Trõll let h1s = doc.getElementsByTagName('h1'); if (h1s.length >= 1) MZ_cmpChasse.nomTroll[iTroll] = h1s[0].innerText; else MZ_cmpChasse.nomTroll[iTroll] = MZ_cmpChasse.nomTrollInconnu; let tableData = doc.getElementById(MZ_cmpChasse.idTableDataMH); if (!tableData) { if (MZ_cmpChasse.nomTroll[iTroll] == MZ_cmpChasse.nomTrollInconnu) { MZ_cmpChasse.result[iTroll] = 'Pas de résultat (ou erreur) venant de MH pour le Troll n°' + idTroll; } else { MZ_cmpChasse.result[iTroll] = 'Le Troll n°' + idTroll + ' (' + MZ_cmpChasse.nomTroll[iTroll] + ') semble ne pas avoir donné un accès public à son tableau de chasse'; } MZ_cmpChasse.tryAfficheResult(); return; } //console.log('MZ_cmpChasse.getInfo(' + iTroll + ') nbRow=' + tableData.tBodies[0].rows.length); let tabData = []; for (let row of tableData.tBodies[0].rows) { //console.log(row); let oneData = { 'monstre': row.cells[0].getAttribute('data-sort-value').toString(), //'famille': row.cells[2].innerText, // finalement, on ne l'affiche pas 'max': parseInt(row.cells[4].getAttribute('data-sort-value')), }; oneData['nb' + iTroll] = parseInt(row.cells[3].innerText), tabData.push(oneData); } //console.log(tabData); MZ_cmpChasse.result[iTroll] = tabData; MZ_cmpChasse.tryAfficheResult(); } catch (error) { MZ_cmpChasse.result[iTroll] = 'Erreur à la récupération des infos MH pour le Troll ' + idTroll; MZ_cmpChasse.tryAfficheResult(); console.error('MZ_cmpChasse.getInfo(' + iTroll + ') : Failed to fetch page: ', error) } } static tryAfficheResult() { if (MZ_cmpChasse.result[0] === null || MZ_cmpChasse.result[1] === null) return; // il faut attendre MZ_cmpChasse.clearResult(); if (MZ_cmpChasse.result[0] == MZ_cmpChasse.msgTrollVide && MZ_cmpChasse.result[1] == MZ_cmpChasse.msgTrollVide) { MZ_cmpChasse.addErreur("Aucun d'ID de Troll"); return; } let mergedData; let show0, show1; for (let iTroll = 0; iTroll <= 1; iTroll++) { if (MZ_cmpChasse.result[iTroll] == MZ_cmpChasse.msgTrollVide) { //console.log('MZ_cmpChasse.tryAfficheResult, iTroll=' + iTroll + ' : ignore silencieusement'); continue; //ignore silencieusement } if (typeof MZ_cmpChasse.result[iTroll] === 'string' || MZ_cmpChasse.result[iTroll] instanceof String) { MZ_cmpChasse.addErreur(MZ_cmpChasse.result[iTroll]); //console.log('MZ_cmpChasse.tryAfficheResult, iTroll=' + iTroll + ' : message erreur'); MZ_cmpChasse.result[iTroll] = null; } else { //console.log('MZ_cmpChasse.tryAfficheResult, iTroll=' + iTroll + ' : à faire, type=' + typeof MZ_cmpChasse.result[iTroll]); if (mergedData) { mergedData = mergedData.concat(MZ_cmpChasse.result[iTroll]); } else { mergedData = MZ_cmpChasse.result[iTroll]; } if (iTroll == 0) show0 = true; else show1 = true; } } if (!mergedData) { //console.log('MZ_cmpChasse.tryAfficheResult rien à faire'); return; } mergedData.sort((a, b) => a.monstre.localeCompare(b.monstre)); if (show0 && show1) { // passe d'agrégation let agregated = []; let lastData, lastMonstre; for (let data of mergedData) { if (data.monstre == lastMonstre) { if (data.nb0) lastData.nb0 = data.nb0; if (data.nb1) lastData.nb1 = data.nb1; } else { agregated.push(data); lastMonstre = data.monstre; lastData = data; } } mergedData = agregated; } //console.log(mergedData); let table = document.createElement('table'); table.className = 'mh_tdborder'; // Header let tr = document.createElement('tr'); tr.className = 'mh_tdtitre'; let th = tr.insertCell(); th.appendChild(document.createTextNode('Monstre')); if (show0) { th = tr.insertCell(); th.appendChild(document.createTextNode(MZ_cmpChasse.nomTroll[0])); } if (show1) { th = tr.insertCell(); th.appendChild(document.createTextNode(MZ_cmpChasse.nomTroll[1])); } table.appendChild(tr); // data let totalKill0 = 0; let totalKill1 = 0; let totalMonstre0 = 0; let totalMonstre1 = 0; for (let data of mergedData) { tr = document.createElement('tr'); tr.className = 'mh_tdpage'; let td = tr.insertCell(); td.appendChild(document.createTextNode(data.monstre)); if (show0) { td = tr.insertCell(); if (data.nb0) { td.appendChild(document.createTextNode(data.nb0)); totalKill0 += parseInt(data.nb0); totalMonstre0++; } else { td.style.backgroundColor = MZ_cmpChasse.colorEmptyCell; } } if (show1) { td = tr.insertCell(); if (data.nb1) { td.appendChild(document.createTextNode(data.nb1)); totalKill1 += parseInt(data.nb1); totalMonstre1++; } else { td.style.backgroundColor = MZ_cmpChasse.colorEmptyCell; } } table.appendChild(tr); } // totaux tr = document.createElement('tr'); tr.className = 'mh_tdtitre'; th = tr.insertCell(); th.appendChild(document.createTextNode('Nombre de types de monstre')); if (show0) { th = tr.insertCell(); th.appendChild(document.createTextNode(totalMonstre0)); } if (show1) { th = tr.insertCell(); th.appendChild(document.createTextNode(totalMonstre1)); } table.appendChild(tr); tr = document.createElement('tr'); tr.className = 'mh_tdtitre'; th = tr.insertCell(); th.appendChild(document.createTextNode('Nombre de kills')); if (show0) { th = tr.insertCell(); th.appendChild(document.createTextNode(totalKill0)); } if (show1) { th = tr.insertCell(); th.appendChild(document.createTextNode(totalKill1)); } table.appendChild(tr); document.getElementById(MZ_cmpChasse.idResultDiv).appendChild(table); } static addErreur(msg) { let div = document.createElement('div'); div.appendChild(document.createTextNode(msg)); div.style.color = 'red'; document.getElementById(MZ_cmpChasse.idResultDiv).appendChild(div); } static getNumTroll() { // priorité : tentative de récupération dans la page elle même (en mode spmartphone) let eID = document.getElementById('id'); let idTroll; if (eID) idTroll = parseInt(eID.getAttribute('data-id')); if (idTroll && !isNaN(idTroll)) return idTroll; if (!window.top || !window.top.Sommaire) return; let frameMenu = window.top.Sommaire.document; eID = frameMenu.getElementById('id'); if (eID) idTroll = parseInt(eID.getAttribute('data-id')); if (idTroll && !isNaN(idTroll)) return idTroll; // ancienne méthode, analyse du javascript onclick="EnterPJView(91305,750,550)" let tabA = frameMenu.getElementsByTagName('a'); if (tabA.length == 0 || tabA[0].onclick === undefined) return; let s = tabA[0].onclick.toString(); let m = s.match(/\((\d+) *,/); if (!m || m.length < 1) return; idTroll = parseInt(m[1]); if (idTroll && !isNaN(idTroll)) return idTroll; } static clearResult() { let e = document.getElementById(MZ_cmpChasse.idResultDiv); while (e.lastChild) e.removeChild(e.lastChild); } } MZ_cmpChasse.init();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址