// ==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 // @downloadURL none // ==/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'; } } }); })();