// ==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 // @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 userscript is running and will save youth exchange data to Firebase. |"); const youthExchangePlayerAge = 16; let username = 'Unknown'; let nationality = 'Unknown'; const currentSeason = document.querySelector('#header-stats-wrapper h5.linked').textContent.match(/(\d+)/)[1]; 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 sendDataToFirebase = (youthExchangeObj) => { GM_xmlhttpRequest({ method: "POST", url: "https://addyouthexchangedata-abu7c67mua-uc.a.run.app", /* Cloud Run function URL */ 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 { 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), stats: playerData.stats, owner: username, 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; 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); sendDataToFirebase(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(); }); })();