您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Mazyar Tools & Utilities
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/513041/1466977/MazyarTools.js
// ==UserScript== // @name MazyarTools // @namespace http://tampermonkey.net/ // @version 0.1 // @description Mazyar Tools & Utilities // @copyright z7z from managerzone.com // @author z7z from managerzone.com // @license MIT // @match https://www.managerzone.com/* // @match https://test.managerzone.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=managerzone.com // @supportURL https://github.com/mz-ir/mazyar // ==/UserScript== function mazyarParseMzDate(dateString) { const [day, month, year] = dateString.split('-').map(Number); return new Date(year, month - 1, day); } function mazyarParseMzDateTime(dateTimeString) { const [date, time] = dateTimeString.split(' '); const [day, month, year] = date.split('-').map(Number); const [hours, minutes] = time.split(':').map(Number); return new Date(year, month - 1, day, hours, minutes); } function mazyarGenerateUuidV4() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { const r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16); }); } function mazyarIsFilterHitsValid(hits) { return typeof hits === "number" && hits >= 0; } function mazyarHasDuplicates(array) { return new Set(array).size !== array.length; } function mazyarExtractSportType(doc = document) { const zone = doc.querySelector("a#shortcut_link_thezone"); if (zone) { return zone.href.indexOf("hockey") > -1 ? "hockey" : "soccer"; } return "soccer"; } function mazyarExtractClubCurrency(doc) { const players = doc.getElementById("playerAltViewTable")?.querySelectorAll("tbody tr"); if (players && players.length > 0) { const parts = players[0].querySelector("td:nth-child(3)")?.innerText.split(" "); return parts[parts.length - 1].trim(); } return ""; } function mazyarExtractNationalCurrency(doc) { // works for both domestic and foreign countries const playerNode = doc.getElementById("thePlayers_0")?.querySelector("table tbody tr:nth-child(6)"); if (playerNode) { const parts = playerNode.innerText.split(" "); return parts[parts.length - 1].trim(); } return ""; } function mazyarExtractTeamId(link) { const regex = /tid=(\d+)/; const match = regex.exec(link); return match ? match[1] : null; } function mazyarExtractPlayerIdFromProfileLink(link) { const regex = /pid=(\d+)/; const match = regex.exec(link); return match ? match[1] : null; } function mazyarExtractMatchId(link) { const regex = /mid=(\d+)/; const match = regex.exec(link); return match ? match[1] : null; } function mazyarExtractPlayerIdFromTransferMonitor(link) { const regex = /u=(\d+)/; const match = regex.exec(link); return match ? match[1] : null; } function mazyarExtractPlayerIdFromContainer(player) { return player?.querySelector("h2 span.player_id_span")?.innerText; } function mazyarIsMatchInProgress(resultText) { const scoreRegex = /\b(X|0|[1-9]\d*) - (X|0|[1-9]\d*)\b/; return !scoreRegex.test(resultText); } function mazyarGetSquadSummaryLink(tid) { return `https://${location.hostname}/?p=players&sub=alt&tid=${tid}`; } function mazyarFormatBigNumber(n, sep = " ") { if (n) { const numberString = n.toString(); let formattedParts = []; for (let i = numberString.length - 1; i >= 0; i -= 3) { let part = numberString.substring(Math.max(i - 2, 0), i + 1); formattedParts.unshift(part); } return formattedParts.join(sep); } return "0"; } function mazyarFormatAverageAge(age, fractionDigits = 1) { if (age) { return age.toFixed(fractionDigits); } return "0.0"; } function mazyarFormatFileSize(b) { const s = 1024; let u = 0; while (b >= s || -b >= s) { b /= s; u++; } return (u ? b.toFixed(1) + " " : b) + " KMGTPEZY"[u] + "B"; } function mazyarExtractClubPlayersDetails(doc, currency) { const players = []; const playerNodes = doc.querySelectorAll("table#playerAltViewTable tr"); for (const playerNode of playerNodes) { const age = playerNode.querySelector("td:nth-child(5)")?.innerText.replace(/\s/g, ""); if (age) { const value = playerNode.querySelector("td:nth-child(3)")?.innerText.replaceAll(currency, "").replace(/\s/g, ""); const shirtNumber = playerNode.querySelector("td:nth-child(0)")?.innerText.replace(/\s/g, ""); const pid = playerNode.querySelector("a")?.href; players.push({ shirtNumber, age: parseInt(age, 10), value: parseInt(value, 10), id: mazyarExtractPlayerIdFromProfileLink(pid), }); } } return players; } function mazyarExtractNumberOfFlags(infoTable) { const images = infoTable.getElementsByTagName("img"); return images ? [...images].filter((img) => img.src.indexOf("/flags/") > -1).length : 0; } function mazyarIsPlayerDomestic(infoTable) { return mazyarExtractNumberOfFlags(infoTable) === 1; } function mazyarExtractNationalPlayersDetails(doc, currency) { const players = []; const playerNodes = doc.querySelectorAll("div.playerContainer"); for (const playerNode of playerNodes) { const id = mazyarExtractPlayerIdFromProfileLink(playerNode.querySelector("h2 a")?.href); const infoTable = playerNode.querySelector("div.dg_playerview_info table"); const age = infoTable.querySelector("tbody tr:nth-child(1) td strong").innerText; const selector = mazyarIsPlayerDomestic(infoTable) ? "tbody tr:nth-child(5) td span" : "tbody tr:nth-child(6) td span"; const value = infoTable.querySelector(selector)?.innerText.replaceAll(currency, "").replace(/\s/g, ""); players.push({ age: parseInt(age, 10), value: parseInt(value, 10), id, }); } return players; } function mazyarGetNumberOfPlayers(players, ageLow = 0, ageHigh = 99) { return players.filter((player) => player.age <= ageHigh && player.age >= ageLow).length; } function mazyarFilterPlayers(players, count = 0, ageLow = 0, ageHigh = 99) { if (players.length === 0) { return { values: 0, avgAge: 0.0 }; } const n = count === 0 ? players.length : count; const filtered = players .filter((player) => player.age <= ageHigh && player.age >= ageLow) .sort((a, b) => b.value - a.value) .slice(0, n); if (filtered.length === 0) { return { values: 0, avgAge: 0.0 }; } const values = filtered.map((player) => player.value).reduce((a, b) => a + b, 0); const avgAge = filtered.map((player) => player.age).reduce((a, b) => a + b, 0) / filtered.length; return { values, avgAge }; } async function mazyarFetchNationalPlayersAndCurrency(tid, sport) { const url = `https://${location.hostname}/ajax.php?p=nationalTeams&sub=players&ntid=${tid}&sport=${sport}`; let players = []; let currency = ''; await fetch(url) .then((resp) => resp.text()) .then((content) => { const parser = new DOMParser(); const doc = parser.parseFromString(content, "text/html"); currency = mazyarExtractNationalCurrency(doc); players = mazyarExtractNationalPlayersDetails(doc, currency); }) .catch((error) => { console.warn(error); }); return { players, currency }; } async function mazyarFetchClubPlayersAndCurrency(tid) { const url = mazyarGetSquadSummaryLink(tid); let players = []; let currency = ''; await fetch(url) .then((resp) => resp.text()) .then((content) => { const parser = new DOMParser(); const doc = parser.parseFromString(content, "text/html"); currency = mazyarExtractClubCurrency(doc); players = mazyarExtractClubPlayersDetails(doc, currency); }) .catch((error) => { console.warn(error); }); return { players, currency }; } async function mazyarFetchPlayersAndCurrency(tid, sport) { const url = mazyarGetSquadSummaryLink(tid); const isNational = await fetch(url, { method: "HEAD" }) .then((resp) => (resp.url.search("p=national_teams") > -1)); return isNational ? await mazyarFetchNationalPlayersAndCurrency(tid, sport) : await mazyarFetchClubPlayersAndCurrency(tid); } function mazyarExtractClubTopPlyers(doc) { const currency = mazyarExtractClubCurrency(doc); const players = mazyarExtractClubPlayersDetails(doc, currency); const sport = mazyarExtractSportType(doc); const count = sport === "soccer" ? 11 : 21; return players ? mazyarFilterPlayers(players, count) : { values: 0, avgAge: 0 }; } async function mazyarExtractPlayersProfileDetails(teamId) { const url = `https://${location.hostname}/?p=players&tid=${teamId}`; return await fetch(url) .then((resp) => { return resp.text(); }).then((content) => { const parser = new DOMParser(); const doc = parser.parseFromString(content, "text/html"); const players = doc.getElementById("players_container")?.querySelectorAll("div.playerContainer"); const info = {}; for (const player of players) { const playerId = player.querySelector("span.player_id_span")?.innerText; const inMarket = [...player.querySelectorAll("a")].find((el) => el.href?.indexOf("p=transfer&sub") > -1); info[playerId] = { detail: player, shared: !!player.querySelector("i.special_player.fa-share-alt"), market: !!inMarket, marketLink: inMarket?.href, } } return info; }).catch((error) => { console.warn(error); return null; }); } function mazyarExtractSquadSummaryDetails(players, sport = "soccer") { if (!players) { return []; } const rows = []; if (sport === "hockey") { { const all = mazyarFilterPlayers(players); const top21 = mazyarFilterPlayers(players, 21); rows.push({ title: "All", count: players.length, all: all.values, allAge: all.avgAge, top21: top21.values, top21Age: top21.avgAge, }); } { const all = mazyarFilterPlayers(players, 0, 0, 23); const top21 = mazyarFilterPlayers(players, 21, 0, 23); rows.push({ title: "U23", count: mazyarGetNumberOfPlayers(players, 0, 23), all: all.values, allAge: all.avgAge, top21: top21.values, top21Age: top21.avgAge, }); } { const all = mazyarFilterPlayers(players, 0, 0, 21); const top21 = mazyarFilterPlayers(players, 21, 0, 21); rows.push({ title: "U21", count: mazyarGetNumberOfPlayers(players, 0, 21), all: all.values, allAge: all.avgAge, top21: top21.values, top21Age: top21.avgAge, }); } { const all = mazyarFilterPlayers(players, 0, 0, 18); const top21 = mazyarFilterPlayers(players, 21, 0, 18); rows.push({ title: "U18", count: mazyarGetNumberOfPlayers(players, 0, 18), all: all.values, allAge: all.avgAge, top21: top21.values, top21Age: top21.avgAge, }); } } else { { const all = mazyarFilterPlayers(players); const top16 = mazyarFilterPlayers(players, 16); const top11 = mazyarFilterPlayers(players, 11); rows.push({ title: "All", count: players.length, all: all.values, allAge: all.avgAge, top16: top16.values, top16Age: top16.avgAge, top11: top11.values, top11Age: top11.avgAge, }); } { const all = mazyarFilterPlayers(players, 0, 0, 23); const top16 = mazyarFilterPlayers(players, 16, 0, 23); const top11 = mazyarFilterPlayers(players, 11, 0, 23); rows.push({ title: "U23", count: mazyarGetNumberOfPlayers(players, 0, 23), all: all.values, allAge: all.avgAge, top16: top16.values, top16Age: top16.avgAge, top11: top11.values, top11Age: top11.avgAge, }); } { const all = mazyarFilterPlayers(players, 0, 0, 21); const top16 = mazyarFilterPlayers(players, 16, 0, 21); const top11 = mazyarFilterPlayers(players, 11, 0, 21); rows.push({ title: "U21", count: mazyarGetNumberOfPlayers(players, 0, 21), all: all.values, allAge: all.avgAge, top16: top16.values, top16Age: top16.avgAge, top11: top11.values, top11Age: top11.avgAge, }); } { const all = mazyarFilterPlayers(players, 0, 0, 18); const top16 = mazyarFilterPlayers(players, 16, 0, 18); const top11 = mazyarFilterPlayers(players, 11, 0, 18); rows.push({ title: "U18", count: mazyarGetNumberOfPlayers(players, 0, 18), all: all.values, allAge: all.avgAge, top16: top16.values, top16Age: top16.avgAge, top11: top11.values, top11Age: top11.avgAge, }); } } return rows; } async function mazyarFetchDocument(url) { return await fetch(url) .then((resp) => resp.text()) .then((content) => { const parser = new DOMParser(); return parser.parseFromString(content, "text/html"); }) .catch((error) => { console.warn(error); return null; }); } async function mazyarFetchJson(url) { return await fetch(url) .then((resp) => resp.json()) .catch((error) => { console.warn(error); return null; }); } async function mazyarFetchPlayerProfileDocument(playerId) { const url = `https://${location.hostname}/?p=players&pid=${playerId}`; return await mazyarFetchDocument(url); } async function mazyarFetchTransferMonitorData(sport = "soccer") { const url = `https://${location.hostname}/ajax.php?p=transfer&sub=your-bids&sport=${sport}`; return await mazyarFetchJson(url); } async function mazyarFetchSquadSummaryDocument(teamId) { const url = mazyarGetSquadSummaryLink(teamId); return await mazyarFetchDocument(url); }