Greasy Fork is available in English.

Better Guiderz.com / MVPtracker.net

Calcul la différence entre l'heure de mort du MVP et l'heure actuelle

// ==UserScript==
// @name         Better Guiderz.com / MVPtracker.net
// @namespace    http://tampermonkey.net/
// @version      2.9
// @description  Calcul la différence entre l'heure de mort du MVP et l'heure actuelle
// @author       Fri
// @license      MIT
// @match        http://mvptracker.net/tracker/*
// @match        http://guiderz.com/tracker/*
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

//Configuration noms des MVPs
const types = {
  //const Neutral = ["", ""];
  Water: ["Golden Thief Bug", "Boitata", "Ifrit", "Assassin", "SinX", "Lord Knight", "LK", "Eddga", "Egnigem", "Ygnizem", "Cenia", "Moonlight"],
  Earth: ["Lady Tanee", "Bacsojin", "Assassin", "SinX", "Stormy Knight", "Mistress", "Sniper"],
  Fire: ["Turtle General", "Maya", "Gopinich", "Amon Ra", "Whitesmith", "WS", "Dark Lord", "Drake", "Hardrock", "Mammoth", "Orc Hero", "Orc Lord", "Osiris", "Scaraba Queen", "Tendrillion"],
  Wind: ["Ktullanux", "Garm", "Assassin", "SinX", "Kraken", "Mastering"],
  //Poison: ["", ""],
  Holy: ["Incantation Samurai", "Fallen Bishop Hibram", "Leak", "Baphomet", "Kiel D-01", "Lord Of Death", "Atroce", "Dark Lord", "Dracula", "Drake", "Osiris", "Pharaoh", "Satan", "Detale", "Doppelganger", "Assassin", "SinX", "Nidhogg"],
  Shadow: ["Valkyrie Randgris", "Vesper", "High Priest", "HP", "Angeling", "Archangeling", "Deviling"],
  Ghost: ["Beelzebub", "High Wizard", "HW", "Evil Snake Lord", "ESL", "Thanatos", "Ghostring", "Gloom Under Night"],
  Undead: ["High Priest", "HP", "Angeling", "Archangeling", "Deviling"]
};


let checkboxAutoConnexion;
let nomDuServerInput;
let pseudoInput;
let checkboxAfficherFaiblesse;




function calculerDifferenceTemps(heureSaisie) {
  if (heureSaisie === "") {
    return 0;
  }

  const heureActuelle = new Date();

  const heureSaisieSplit = heureSaisie.split("h");
  const heureSaisieHeure = parseInt(heureSaisieSplit[0]);
  const heureSaisieMinute = parseInt(heureSaisieSplit[1]);

  const dateAvecHeureSaisie = new Date(
    heureActuelle.getFullYear(),
    heureActuelle.getMonth(),
    heureActuelle.getDate(),
    heureSaisieHeure,
    heureSaisieMinute
  );
  if (dateAvecHeureSaisie > heureActuelle) {
    dateAvecHeureSaisie.setDate(dateAvecHeureSaisie.getDate() - 1);
  }
  const differenceMinutes = Math.round(
    (heureActuelle - dateAvecHeureSaisie) / (1000 * 60)
  );
  return differenceMinutes;
}






