Greasy Fork

MZ_Track_Youth_Exchange_Players

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

目前为 2024-11-09 提交的版本。查看 最新版本

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