Transfer extras

TI/XP Transfer List

  1. // ==UserScript==
  2. // @name Transfer extras
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description TI/XP Transfer List
  6. // @match https://trophymanager.com/transfer/
  7. // @grant none
  8. // ==/UserScript==
  9. (function() {
  10. 'use strict';
  11. const APPLICATION_CONST = {
  12. TRANSFER_LIST_SELECTOR: 'div#transfer_list',
  13. TI_HEADER_NAME: 'TI',
  14. XP_HEADER_NAME: 'XP',
  15. TI_COLUMN_POSITION: 6, // Counted from left, 0-indexed
  16. XP_COLUMN_POSITION: 11, // Counted from left, 0-indexed
  17. TI_PRECISION: 0,
  18. XP_PRECISION: 1
  19. };
  20. const PositionNames = {
  21. GOALKEEPER_STRING: 'GK'
  22. };
  23. /**
  24. * Gets players' IDs from page
  25. * @returns {string[]}
  26. */
  27. function getAllIDs() {
  28. let rows = document.querySelectorAll(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id^=player_row]');
  29. let ids = [];
  30. for(let row of rows) {
  31. ids.push(row.id.split('_')[2]);
  32. }
  33. return ids;
  34. }
  35. /**
  36. * @param {string} playerID
  37. */
  38. function getOldASI(playerID) {
  39. let playerRow = document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id=player_row_' + playerID + ']');
  40. let asiCell = playerRow.childNodes[5];
  41. let asi = asiCell.innerHTML.match(/[0-9]+/)[0];
  42. return Number(asi);
  43. }
  44. /**
  45. * @param {string} playerID
  46. * @returns {Promise<number>}
  47. */
  48. function requestPlayerASI(playerID) {
  49. return new Promise((resolve, reject) => {
  50. $.post("/ajax/tooltip.ajax.php", { "player_id": playerID, minigame: undefined })
  51. .done((data) => {
  52. data = JSON.parse(data);
  53. resolve({
  54. id: data.player.player_id,
  55. position: data.player.fp,
  56. ASI: Number(data.player.skill_index.split(',').join('')),
  57. xp: Number(data.player.routine.split(',').join(''))
  58. });
  59. }).fail((error) => {
  60. reject(error);
  61. });
  62. });
  63. }
  64. /**
  65. * @param {number} columnPosition
  66. * @param {string} headerName
  67. */
  68. function addColumnToTable(columnPosition, headerName) {
  69. let headerRow = document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr.header');
  70. let columns = headerRow.querySelectorAll('th');
  71. let columnsCount = columns.length;
  72. let headerCell = document.createElement('th');
  73. headerCell.style.width = '60px';
  74. headerCell.innerHTML = headerName;
  75. if(columnsCount > columnPosition + 1) {
  76. headerRow.insertBefore(headerCell, columns[columnPosition]);
  77. } else {
  78. headerRow.appendChild(headerCell);
  79. }
  80. let rows = document.querySelectorAll(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id^=player_row]');
  81. for(let row of rows) {
  82. if(row.childElementCount === 0) {
  83. continue;
  84. }
  85. let cell = document.createElement('td');
  86. cell.classList.add('align_center');
  87. cell.innerHTML = '-';
  88. if(columnsCount > columnPosition + 1) {
  89. row.insertBefore(cell, row.querySelectorAll('td')[columnPosition]);
  90. } else {
  91. row.appendChild(cell);
  92. }
  93. }
  94. }
  95. /**
  96. * @param {number} rowIndex
  97. * @param {number} columnIndex
  98. * @param {*} innerHTML Anything printable
  99. */
  100. function changeTransferTableCellInnerHTML(rowIndex, columnIndex, innerHTML) {
  101. let row = document.querySelectorAll(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' tr[id]');
  102. if(row[rowIndex].childElementCount === 0) {
  103. return;
  104. }
  105. row[rowIndex].childNodes[columnIndex].innerHTML = innerHTML;
  106. }
  107. let TI = {
  108. /**
  109. * @param {number} asiNew
  110. * @param {number} asiOld
  111. * @param {string} position
  112. * @returns {number} calculated TI
  113. */
  114. compute: function(asiNew, asiOld, position) {
  115. let pow = Math.pow;
  116. if(position === PositionNames.GOALKEEPER_STRING) {
  117. 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;
  118. } else {
  119. 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;
  120. }
  121. }
  122. };
  123. /**
  124. * Requests necessary data and displays current ASI
  125. * @param {MutationRecord[]} mutationRecords
  126. */
  127. function init(mutationRecords) {
  128. if(document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR + ' table') === null) {
  129. return;
  130. }
  131. let playersIDs = getAllIDs();
  132. addColumnToTable(APPLICATION_CONST.TI_COLUMN_POSITION, APPLICATION_CONST.TI_HEADER_NAME);
  133. addColumnToTable(APPLICATION_CONST.XP_COLUMN_POSITION, APPLICATION_CONST.XP_HEADER_NAME);
  134. // Request in parallel
  135. playersIDs.map(requestPlayerASI).map((promise, index) => {
  136. promise.then((player) => {
  137. let oldASI = getOldASI(player.id);
  138. let ti = TI.compute(player.ASI, oldASI, player.position).toFixed(APPLICATION_CONST.TI_PRECISION);
  139. let xp = player.xp.toFixed(APPLICATION_CONST.XP_PRECISION);
  140. changeTransferTableCellInnerHTML(index, APPLICATION_CONST.TI_COLUMN_POSITION, ti);
  141. changeTransferTableCellInnerHTML(index, APPLICATION_CONST.XP_COLUMN_POSITION, xp);
  142. }).catch((error) => {
  143. changeTransferTableCellInnerHTML(index, APPLICATION_CONST.TI_COLUMN_POSITION, "Error");
  144. changeTransferTableCellInnerHTML(index, APPLICATION_CONST.XP_COLUMN_POSITION, "Error");
  145. });
  146. });
  147. }
  148. let observer = new MutationObserver(init);
  149. observer.observe(document.querySelector(APPLICATION_CONST.TRANSFER_LIST_SELECTOR), { childList: true });
  150. })();
  151.  

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址