您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a Button to view logs in xivanalysis also some minor improvements.
当前为
- // ==UserScript==
- // @name FF Progs
- // @name:en FF Progs
- // @namespace k_fizzel
- // @version 1.0.3
- // @author Chad Bradly
- // @description Adds a Button to view logs in xivanalysis also some minor improvements.
- // @description:en Adds a Button to view logs in xivanalysis also some minor improvements.
- // @website https://www.fflogs.com/character/id/12781922
- // @icon https://assets.rpglogs.com/img/ff/favicon.png?v=2
- // @match https://*.etro.gg/*
- // @match https://*.fflogs.com/*
- // @grant unsafeWindow
- // @grant GM_addStyle
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_deleteValue
- // @license MIT License
- // ==/UserScript==
- (function () {
- "use strict";
- //check if the domain is fflogs.com
- if (/fflogs\.com/.test(location.hostname)) {
- // Adblocker
- $("#top-banner, .side-rail-ads, #bottom-banner, #subscription-message-tile-container, #playwire-video-container, #right-ad-box, #right-vertical-banner").remove();
- $("#table-container").css("margin", "0 0 0 0");
- if (/\/reports\/.+/.test(location.pathname)) {
- // Add XIV Analysis Button
- $("#filter-analyze-tab").before(
- `<a href="https://xivanalysis.com/report-redirect/${location.href}" target="_blank" class="big-tab view-type-tab" id="xivanalysis-tab"><span class="zmdi zmdi-time-interval"></span> <span class="big-tab-text"><br>xivanalysis</span></a>`
- );
- $("#xivanalysis-tab").click(() => {
- $("#xivanalysis-tab").attr("href", `https://xivanalysis.com/report-redirect/${location.href}`);
- });
- let jobs;
- const rankOnes = {};
- const tableContainer = document.querySelector("#table-container");
- const getHash = () => {
- return location.hash
- .replace("#", "")
- .split("&")
- .reduce((res, item) => {
- const parts = item.split("=");
- res[parts[0]] = parts[1];
- return res;
- }, {});
- };
- const characterAllStar = (rank, outOf, rDPS, rankOneRDPS) => {
- return Math.min(Math.max(100 * (rDPS / rankOneRDPS), 100 - (rank / outOf) * 100) + 20 * (rDPS / rankOneRDPS), 120);
- };
- const addASPToTables = () => {
- if (getHash().view === "rankings") {
- if (!GM_getValue("apiKey")) return;
- const rows = [];
- if (!jobs) {
- fetch(`https://www.fflogs.com/v1/classes?api_key=${GM_getValue("apiKey")}`)
- .then((res) => res.json())
- .then((data) => {
- jobs = data[0].specs;
- rows.forEach((row) => {
- updatePoints(row);
- });
- })
- .catch((err) => console.error(err));
- } else {
- setTimeout(() => {
- rows.forEach((row) => {
- updatePoints(row);
- });
- }, 0);
- }
- const updatePoints = async (row) => {
- const rank = Number($(row).find("td:nth-child(2)").text().replace("~", ""));
- const outOf = Number($(row).find("td:nth-child(3)").text().replace(",", ""));
- const dps = Number($(row).find("td:nth-child(6)").text().replace(",", ""));
- const jobName = $(row).find("td:nth-child(5) > a").attr("class") || "";
- const jobName2 = $(row).find("td:nth-child(5) > a:nth-last-child(1)").attr("class") || "";
- const playerMetric = getHash().playermetric || "rdps";
- if (jobName2 !== "players-table-realm") {
- $(row)
- .find("td:nth-child(7)")
- .html(`<center><img src="https://cdn.7tv.app/emote/62523dbbbab59cfd1b8b889d/1x.webp" title="no api endpoint for combind damage" style="height: 15px;"></center>`);
- return;
- }
- const updateCharecterAllStar = async () => {
- $(row).find("td:nth-child(7)").html(characterAllStar(rank, outOf, dps, rankOnes[jobName][playerMetric]).toFixed(2));
- };
- if (!rankOnes[jobName]) {
- rankOnes[jobName] = {};
- }
- if (!rankOnes[jobName][playerMetric]) {
- const url = `https://www.fflogs.com/v1/rankings/encounter/${reportsCache.filterFightBoss}?metric=${playerMetric}&spec=${
- jobs.find((job) => job.name.replace(" ", "") === jobName)?.id
- }&api_key=${GM_getValue("apiKey")}`;
- fetch(url)
- .then((res) => res.json())
- .then((data) => {
- rankOnes[jobName][playerMetric] = Number(data.rankings[0].total.toFixed(1));
- updateCharecterAllStar();
- })
- .catch((err) => console.error(err));
- } else {
- updateCharecterAllStar();
- }
- };
- $(".player-table").each((_i, table) => {
- $(table)
- .find("thead tr th:nth-child(6)")
- .after(
- `<th class="sorting ui-state-default" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Patch: activate to sort column ascending"><div class="DataTables_sort_wrapper">Points<span class="DataTables_sort_icon css_right ui-icon ui-icon-caret-2-n-s"></span></div></th>`
- );
- $(table)
- .find("tbody tr")
- .each((_i, row) => {
- $(row)
- .find("td:nth-child(6)")
- .after(`<td class="rank-per-second primary main-table-number"><center><span class="zmdi zmdi-spinner zmdi-hc-spin" style="color:white font-size:24px"></center></span></td>`);
- rows.push(row);
- });
- });
- }
- };
- if (tableContainer) {
- const observer = new MutationObserver(addASPToTables);
- observer.observe(tableContainer, { attributes: true, characterData: true, childList: true });
- }
- }
- if (/\/zone\/.+/.test(location.pathname)) {
- const verticalContent = document.querySelector(".vertical-content");
- const contentAndAds = document.querySelector(".content--full-width");
- const pageContainer = document.querySelector(".progress-race-page-container");
- const removeAdds = () => {
- const elements = document.querySelectorAll(".content-and-ads__ads");
- const resize = document.querySelector(".content-and-ads--with-ads");
- const resize2 = document.querySelector(".content-and-ads__content");
- if (resize) {
- resize.style = "grid-template-columns: 1fr !important;";
- resize2.style = "grid-template-columns: 1fr !important;";
- }
- for (const element of elements) {
- if (element) {
- element.remove();
- }
- }
- };
- if (verticalContent) {
- const observer = new MutationObserver(removeAdds);
- observer.observe(verticalContent, { attributes: true, characterData: true, childList: true });
- }
- if (contentAndAds) {
- const observer = new MutationObserver(removeAdds);
- observer.observe(contentAndAds, { attributes: true, characterData: true, childList: true });
- }
- if (pageContainer) {
- const observer = new MutationObserver(removeAdds);
- observer.observe(pageContainer, { attributes: true, characterData: true, childList: true });
- }
- }
- if (/\/character\/.+/.test(location.pathname)) {
- $(".table-icon").removeAttr("alt");
- const jobOrder = [
- "Paladin",
- "Warrior",
- "DarkKnight",
- "Gunbreaker",
- "WhiteMage",
- "Scholar",
- "Astrologian",
- "Sage",
- "Monk",
- "Dragoon",
- "Ninja",
- "Samurai",
- "Reaper",
- "Bard",
- "Machinist",
- "Dancer",
- "BlackMage",
- "Summoner",
- "RedMage",
- ];
- const jobList = $("#jobs-header-icons").children();
- const jobListSortedNumbers = [];
- const jobListSorted = [];
- jobOrder.forEach((job) =>
- jobList
- .children()
- .toArray()
- .forEach((jobElement, i) => {
- if (jobElement.alt === job) jobListSortedNumbers.push(i);
- })
- );
- jobListSortedNumbers.forEach((i) => jobListSorted.push(jobList[i]));
- jobList.remove();
- $("#jobs-header-icons").append(jobListSorted);
- // Chad Bradly's Profile Customization
- if (/\/character\/id\/12781922/.test(location.pathname)) {
- $("#character-portrait-image").attr("src", "https://media.tenor.com/epNMHGvRyHcAAAAd/gigachad-chad.gif");
- $("#portrait-and-basics, #character-header-customize-action-box, #update-box").addClass("slightly-transparent-box");
- $("#character-portrait-box").css("background-image", 'url("https://i.imgur.com/dbwqHIt.png")').addClass("with-banner");
- }
- }
- if (/\/profile/.test(location.pathname)) {
- let apiKey = GM_getValue("apiKey");
- $("#api").after(`<div id="extension" class="dialog-block"></div>`);
- $("#extension").append(`<div id="extension-title" class="dialog-title">FF Progs</div>`);
- $("#extension").append(`<div id="extension-content" style="margin:1em"></div>`);
- const addApiInput = () => {
- $("#extension-content").append(`<div id="extension-contents" style="margin:1em">Enter your FFLogs API Key</div>`);
- $("#extension-content").append(`<input type=text id="apiKeyInput" style="margin-left: 10px">`);
- $("#extension-content").append(`<input type=button id="apiButton" style="margin-left: 10px" value="Save API Key">`);
- $("#apiButton").click(() => {
- apiKey = $("#apiKeyInput").val();
- GM_setValue("apiKey", apiKey);
- $("#apiButton").remove();
- $("#apiKeyInput").remove();
- $("#extension-content").append(`<div id="resloved-text" style="margin:1em">API Key Saved</div>`);
- setTimeout(() => {
- $("#extension-contents").remove();
- $("#resloved-text").remove();
- removeApiInput();
- }, 2000);
- });
- };
- const removeApiInput = () => {
- $("#extension-content").append(`<input type=button id="apiDeleteButton" style="margin-left: 10px" value="Remove API Key">`);
- $("#apiDeleteButton").click(() => {
- GM_deleteValue("apiKey");
- $("#apiDeleteButton").remove();
- $("#extension-content").append(`<div id="resloved-text" style="margin:1em">API Key Removed</div>`);
- setTimeout(() => {
- $("#resloved-text").remove();
- addApiInput();
- }, 2000);
- });
- };
- if (!apiKey) {
- addApiInput();
- } else {
- removeApiInput();
- }
- }
- }
- if (/etro\.gg/.test(location.hostname)) {
- document.querySelector(".mantine-Header-root").style.marginBottom = "0px";
- const body = document.querySelector(".mantine-AppShell-main");
- const removeAdGearset = () => {
- const elements = document.querySelectorAll('[id^="etro-ad"]');
- for (const element of elements) {
- if (element) {
- element.remove();
- }
- }
- };
- if (body) {
- const observer = new MutationObserver(removeAdGearset);
- observer.observe(body, { attributes: true, characterData: true, childList: true });
- }
- }
- })();