ESPN BorisChenTiers

This script adds a row to the team and player page in ESPN Football Fantasy website with the boris chen tier

  1. // ==UserScript==
  2. // @name ESPN BorisChenTiers
  3. // @description This script adds a row to the team and player page in ESPN Football Fantasy website with the boris chen tier
  4. // @version 1.1
  5. // @grant GM.xmlHttpRequest
  6. // @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
  7. // @require https://greasyfork.org/scripts/31940-waitforkeyelements/code/waitForKeyElements.js?version=209282
  8. // @require https://greasyfork.org/scripts/431916-borischentiers/code/BorisChenTiers.js?version=968460
  9. // @include https://fantasy.espn.com/football/team?leagueId=*&teamId=*
  10. // @include https://fantasy.espn.com/football/players/add?leagueId=*
  11. // @namespace https://greasyfork.org/users/812226
  12. // ==/UserScript==
  13.  
  14. (async () => {
  15. const tierMap = await generateTiers(scoring.Standard,teamNames.espn);
  16. console.log(tierMap);
  17.  
  18. waitForKeyElements (
  19. ".players-table",
  20. (jNode) => {
  21. appendDataToTable(jNode, tierMap, true);
  22. addSelect();
  23. }
  24. );
  25. })();
  26.  
  27. const addSelect = () => {
  28. if (document.URL.includes('players')) {
  29. $($(".playersTableControls").children().get(1)).children().append(createSelect());
  30. } else {
  31. $(".playersTableControls").children().append(createSelect());
  32. }
  33. $('#Tier-ScoringSelect').on('change', async function() {
  34. const tierMap = await generateTiers(scoring[this.value], teamNames.espn);
  35.  
  36. appendDataToTable($(".players-table"), tierMap, false);
  37. });
  38. }
  39.  
  40. const appendDataToTable = (jNode, data, addHeader) => {
  41. const rows = jNode.children().find('tr');
  42. const insertAt = document.URL.includes('players') ? 0 : 1;
  43. rows.each((index, obj) => {
  44. if (index == 0) {
  45. $($(obj).children().get(1)).attr('colspan', 3);
  46. } else if (index == 1) {
  47. if (addHeader) {
  48. $($($(obj).children()).eq(insertAt)).after(createESPNStyledHeader('BorisChen <br/> Tier'));
  49. }
  50. } else {
  51. let tier = '-';
  52. const name = getName(obj);
  53. if (name !== undefined) {
  54. if (data[name] !== null && data[name] !== undefined) {
  55. tier = data[name] + 1;
  56. } else {
  57. console.log("could not match this player: " + name);
  58. }
  59.  
  60. if ($(obj).find("#BorisChenTier").length > 0) {
  61. $(obj).find("#BorisChenTier").text(tier);
  62. } else {
  63. $($($(obj).children()).eq(insertAt)).after(createTierCol(tier));
  64. }
  65. }
  66. }
  67. });
  68. };
  69.  
  70. const createSelect = () => {
  71. return `<div class="jsx-809230509 stats_split_select" style="padding-left: 20px">
  72. <div class="Dropdown__Wrapper di nowrap">
  73. <div class="Dropdown__Label n8 di mr3">
  74. BorisChen Tiers Scoring
  75. </div>
  76. <div class="dropdown">
  77. <svg aria-hidden="true" class="dropdown__arrow icon__svg" viewBox="0 0 24 24">
  78. <use xlink:href="#icon__caret__down">
  79. </use>
  80. </svg>
  81. <select id="Tier-ScoringSelect" class="dropdown__select" style="text-overflow: ellipsis; overflow: hidden; width: 100%;" name="1631051433931::e050000::aaa5ae95:8084:6f31:d2e9:171201276870">
  82. <option value="Standard">Std</option>
  83. <option value="PPR">PPR</option>
  84. <option value="Half">Half</option>
  85. </select>
  86. </div>
  87. </div>
  88. </div>`
  89. }
  90.  
  91. const createESPNStyledHeader = (title) => {
  92. return `<th class="BorisChenTierHeader Table__TH" style="text-align: center !important">
  93. ${title}
  94. </th>`
  95. };
  96.  
  97.  
  98. const createTierCol = (tier) => {
  99. return `<td class="Table__TD">
  100. <div class="table--cell total tar" style="text-align: center !important" id="BorisChenTier">
  101. ${tier}
  102. </div>
  103. </td>`;
  104. };
  105.  
  106. const getName = (jQueryNode) => {
  107. let name = $($(jQueryNode).find('.player__column')).attr('title');
  108. if (name === undefined) return name;
  109. if (name.includes("D/ST")) {
  110. name = name.replace(" D/ST", '');
  111. }
  112. return santizeString(name);
  113. };