Greasy Fork

Yahoo Team BorisChen

This script adds a row to the team page in Yahoo Football Fantasy with the boris chen tier

目前为 2021-09-04 提交的版本。查看 最新版本

// ==UserScript==
// @name     Yahoo Team BorisChen
// @description This script adds a row to the team page in Yahoo Football Fantasy with the boris chen tier
// @version  1.1
// @grant         GM.xmlHttpRequest
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js 
// @require https://greasyfork.org/scripts/31940-waitforkeyelements/code/waitForKeyElements.js?version=209282
// @include https://football.fantasysports.yahoo.com/f1/*/*/team*
// @include /^https?:\/\/football\.fantasysports\.yahoo\.com\/f1\/.*\/[0-9][0-9]?/
// @namespace https://greasyfork.org/users/812226
// ==/UserScript==

const TIER_TINTS = [
	"#1e6bb9",
  "#3479c0",
  "#4a88c7",
  "#6197ce",
  "#78a6d5",
  "#8eb5dc",
  "#a5c3e3",
  "#aec9e5",
  "#b7cfe8",
  "#c0d5eb",
  "#c9dbee",
  "#d2e1f1",
  "#dbe7f3",
  "#e4edf6",
  "#edf3f9",
  "#f6f9fc",
  "#ffffff"
];

const getHttp = (url) => {
	return new Promise(resolve => {
    GM.xmlHttpRequest({
      method: "GET",
      url: url,
      headers: {
        "Accept": "text/plain"
      },
      onload: resolve
		});
  });
}

(async () => {
  const tierMap = {};
  
  const wrPromise = getHttp("https://s3-us-west-1.amazonaws.com/fftiers/out/text_WR.txt")
    .then(response => parseTierText(response.responseText))
  	.then(wrTierMap => Object.assign(tierMap, wrTierMap));
  const rbPromise = getHttp("https://s3-us-west-1.amazonaws.com/fftiers/out/text_RB.txt")
    .then(response => parseTierText(response.responseText))
  	.then(rbTierMap => Object.assign(tierMap, rbTierMap));
  const qbPromise = getHttp("https://s3-us-west-1.amazonaws.com/fftiers/out/text_QB.txt")
    .then(response => parseTierText(response.responseText))
  	.then(qbTierMap => Object.assign(tierMap, qbTierMap));
  const tePromise = getHttp("https://s3-us-west-1.amazonaws.com/fftiers/out/text_TE.txt")
    .then(response => parseTierText(response.responseText))
  	.then(teTierMap => Object.assign(tierMap, teTierMap));
  const dstPromise = getHttp("https://s3-us-west-1.amazonaws.com/fftiers/out/text_DST.txt")
    .then(response => parseTierText(response.responseText, santizeTeamString))
  	.then(dstTierMap => Object.assign(tierMap, dstTierMap));
  const kPromise = getHttp("https://s3-us-west-1.amazonaws.com/fftiers/out/text_K.txt")
    .then(response => parseTierText(response.responseText))
  	.then(kTierMap => Object.assign(tierMap, kTierMap));

  await Promise.all([wrPromise, rbPromise, qbPromise, tePromise, dstPromise, kPromise]);

  waitForKeyElements (
    "#statTable0", 
    (jNode) => {
      appendDataToTable(jNode, tierMap);
    }
  );  
  waitForKeyElements (
    "#statTable1",
    (jNode) => {
      appendDataToTable(jNode, tierMap);
    }
  );
})();

const appendDataToTable = (jNode, data) => {  
  const rows = jNode.children().find('tr');
    
  let rowToInsert = 1;
  
  if ($(rows.get(0)).children().get(1).className.includes('Js-hidden')) {
    rowToInsert = 2;
  }
  
  rows.each((index, obj) => {
    if (index == 0) {
      
    } else if (index == 1) {
      $($($(obj).children()).eq(rowToInsert)).after(createYahooStyledHeader('BorisChen Tier'));
    } else {
      let tier = 'NR';
      const name = getName(obj);
      
      if (data[name] !== null && data[name] !== undefined) {
        tier = data[name] + 1;
      } else {
        console.log("could not match this player: " + name);
      }
                  
      $($($(obj).children()).eq(rowToInsert)).after(createTierCol(tier));
    }
  });
};


const parseTierText = (rawStr, sanitize = santizeString) => {
  const tierMap = {};
  const tiers = rawStr.split(/\r?\n/);
        
  tiers.forEach((tierStr, tier) => {
    if (tierStr != "") {
      const playerStr = tierStr.substring(tierStr.indexOf(":") + 2);
    
    	const players = playerStr.split(', ');
            
      players.forEach((player) => {
        tierMap[sanitize(player)] = tier;
      });
    }
  });
  
  return tierMap;
}

const createYahooStyledHeader = (title) => {
 return `<th class="ys-stat Hy(m)" title="${title}">
					<div class="ys-stat Whs-nw T-0 Pos-a P-4">
						${title}
						<i class="Icon Wpx-10 ys-dir0"></i>
					</div>
				</th>`
};

const createTierCol = (tier) => {
  const colour = tier < TIER_TINTS.length ? TIER_TINTS[tier - 1]
  								: TIER_TINTS[TIER_TINTS.length - 1];
  
	return `<td class="Alt Ta-c Bdrstart"
							style="background-color: ${colour}; opacity: 0.75">
						${tier}
					</td>`; 
};

const getName = (jQueryNode) => {  
  const nameCol = $($(jQueryNode).find('.player'));
	const nameRow = $(nameCol.find('.ysf-player-name'));
  const name = $(nameRow.children().get(0)).text();
    
  return santizeString(name);
};

const santizeString = (str) => {
  if (str === "Darrell Henderson") {
    str = "darrell henderson jr";
  }
  
	return str.toLowerCase()
    				.replace(/\./g, '')
  					.replace(/'/g, '');
};

const santizeTeamString = (str) => {
  str = str.substring(0, str.lastIndexOf(" ")); 
  
  return santizeString(str);
}