// ==UserScript==
// @name MZ_Track_Youth_Exchange_Players
// @namespace http://tampermonkey.net/
// @version 2.4
// @description Persist player data from Youth Academy page when swapping or rejecting players
// @author You
// @match *://www.managerzone.com/?p=youth_academy*
// @grant GM_xmlhttpRequest
// @require https://cdn.jsdelivr.net/npm/sweetalert2@11
// @license MIT
// ==/UserScript==
(function () {
'use strict';
console.log("| MZ_Track_Youth_Exchange_Players is running and will save youth exchange data to db. |");
/* You can put your own username and country here */
const usernameCountryMap = { douglaskampl: 'BR' };
const youthExchangePlayerAge = 16;
let username = 'Unknown';
let nationality = 'Unknown';
const currentSeason = document.querySelector('#header-stats-wrapper h5.linked').textContent.match(/(\d+)/)[1];
const showToast = (color, message) => {
Swal.fire({
toast: true,
position: 'bottom-right',
iconColor: color,
icon: color === 'blue' ? 'info' : color === 'green' ? 'success' : 'error',
title: message,
showConfirmButton: false,
timer: 3000,
background: color,
color: 'white'
});
};
const fetchNationality = async (username) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url: `http://www.managerzone.com/xml/manager_data.php?sport_id=1&username=${username}`,
onload: function (response) {
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(response.responseText, "text/xml");
const countryShortname = xmlDoc.querySelector('UserData') ? xmlDoc.querySelector('UserData').getAttribute('countryShortname') : 'Not found';
resolve(countryShortname);
},
onerror: function () {
reject(new Error("Failed to fetch nationality"));
}
});
});
};
const getCountryFullName = async (shortName) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url: 'https://u18mz.vercel.app/json/countries.json',
onload: function (response) {
const countries = JSON.parse(response.responseText);
const country = countries.find(c => c.code === shortName);
resolve(country ? country.name : shortName);
},
onerror: function () {
reject(new Error("Failed to fetch country name"));
}
});
});
};
const sendDataToFirebase = (youthExchangeObj) => {
showToast('blue', 'Sending data...');
GM_xmlhttpRequest({
method: "POST",
url: "https://youth-exchange-worker.douglasdotv.workers.dev/",
headers: { "Content-Type": "application/json" },
data: JSON.stringify(youthExchangeObj),
onload: function (response) {
const responseText = response.responseText || 'No additional information provided';
if (response.status >= 200 && response.status < 300) {
showToast('green', `Success! Data sent successfully. ${responseText}`);
} else {
showToast('red', `Unexpected Error (${response.status}): ${responseText}`);
}
},
onerror: function () {
showToast('red', 'Network Error: Failed to send data');
}
});
};
const preparePlayerData = (playerData) => {
return {
id: playerData.playerID,
name: playerData.playerName,
age: youthExchangePlayerAge,
country: nationality,
hp: playerData.hp,
firstHpSkill: playerData.firstHpSkill,
secondHpSkill: playerData.secondHpSkill,
lp: playerData.lp,
firstLpSkill: playerData.firstLpSkill,
secondLpSkill: playerData.secondLpSkill,
trainingSpeed: playerData.trainingSpeed,
totalBalls: parseInt(playerData.totalSkillBalls, 10),
owner: username,
stats: playerData.stats,
season: parseInt(currentSeason, 10),
};
};
const extractPlayerStats = (playerContainer) => {
const stats = {};
const skillsNames = [
"speed", "stamina", "playIntelligence", "passing", "shooting",
"heading", "keeping", "ballControl", "tackling", "aerialPassing", "setPlays",
"experience", "form"
];
const skillsRows = playerContainer.querySelectorAll('.player_skills tr');
skillsRows.forEach((row, index) => {
if (index < skillsNames.length) {
const skillValueElement = row.querySelector('.skillval span');
const skillValue = skillValueElement ? parseInt(skillValueElement.textContent.trim()) : 0;
stats[skillsNames[index]] = skillValue;
}
});
return stats;
};
const extractPlayerData = () => {
const playerContainer = document.getElementById("thePlayers_x");
if (!playerContainer) return;
GM_xmlhttpRequest({
method: "GET",
url: `https://www.managerzone.com/ajax.php?p=players&sub=scout_report&pid=null&sport=soccer`,
onload: function (response) {
const responseText = response.responseText.replace(/Trzxyvopaxis/g, '');
const parser = new DOMParser();
const doc = parser.parseFromString(responseText, "text/html");
const dataList = doc.querySelectorAll('dl > dd');
const extractSkillsAndPotentials = (skillContainers) => {
const skills = {
firstHpSkill: "",
secondHpSkill: "",
firstLpSkill: "",
secondLpSkill: ""
};
if (skillContainers.length > 1) {
const hpSkills = Array.from(skillContainers[0].querySelectorAll('li > span:last-child')).map(span => span.textContent.trim());
const lpSkills = Array.from(skillContainers[1].querySelectorAll('li > span:last-child')).map(span => span.textContent.trim());
if (hpSkills.length >= 2) {
skills.firstHpSkill = hpSkills[0];
skills.secondHpSkill = hpSkills[1];
}
if (lpSkills.length >= 2) {
skills.firstLpSkill = lpSkills[0];
skills.secondLpSkill = lpSkills[1];
}
}
return skills;
};
const playerData = {
playerID: playerContainer.querySelector('.player_id_span').textContent,
playerName: playerContainer.querySelector('.player_name').textContent,
hp: dataList[0].querySelectorAll('.lit').length,
lp: dataList[1].querySelectorAll('.lit').length,
totalSkillBalls: playerContainer.querySelectorAll('tbody > tr')[6].querySelector('.bold').textContent,
trainingSpeed: dataList[2].querySelectorAll('.lit').length,
stats: extractPlayerStats(playerContainer),
...extractSkillsAndPotentials(dataList)
};
sendDataToFirebase(preparePlayerData(playerData));
}
});
};
const setUpEventListeners = () => {
const observeRejectButton = () => {
const rejectButton = document.querySelector('#discard_youth_button');
if (rejectButton && !rejectButton.dataset.listenerAdded) {
rejectButton.addEventListener('click', extractPlayerData);
rejectButton.dataset.listenerAdded = true;
}
};
const exchangeButton = document.querySelector('#exchange_button');
if (exchangeButton && !exchangeButton.dataset.listenerAdded) {
exchangeButton.addEventListener('click', extractPlayerData);
exchangeButton.dataset.listenerAdded = true;
}
const playerContainer = document.getElementById("thePlayers_x");
if (playerContainer) {
const observer = new MutationObserver(observeRejectButton);
observer.observe(playerContainer, { childList: true, subtree: true });
observeRejectButton();
}
};
const checkForPlayerContainer = () => {
const playerContainer = document.getElementById("thePlayers_x");
if (playerContainer) {
setUpEventListeners();
clearInterval(containerCheckInterval);
}
};
const containerCheckInterval = setInterval(checkForPlayerContainer, 1000);
window.addEventListener('load', async () => {
const usernameElement = document.getElementById('header-username');
username = usernameElement ? usernameElement.textContent : 'Unknown';
if (usernameCountryMap[username]) {
nationality = usernameCountryMap[username];
} else {
try {
const countryShortName = await fetchNationality(username);
nationality = await getCountryFullName(countryShortName);
} catch {
nationality = 'Unknown';
}
}
});
})();