Greasy Fork

MZ_Track_Youth_Exchange_Players

Persist player data from Youth Academy page when swapping or rejecting players

目前为 2024-10-01 提交的版本。查看 最新版本

// ==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
// ==/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: playerData.totalSkillBalls,
            stats: playerData.stats,
            owner: username,
            season: currentSeason,
        };
    };

    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();
    });
})();