// ==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);
}