function ajouterTextBoxEtCalculerDifference() {
const boutons1 = document.querySelectorAll('img[src="/tracker-files/images/btnUpdate__.png"][alt="Update MVP Spawn Time"][onclick^="postSet(\'killed by me\',"]');
const boutons2 = document.querySelectorAll('button.killMVPButton.killMVPButtonNormal');

const boutons = [...boutons1, ...boutons2]; // Combinez les deux listes

boutons.forEach((bouton) => {
    const textBoxExistante = bouton.nextElementSibling;
    if (textBoxExistante && textBoxExistante.nodeName === "INPUT") {
      return;
    }
    const textBox = document.createElement("input");
    textBox.type = "text";
    textBox.size = "3"; // Augmenter la taille pour accueillir les heures et les minutes
    textBox.classList.add("custom-textbox");
    textBox.style.position = "absolute";
    textBox.style.marginLeft = "5px";
    textBox.style.marginTop = "0px";
    textBox.addEventListener("input", function () {
      let heureSaisie = this.value;
      heureSaisie = heureSaisie.replace(/\D/g, ""); // Supprimer tous les caractères non numériques
      if (heureSaisie.length >= 3) {
        const heures = heureSaisie.slice(0, -2);
        const minutes = heureSaisie.slice(-2);
        heureSaisie = `${heures}h${minutes}`;
      } else if (heureSaisie.length === 2) {
        heureSaisie = `${heureSaisie}h`;
      }
      this.value = heureSaisie;
      const differenceMinutes = calculerDifferenceTemps(heureSaisie);
      const textBoxKilled = this.parentNode.parentNode.querySelector(
        'input[name^="killed"]'
      );
      if (textBoxKilled) {
        textBoxKilled.value = differenceMinutes;
      }
    });
    textBox.addEventListener("keydown", function (event) {
      const key = event.key;
      if (key === "Backspace" || key === "Delete") {
        event.preventDefault(); // Empêche le comportement par défaut de supprimer les caractères
        const heureSaisie = this.value;
        const nouvelleHeureSaisie = heureSaisie.slice(0, -1); // Supprimer le dernier caractère
        this.value = nouvelleHeureSaisie;
        const differenceMinutes = calculerDifferenceTemps(nouvelleHeureSaisie);
        const textBoxKilled = this.parentNode.parentNode.querySelector(
          'input[name^="killed"]'
        );
        if (textBoxKilled) {
          textBoxKilled.value = differenceMinutes;
        }
      }
    });
    bouton.parentNode.insertBefore(textBox, bouton.nextSibling);
    ajouterEvenementEntree(textBox, bouton); // Appel modifié
  });

    if (GM_getValue("AfficherFaiblesse", true)) {
const elementsTexte = document.querySelectorAll(":not(script):not(style):not(textarea):not(input)");

function ajouterTexteEtStyle(element, texte, style, texteAajouter) {
  const nouvelElement = document.createElement("b");
  nouvelElement.textContent = texteAajouter;
  nouvelElement.classList.add(style);
  element.appendChild(nouvelElement);
}

function ajouterTexte(element, texte, style, type) {
  if (!texte.includes(` (${type})`)) {
    ajouterTexteEtStyle(element, texte, `${type}-text`, ` (${type})`);
  }
}

elementsTexte.forEach((element) => {
  if (element.childNodes.length === 1 && element.childNodes[0].nodeType === Node.TEXT_NODE) {
    const texte = element.childNodes[0].nodeValue;
    for (const type in types) {
      if (types[type].some((mot) => texte.includes(mot))) {
        ajouterTexte(element, texte, type, type);
      }
    }
  }
});
    }
    else {
      const textClasses = [".Neutral-text", ".Water-text", ".Earth-text", ".Fire-text", ".Wind-text", ".Poison-text", ".Holy-text", ".Shadow-text", ".Ghost-text", ".Undead-text"];
textClasses.forEach((textClass) => {
  const elements = document.querySelectorAll(textClass);
  elements.forEach((element) => {
    element.parentNode.removeChild(element);
  });
});
}
}




// Ajouter le style CSS pour les classes fire-text et vent-text
const style = document.createElement("style");
style.textContent = `
    .Neutral-text { color: Orange; }
    .Water-text { color: blue; }
    .Earth-text { color: #784212; }
    .Fire-text { color: red; }
    .Wind-text { color: green; }
    .Poison-text { color: purple; }
    .Holy-text { color: #FF00FF; }
    .Shadow-text { color: #34495E; }
    .Ghost-text { color: gray; }
    .vent-text { Undead: Yellow; }
`;
document.head.appendChild(style);





function ajouterEvenementEntree(textBox, bouton) {
  textBox.addEventListener('keydown', function(event) {
    if (event.key === 'Enter') {
      event.preventDefault(); // Empêcher le comportement par défaut d'entrer une nouvelle ligne
      bouton.click(); // Simuler le clic sur le bouton
    }
  });
}

function postSet(killedBy, mvpId) {
  // Fonction vide ou votre implémentation réelle
}

function simulerClic(bouton) {
  const clicEvent = new MouseEvent('click', {
    view: window,
    bubbles: true,
    cancelable: true
  });
  bouton.dispatchEvent(clicEvent);
}


function ConnexionAutomatique() {
  if (GM_getValue("AutoConnexion", true)) {
    document.getElementById("txtPass").setAttribute("value", GM_getValue("NomDuServer", ""));
    var boutonImage1 = document.getElementById('btnSubmit');
    boutonImage1.click();
    setTimeout(function() {
      document.getElementById("txtDName").setAttribute("value", GM_getValue("Pseudo", ""));
      var boutonImage2 = document.getElementById('btnLogin');
      boutonImage2.click();
    }, 300);
  }
}

