Transfer extras

TI/XP Transfer List

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         Transfer extras
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  TI/XP Transfer List
// @match        https://trophymanager.com/transfer/
// @grant        none
// ==/UserScript==
(function() {
    'use strict';
    const APPLICATION_CONST = {
        TRANSFER_LIST_SELECTOR: 'div#transfer_list',
        TI_HEADER_NAME: 'TI',
        XP_HEADER_NAME: 'XP',
        TI_COLUMN_POSITION: 6, // Counted from left, 0-indexed
        XP_COLUMN_POSITION: 11, // Counted from left, 0-indexed
        TI_PRECISION: 0,
        XP_PRECISION: 1
    };
    const PositionNames = {
        GOALKEEPER_STRING: 'GK'
    };
    /**
     * Gets players' IDs from page
     * @returns {string[]}
     */
    function getAllIDs() {
        let rows = document.querySelectorAll(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id^=player_row]');
        let ids = [];
        for(let row of rows) {
            ids.push(row.id.split('_')[2]);
        }
        return ids;
    }
    /**
     * @param {string} playerID
     */
    function getOldASI(playerID) {
        let playerRow = document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id=player_row_' + playerID + ']');
        let asiCell = playerRow.childNodes[5];
        let asi = asiCell.innerHTML.match(/[0-9]+/)[0];
        return Number(asi);
    }
    /**
     * @param {string} playerID
     * @returns {Promise<number>}
     */
    function requestPlayerASI(playerID) {
        return new Promise((resolve, reject) => {
            $.post("/ajax/tooltip.ajax.php", { "player_id": playerID, minigame: undefined })
            .done((data) => {
                data = JSON.parse(data);
                resolve({
                    id: data.player.player_id,
                    position: data.player.fp,
                    ASI: Number(data.player.skill_index.split(',').join('')),
                    xp: Number(data.player.routine.split(',').join(''))
                });
            }).fail((error) => {
                reject(error);
            });
        });
    }
    /**
     * @param {number} columnPosition
     * @param {string} headerName
     */
    function addColumnToTable(columnPosition, headerName) {
        let headerRow = document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr.header');
        let columns = headerRow.querySelectorAll('th');
        let columnsCount = columns.length;
        let headerCell = document.createElement('th');
        headerCell.style.width = '60px';
        headerCell.innerHTML = headerName;
        if(columnsCount > columnPosition + 1) {
            headerRow.insertBefore(headerCell, columns[columnPosition]);
        } else {
            headerRow.appendChild(headerCell);
        }
        let rows = document.querySelectorAll(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id^=player_row]');
        for(let row of rows) {
            if(row.childElementCount === 0) {
                continue;
            }
            let cell = document.createElement('td');
            cell.classList.add('align_center');
            cell.innerHTML = '-';
            if(columnsCount > columnPosition + 1) {
                row.insertBefore(cell, row.querySelectorAll('td')[columnPosition]);
            } else {
                row.appendChild(cell);
            }
        }
    }
    /**
     * @param {number} rowIndex
     * @param {number} columnIndex
     * @param {*} innerHTML Anything printable
     */
    function changeTransferTableCellInnerHTML(rowIndex, columnIndex, innerHTML) {
        let row = document.querySelectorAll(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id]');
        if(row[rowIndex].childElementCount === 0) {
            return;
        }
        row[rowIndex].childNodes[columnIndex].innerHTML = innerHTML;
    }
    let TI = {
        /**
         * @param {number} asiNew
         * @param {number} asiOld
         * @param {string} position
         * @returns {number} calculated TI
         */
        compute: function(asiNew, asiOld, position) {
            let pow = Math.pow;
            if(position === PositionNames.GOALKEEPER_STRING) {
                return (pow(asiNew * pow(2, 9) * pow(5, 4) * pow(7, 7), 1/7) - pow(asiOld * pow(2, 9) * pow(5, 4) * pow(7, 7), 1/7)) / 14 * 11 * 10;
            } else {
                return (pow(asiNew * pow(2, 9) * pow(5, 4) * pow(7, 7), 1/7) - pow(asiOld * pow(2, 9) * pow(5, 4) * pow(7, 7), 1/7)) * 10;
            }
        }
    };
    /**
     * Requests necessary data and displays current ASI
     * @param {MutationRecord[]} mutationRecords
     */
    function init(mutationRecords) {
        if(document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' table') === null) {
            return;
        }
        let playersIDs = getAllIDs();
        addColumnToTable(APPLICATION_CONST.TI_COLUMN_POSITION, APPLICATION_CONST.TI_HEADER_NAME);
        addColumnToTable(APPLICATION_CONST.XP_COLUMN_POSITION, APPLICATION_CONST.XP_HEADER_NAME);
        // Request in parallel
        playersIDs.map(requestPlayerASI).map((promise, index) => {
            promise.then((player) => {
                let oldASI = getOldASI(player.id);
                let ti = TI.compute(player.ASI, oldASI, player.position).toFixed(APPLICATION_CONST.TI_PRECISION);
                let xp = player.xp.toFixed(APPLICATION_CONST.XP_PRECISION);
                changeTransferTableCellInnerHTML(index, APPLICATION_CONST.TI_COLUMN_POSITION, ti);
                changeTransferTableCellInnerHTML(index, APPLICATION_CONST.XP_COLUMN_POSITION, xp);
            }).catch((error) => {
                changeTransferTableCellInnerHTML(index, APPLICATION_CONST.TI_COLUMN_POSITION, "Error");
                changeTransferTableCellInnerHTML(index, APPLICATION_CONST.XP_COLUMN_POSITION, "Error");
            });
        });
    }
    let observer = new MutationObserver(init);
    observer.observe(document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR), { childList: true });
})();