// ==UserScript==
// @name MZ_Track_Youth_Exchange_Players
// @namespace http://tampermonkey.net/
// @version 2.2
// @description Persist player data from Youth Academy page when swapping or rejecting players — experiment
// @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. |");
const youthExchangePlayerAge = 16;
let username = 'Unknown';
let nationality = 'Unknown';
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 () {
console.log("Error fetching nationality.");
reject(new Error("Failed to fetch nationality"));
}
});
});
};
const getCountryFullName = async (shortName) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url: 'https://gist.githubusercontent.com/douglasdotv/ab34745e73c41fa612913e96a968fba9/raw/b21e8512e6a0ae2fb1f37d2fc547140435932b1d/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 () {
console.log("Error fetching full country name.");
reject(new Error("Failed to fetch country name"));
}
});
});
};
const sendDataToAzure = (youthExchangeObj) => {
GM_xmlhttpRequest({
method: "POST",
url: "https://youthexchangeapp-f3h6c6d6b5gcafa8.eastus-01.azurewebsites.net/youth-exchange",
headers: {
"Content-Type": "application/json"
},
data: JSON.stringify(youthExchangeObj),
onload: function (response) {
console.log(`Data sent. HTTP Status Code: ${response.status}. Response: ${response.responseText}`);
},
onerror: function (error) {
console.log('Error:', error);
}
});
};
const extractSkillNameAndLevel = (skillString) => {
const match = skillString.trim().match(/([HL])(\d+) (.+)/);
return match ? { level: parseInt(match[2]), name: match[3] } : { level: 0, name: skillString.trim() };
};
const preparePlayerData = (playerData) => {
return {
partitionKey: playerData.totalSkillBalls + "Balls",
rowKey: 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: playerData.totalSkillBalls,
owner: username,
stats: playerData.stats
};
};
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;
const skillName = skillsNames[index];
stats[skillName] = 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) {
let 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 skillsAndPotentials = extractSkillsAndPotentials(dataList);
const stats = extractPlayerStats(playerContainer);
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: stats,
...skillsAndPotentials
};
const youthExchangeObj = preparePlayerData(playerData);
sendDataToAzure(youthExchangeObj);
},
onerror: function () {
console.error("Error fetching player data.");
}
});
};
const setupEventListeners = () => {
const intervalId = setInterval(() => {
const rejectButton = document.querySelector('#discard_youth_button');
const exchangeButton = document.querySelector('#exchange_button');
if (rejectButton && !rejectButton.dataset.listenerAdded) {
rejectButton.addEventListener('click', extractPlayerData);
rejectButton.dataset.listenerAdded = true;
}
if (exchangeButton && !exchangeButton.dataset.listenerAdded) {
exchangeButton.addEventListener('click', extractPlayerData);
exchangeButton.dataset.listenerAdded = true;
}
if (rejectButton && exchangeButton) {
clearInterval(intervalId);
Swal.fire({
title: 'Ok!',
text: 'Listeners added to buttons.',
icon: 'success',
confirmButtonColor: '#333333',
confirmButtonText: 'Got it!',
background: '#1c1c1c',
color: '#ffffff',
customClass: {
confirmButton: 'sweetalert-dark-btn'
}
});
}
}, 150);
};
window.addEventListener('load', async () => {
const usernameElement = document.getElementById('header-username');
username = usernameElement ? usernameElement.textContent : 'Unknown';
try {
const countryShortName = await fetchNationality(username);
nationality = await getCountryFullName(countryShortName);
} catch (error) {
console.error(error);
nationality = 'Unknown';
}
setupEventListeners();
});
})();