NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name 101 - Leveling planner // @namespace https://openuserjs.org/scripts/metazeta/101_-_Leveling_planner // @version 0.4 // @author Emmanuel Ruaud and Benjamin Fuhro // @description Estimates total XP on user profiles and gives the amount won by past projects // @match https://profile.intra.42.fr/users/* // @match https://profile.intra.42.fr/ // @match https://profile.intra.42.fr/users/*/experiences/*/* // @updateURL https://openuserjs.org/meta/metazeta/101_-_Leveling_planner.meta.js // @license MIT // ==/UserScript== function get_max_xp(lvl) { return (100 * Math.pow(1.135, lvl + 1)); } function get_delta_xp(split1, split2) { let diff_lvl = 0; let i; for (i = Number(split1[0]); i <= Number(split2[0]); i++) { diff_lvl += get_max_xp(i); } let prev_lvl = Number(split1[1]) * get_max_xp(Number(split1[0])) / 100; let next_lvl = (100 - Number(split2[1])) * get_max_xp(Number(split2[0])) / 100; console.log(split1, split2); console.log(diff_lvl, next_lvl, prev_lvl); return (diff_lvl - next_lvl - prev_lvl); } function get_project() { let progress = document.getElementsByClassName("on-progress"); for (let i = 0; i < progress.length; ++i) { let lvlstr = progress[i].innerText || progress[i].textContent; let fraction = Number(parseFloat(lvlstr.match(/\d+\%/)[0])); let lvl = Number(parseFloat(lvlstr.match(/\d+ -/)[0])); let maxlvl = get_max_xp(Number(lvl)); let text = document.createTextNode(" (" + Math.round(fraction / 100 * maxlvl) + "/" + Math.round(maxlvl) + " XP)"); progress[i].appendChild(text); } } function experience() { let lvlbox = document.getElementsByTagName("code"); let reasons = document.getElementsByClassName("reason"); let lvlstr; let split_prev = [0, 0]; let split; let deltaXP; let i = lvlbox.length - 1; while (lvlbox[i]) { lvlstr = lvlbox[i].innerText || lvlbox[i].textContent; split = lvlstr.split("."); deltaXP = Math.round(get_delta_xp(split_prev, split)); reasons[i].innerHTML = reasons[i].innerHTML + "<div style='font-size:12px;color:#73BDBC;display:inline-block;left:60%;'> +" + deltaXP + " XP" + "</div>"; split_prev = split; i--; } } (function () { 'use strict'; if ((document.baseURI).match(/^https:\/\/profile\.intra\.42\.fr\/users\/[a-z0-9-_]+$/i) || (document.baseURI).match(/^https:\/\/profile\.intra\.42\.fr\/$/i) ) { get_project(); } else { experience(); } })();