function afficherFenetreConfiguration() {
  const html = `
    <h2>Configuration</h2>
    <input type="checkbox" id="checkboxAfficherFaiblesse" ${
      GM_getValue("AfficherFaiblesse", true) ? "checked" : ""
    }>
    <label for="checkboxAfficherFaiblesse">Display the main weakness of the MVP</label>
    <br><br>
    <input type="checkbox" id="checkboxAutoConnexion" ${
      GM_getValue("AutoConnexion", false) ? "checked" : ""
    }>
    <label for="checkboxAutoConnexion">Enable Auto-Login</label>
    <br><br>
    <label for="nomDuServer">Server password :</label>
    <input type="text" id="nomDuServerInput" name="nomDuServer" value="${GM_getValue(
      "NomDuServer",
      ""
    )}">
    <br><br>
    <label for="pseudo">Pseudo :</label>
    <input type="text" id="pseudoInput" name="pseudo" value="${GM_getValue(
      "Pseudo",
      ""
    )}">
    <br><br>
    <button id="sauvegarderConfig">Save</button>
    <div style="position: absolute; bottom: 3px; right: 3px; text-align: right;">
      <div>Developed by Fri</div>
      <div>Discord: .fri.</div>
    </div>
  `;
  const container = document.createElement("div");
  container.innerHTML = html;
  container.style.position = "fixed";
  container.style.top = "20px";
  container.style.left = "20px";
  container.style.padding = "10px";
  container.style.backgroundColor = "white";
  container.style.border = "1px solid black";
  container.style.zIndex = "9999";
  document.body.appendChild(container);

  checkboxAutoConnexion = document.getElementById("checkboxAutoConnexion");
  nomDuServerInput = document.getElementById("nomDuServerInput");
  pseudoInput = document.getElementById("pseudoInput");
  checkboxAfficherFaiblesse = document.getElementById("checkboxAfficherFaiblesse");

  checkboxAutoConnexion.addEventListener("change", function () {
    if (this.checked) {
      nomDuServerInput.disabled = false;
      pseudoInput.disabled = false;
    } else {
      nomDuServerInput.disabled = true;
      pseudoInput.disabled = true;
    }
  });
    checkboxAfficherFaiblesse.addEventListener("change", function () {
    if (this.checked) {
      checkboxAfficherFaiblesse.disabled = false;
    } else {
      checkboxAfficherFaiblesse.disabled = true;
    }
  });

  const sauvegarderBtn = document.getElementById("sauvegarderConfig");
  sauvegarderBtn.addEventListener("click", function () {
    GM_setValue("AutoConnexion", checkboxAutoConnexion.checked);
    GM_setValue("AfficherFaiblesse", checkboxAfficherFaiblesse.checked);
    GM_setValue("NomDuServer", nomDuServerInput.value);
    GM_setValue("Pseudo", pseudoInput.value);
    container.remove();
    NomDuServer = GM_getValue("NomDuServer", "0");
    Pseudo = GM_getValue("Pseudo", "0");
    ConnexionAutomatique();
  });
}

window.addEventListener("load", function () {
  ajouterTextBoxEtCalculerDifference();
  ConnexionAutomatique();
});

function observerMutations(mutationsList) {
  for (let mutation of mutationsList) {
    if (mutation.type === "childList") {
      observer.disconnect();
      ajouterTextBoxEtCalculerDifference();
      observer.observe(document.body, config);
      break;
    }
  }
}

// Options de configuration pour l'observateur de mutations
const config = { childList: true, subtree: true };
const observer = new MutationObserver(observerMutations);
observer.observe(document.body, config);

const configBtn = document.createElement("img");
configBtn.src = "https://cdn-icons-png.flaticon.com/512/2099/2099058.png";
configBtn.style.position = "fixed";
configBtn.style.top = "30px";
configBtn.style.left = "30px";
configBtn.style.zIndex = "9999";
configBtn.style.width = "50px";
configBtn.style.height = "50px";
configBtn.style.cursor = "pointer"; // Modifier le curseur au survol
configBtn.addEventListener("click", afficherFenetreConfiguration);
document.body.appendChild(configBtn);