您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
TI/XP Transfer List
// ==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 }); })();