Skip to content

Instantly share code, notes, and snippets.

@Jed-Giblin
Last active March 3, 2023 15:21
Show Gist options
  • Save Jed-Giblin/8ec30d2d721cca03197bdbb8a5199660 to your computer and use it in GitHub Desktop.
Save Jed-Giblin/8ec30d2d721cca03197bdbb8a5199660 to your computer and use it in GitHub Desktop.
Tampermonkey script to colate and document commander deck colors for your profile in moxfield
// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://www.moxfield.com/decks/personal
// @icon https://www.google.com/s2/favicons?sz=64&domain=moxfield.com
// @grant GM.xmlHttpRequest
// ==/UserScript==
const CACHE_PREFIX = 'cc-challenge';
(async () => {
'use strict';
async function getCommanderColorIdentity(deckUri) {
console.log(`Checking cache for ${deckUri}`);
let cachedValue = readCache( deckUri );
if ( cachedValue === null ) {
console.log(`No value in cache for ${deckUri}`);
let apiValue = await getColorIdentityFromApi( deckUri );
console.log(`Got a value of ${apiValue}`);
writeCache( deckUri, apiValue );
cachedValue = apiValue;
}
return cachedValue;
}
async function getColorIdentityFromApi(deckUri) {
return new Promise( (resolve, reject) => {
GM.xmlHttpRequest ({
method: "GET",
url: `https://api2.moxfield.com/v2/decks/all/${deckUri}`,
headers: {
"Content-Type": "application/json"
},
onload: function (response) {
let ident = [];
let responseJson = JSON.parse( response.responseText );
if ( responseJson.hasOwnProperty('commanders') ) {
console.log(responseJson);
Object.values(responseJson.commanders).forEach((c) => {
ident.push( c.card.color_identity );
});
resolve(ident.flat());
} else {
resolve( ident );
}
}
});
});
}
function readDecks() {
let rows = [...document.getElementsByTagName('tr')];
let commanderDecks = rows.filter( (row) => {
return row.cells[1].textContent === "Commander / EDH";
});
return commanderDecks.map( r => r.cells[0].querySelector('a') );
}
function readCache(key) {
let existingValue = localStorage.getItem( `${CACHE_PREFIX}-${key}` );
return JSON.parse( existingValue );
}
function writeCache(key, val) {
localStorage.setItem( `${CACHE_PREFIX}-${key}`, JSON.stringify(val))
}
let numAttempts = 0;
let masterDict = {
'W': { 'name': 'Mono white', decks:[], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/MTG_%28W%29.svg/512px-MTG_%28W%29.svg.png?20180803212526'},
'U': { 'name': 'Mono blue', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/MTG_%28U%29.svg/512px-MTG_%28U%29.svg.png?20180803212522'},
'B': { 'name': 'Mono black', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/MTG_%28B%29.svg/512px-MTG_%28B%29.svg.png?20180803212429'},
'R': { 'name': 'Mono red', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/MTG_%28R%29.svg/512px-MTG_%28R%29.svg.png?20180803212503'},
'G': { 'name': 'Mono green', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/MTG_%28G%29.svg/512px-MTG_%28G%29.svg.png?20180803212451'},
// Pairs 10
// White + x (4)
'WU': { 'name': 'Azorius', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/MTG_%28WU%29.svg/512px-MTG_%28WU%29.svg.png?20180803212536'},
'WB': { 'name': 'Orzhov', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/MTG_%28WB%29.svg/512px-MTG_%28WB%29.svg.png?20180803212527'},
'WR': { 'name': 'Boros', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/MTG_%28RW%29.svg/512px-MTG_%28RW%29.svg.png?20180803212514'},
'WG': { 'name': 'Selesnya', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/MTG_%28GW%29.svg/512px-MTG_%28GW%29.svg.png?20180803212451'},
// Blue + x (3)
'UB': { 'name': 'Dimir', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/MTG_%28UB%29.svg/512px-MTG_%28UB%29.svg.png?20180803212524'},
'UR': { 'name': 'Izzet', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/MTG_%28UR%29.svg/512px-MTG_%28UR%29.svg.png?20180803212524'},
'UG': { name: 'Simic', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/MTG_(GU).svg/512px-MTG_(GU).svg.png?20180803213312'},
// Black + x (2 )
'BR': { name: 'Rakdos', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/MTG_%28BR%29.svg/512px-MTG_%28BR%29.svg.png?20180803212440'},
'BG': { name: 'Golgari', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/MTG_%28BG%29.svg/512px-MTG_%28BG%29.svg.png?20180803212430'},
// Red + x ( 1)
'RG': { name: 'Gruul', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6b/MTG_%28RG%29.svg/512px-MTG_%28RG%29.svg.png?20180803212513'},
// Shards / Wedges 10
'WUB': { name: 'Esper', decks: [], img: 'https://cards.scryfall.io/large/front/a/3/a3d70a07-8d91-462c-aa96-901cc9a81531.jpg?1562707353'},
'WUR': { name: 'Jeskai', decks: [], img: 'https://cards.scryfall.io/large/front/d/4/d4c0fcdb-a312-4976-bcfb-73930c0a556c.jpg?1673148790'},
'WUG': { name: 'Bant', decks: [], img: 'https://cards.scryfall.io/large/front/7/9/7906b1e8-3049-4f4e-b1fd-b2547e7079f0.jpg?1673148361'},
'WBR': { name: 'Mardu', decks: [], img: 'https://cards.scryfall.io/large/front/c/3/c35fb7a3-7c7f-4470-b1ad-5b8709a608e6.jpg?1562793176'},
'WBG': { name: 'Abzan', decks: [], img: 'https://cards.scryfall.io/large/front/b/d/bd5b386e-e71e-492d-8456-6cd178ef5b3d.jpg?1673305419'},
'WRG': { name: 'Naya', decks: [], img: 'https://cards.scryfall.io/large/front/c/e/ce1d6f9b-2ca8-48b8-b4a6-46a61c7c3905.jpg?1673305611'},
'UBR': { name: 'Grixis', decks: [], img: 'https://cards.scryfall.io/large/front/2/0/20332354-a294-4448-a66f-533e6b546df6.jpg?1562901766'},
'UBG': { name: 'Sultai', decks: [], img: 'https://cards.scryfall.io/large/front/7/2/72af6c1f-33a0-4e02-95b7-74ecaa6a6d87.jpg?1673305662'},
'URG': { name: 'Temur', decks: [], img: 'https://cards.scryfall.io/large/front/0/0/009c5aac-194f-4b95-8f69-cc74aa15c3a5.jpg?1591321473'},
'BRG': { name: 'Jund', decks: [], img: 'https://cards.scryfall.io/large/front/d/f/df91979c-fb60-433b-8780-366ce1effd9c.jpg?1562942155'},
// 4 colors 5
'WUBR': { name: 'Yore', decks: [], img: 'https://cards.scryfall.io/large/front/0/2/0247d76c-dee4-4d1b-9c25-faa56171541e.jpg?1593272858'},
'UBRG': { name: 'Glint', decks: [], img: 'https://cards.scryfall.io/normal/front/a/4/a4f00d2b-d616-455a-bf9b-5bd82b690121.jpg?1673305536'},
'WBRG': { name: 'Dune', decks: [], img: 'https://cards.scryfall.io/normal/front/1/5/15b4ee44-28c4-4a39-9c06-aca43787954f.jpg?1593272643'},
'WURG': { name: 'Ink', decks: [], img: 'https://cards.scryfall.io/normal/front/d/2/d29bb432-1ca6-4305-b6d3-d7afe06c6c69.jpg?1593272693'},
'WUBG': { name: 'Witch', decks: [], img: 'https://cards.scryfall.io/normal/front/1/8/185d56ab-b7f2-4eb2-9540-db8f2dc9b436.jpg?1593272845'},
// All
'WUBRG': { name: '5c', decks: [], img: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHCBUWFRgWFhUYGBgZGhgcGhgYGhgZGBoaGhocGhoaGBocIy4lHB4rIRoaJjgmKy8xNTU1HCQ7QDszPy40NTEBDAwMEA8QHxISHjUrJCs2NDQ0NjQ0NDE0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NP/AABEIAQkAvgMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAACAAEDBAUGCAf/xABGEAACAQEFBAYGBwUHBAMAAAABAgARAwQSITEFQVFhInGBkaGxEzJSwdHwFEJicpKy0gYjc4LhByQzNEODolOTwvEVNWP/xAAYAQADAQEAAAAAAAAAAAAAAAAAAQIDBP/EACkRAAICAgIBAwQCAwEAAAAAAAABAhEDMRIhQRNRgQQUIjJhcUKx8JH/2gAMAwEAAhEDEQA/AOP/AG4/bG2v1s4Dst3ViLOzBIUqDQO4+sxpXPStBz5SKat1u1mygsjVoKkNSteVMpm35ZRlRTbN1sR9RvxnXugLdbHKqN+P+knkh0zHimwLtY19Vvx/0ykllc7DMsjkbunTLnlnBySDizDim21zsfYf8f8ASRLdrIn1G7XPwgpJhxZkxTa+i2A+oxrwc5HnlBe62W5GHW5PuhyQcWY8U2BdrL2G6sZ+Eka62AA6DEn7Z+EOaDizDim4l2sDn6N+fTPwhLdbuT/htT+I1fKLmvZhxZgxTo0uV2P+k5/nfLwh2NwuxNDZMQf/ANG9wkvLFeGPgzmYp1y7Ju2+xfstG+EY7Iu3/Tb/ALja90Xrx/n/AL5H6cjkop1b7Ju4P+C1N/7x/hIhs271obNudbRsvCNZ4v3FwZzNYp1tlsy7E0NkT/uuOHKWv/iLoCK2J/7zjs0kv6iC8P8A75KWKTOIrPpX9nv9opsA1jfHa0sgtbNiMbqwIGDPMqQSRXTDTQ5c7tzZVgli7ohRldACXZ6hsQORpwnLzWE1JXEzknF0xTbuPqV5Dy+c5iTZup6FKA+qa51FBu5Z+AhLQI0Lhs5rUtTCoBIqS5zrloZVvt1Nm5QgVHAsQRqCM94ljZ9/azqAMiTXrr1HlKt6vLO5dtT3UGQmK58nejeXp8FW/JCbPl4t8ZKAKZDtq3xkbaQ0emVDLdmXQkUaUy41b4x1sl4eLfGLGTrlHXIV4b9JLspUGyLvA7Gb4xKEzLUAHNqefVJrtcXehPQXcSOmeYU6dZ7pqXe4ImYXP2m6Td507AI2kl+Tr/ZUYuWkYz3fGegjEcekAeosQIY2c5+og67T+pm6UqePXHwSPWgukm/kv0W9swX2e9MkU9Tj3sJG9gVHTRlHMNTvBp4zfKRlWmnhGssX4f8A6J4X7mFZopOSjLOoJoe457+6XBYLlRRzzYceekuW1yRsyMJP1kop7Ro3aJStUdAT6673UZj7y7hzFRFKLl3F2TXHpokN0Fc91KUJ+PzSMLJa1winHEczlurIXtlpmKk5khq9UACtKZnfWvvmST8sG14J2FTQKD2t3DPhDS6LqUprx6txk9mgpu7POghOmIZkg76HKnvMjl4Koa63NWO4dpNB36yS+3AIKClCKg51B585DZMUOZqBvrnTiefzvktpblqk50GXD55Rflyu+jT8OFV2Vv2is8N2etScdlnu1ecbOx/aK3DXdxX69nx4vWs46df098O/c5stX0KbtxswUrwC+UwpuXA9CnIeU0lomOxN7z5mR4ZKcgacT5mRjdJGMwIFIZNBpI8Mdj18hqSToAN5hVjH1IABJOQA1JO4TZuOzgvSejOMwNVT9Tc926Fs644BU+uRmfYB+qvPiZeFBJnNQ6W/9GuPHy7ehL4x2OkEawjORu32dKVDrETEFjNEUKDvhqsBjGhBsuUEcsjCrlEsak12hOKezNvNwFcSCjVqUywtxK+y3LQytZuoFVBOeYJoQc8jz5cpsuAZSvt1Jqyev9Ye2BvH2wO8ZcJ0Rksqrz/s5pQ4drQ2MZ13ZjtgpbZfWA0/9ZfNZDZFaVU564ic+6kNM9Qc99TU5HPlMHFBZLbUOvdw3mtOysQtKhvMn5pCslGlPj1GPbIpU9EjKnDr3xJq6GyLby0utpkAcVlkKe05nGzrduA/R3r7dlnyq/zWclOr6f8AT5McuxTfuAGDu8pgTfuB6HYvlNJ6JjsZhr1t5mAyDKmZ4DWERrXifMyFgJCKstHZ9tp6J+Ogr3SxdbFrJ8dpZuKUCkgYVrq5Nczn2Zy3sK1dmYs7FVAADZ5/Ck2rdgykMBQ1Gnw114TojBNWjB5XGVNFEtuldbZz0lQsmmLEBXjQa0zjXYkEo2q5qfaTd2jQ9kjew/eAIaDVwfUNTkADv+d9ZxwgudSO6c2ocosme0tBU+jFBqcfAVOWGslFsMIbdTF2UrAvOSkBjnkRlTPSp4QLp6gG9ar+HKvaAD2ys+KMaon6fNKd8h1vjEAiycg6UwmoPbyhrbudLC17Qo98pWdVxPZkBQclNaGhoSDuqd3AA51oNO431iMVSDnUUFeFD/Th1y44ccqu0Z5M2SN1TIbG8YwcipBoysKFTwMa8XlVOGjM3sqKnPjuG/uMHEfSOSQcYDZCmY16tRl9kyK7NSxNrvarE0rQnQdlBlwEzWFOTXhGrzNQT8sNL02+zcDqX4wmvoANVZWGEBDQMcRAWmdNT2dVJUa8FOl6Us4PSQGq8wABqJLYutqzs9G0UAjPCtM89M6fhB3wcIVasIzyXxdFnG+von8JG1uwZQyYcRFOl0q5n1aaad4klxcquEsSqsQK8ATTPXQESsHqrOCcbuUB3qASCBX7rNTiZThGKUo7ZMZylJxlpEN5QYz6NS5b11UZK9RXXo9IGpGoOe+OwtAaGycAH7BNdw9aaVvWxs6IAKlUGVQCxFDWuep51Nd8zbO+PZWjraOzmmdT62fQKb8wRkK75rLEn3LfkxWR/wCOia7W5D4HTC1AQCQaqeNQKajv7prYjCaUpnpXX3yij9Iux6bajXCNQoPz4Q3tGZTuy3jfWmU45xXK46NlJ13sbbzg3d/v2Q683rORnXbbcfRnFanHZVPa85GdGD9PkzybFNu4noV6vKYk2LkThHUPKaSXRMdkhJ3cT5mRUPWa6b84ZbzPmZc2TYYrQGlQgLHrzCjqkxVugk6Vl6xs3sUFnUY3J5AVBY1OuQA7t1crlytHLejdqkZhslLLn461AppuFIJOK0dq1CdFT9ogFz5CBe2KgOuTIa15fW8M+sCJ5eOTitF+jzxW12ya93R2KlcrQeqpBzGhqK6U4n3SleAbKoqXdhU7/VoTUcAANAM6cZ0IFUDqRmKkkVJqAaAgjfrMZwRb2mLUqtOoEg0/4+E6M8VGPNbOb6eTnL03oRXEceqkAihGY5ncdfGV7dXVjgFQ4GeQCtkuLuIHYvMwEYoWQaLmByNcPdp/LLRvBKGihm1UGoAoNerLyk/jkjZVyxTr4Ire7UQIDQDLLgONRoOfASO4E1IqcsRqanEM667/AFu+GlizriNpUNQ5LTIjd0jxli2uoIXCSmHIFQNMss92Q7pg80VJUdEcEnF29kl7sCVxL6ydLPIGlajlqR2nfSULlhdHsq0yIQnLKhoDXQ7s94PCWXs3P+oc+K194kC3E6lgGBJBUZAHdQ7iRWm4nLnTzQu18ijhmo0/ghsrV1dSoZHr0l+qNSSp11NaZ+sTQay/bWmO2Y0pRRTtyNMvsyB0tFBYOWIpkEFCAc8uNKwcfpGtCtVxKFqK5GrE0rvGIZbpMpReNpPyVGMlkTkvBNc3BV2G8vpvGJhX54yn6TDkQQUdnp9hy2I/y48+Qrvkt3sbQgA0RRlQCpNMss8gKZV7hLFnYHEGZ8QUHCKUzNRUmueROWWpilOPFJbQ4QlybemXb1ZC1szhOdaqdcLAA17KjzmJe7O0JRjZ9NQQWWhBXcRXMEGvec5eW7YTVHZOQzXuOg5AiEEeoGMZ5EhWrQ8y/OaevGW96M1glC6fRnLdrUkVs2yB9bLxz46wQxIYEAMmWRqNxzNBmK5yxaXC1JKuXxAvUCiiiE4jVM9BWhJOci6KqVFNOqmY3/OsxnxTpLspXVsfbaj6NaEal7GuXN/6TkZ1m3H/ALs4p9eyqa1zq85OVg/T5JybFNi6Hojs8pjzbuY6A50HgJrLREV2FSi1418/kTZ2VYMijczkHt4a9nZzmRdrZUbG64wNB7JBNTSo8902UR2CszlSVBooXo1GhqDU86CEWopyY3GU+kPd3piT6ysxPMMSQR307JORAu93CknEWJpmabtB0QOMsFMpwzacrR3wT49i2PaN6LAK0U4OHqmmvHfKl/tFD2ZBqwIRtDUMQoGW8etXlIyzrjRVFGaobcAcySKg1zO7hnwlsboi5hQW3uQMR4kmds88fTUd9HDj+ml6rlrsiw+ktAFrRaqzgVFSR0eZFD3y+4GKgQCg34iOjlvAA04ecqPdVqTmC3rUNA1OI3xCxypiYdRMjHnjCNUXl+nlOfKwbImzIViMLHosNxrWh5eWnOaj+j9FZiiYxaHEQqBiqlcIagrTI5786655i3IVBLOQCOiSCvlLbvMZTipWls3jCTik3omdLInoMq1e8ClRgyNbPQDCpJpXeBlxkd1ZC4LZJVqY6EA4DhxnQqHp2UB3yKsIAmS5q7oag6qxiMlqUxBXxKMArhFUGJKYidMz9WlZYtRZAmhBpa2VCWB6BWrCgNGGKgJzoNZC6yKhj5r2BwfuWnSzNcDBaveKCow5HFZjKmBSSVrvpqNZXZ0KORiBLFVBZQVXBUtkpxZ1AOmm8GrhjCAg5r2GoP3LCrY4yC1V9PgyZFHoytS3RUDfWoyypKyBTZhsySAK55OLTpBgMgpQihO/rpBxUhEfOdO7uhzj7E8H7kW0L82OuFTjRuOTAnHTmQyfgmM6HpZ7hvO8iau0B0MXsOrdjdBvA17JR+q1ASQB+YTab1L3RjVWvYr7WTDd3Gfr2eRP35zc6ba5P0dwdz2fYavOZlYv1M5bFN25noAdXkJhTbufqDs8hKloUdiWxxFV1xMFP8zUPhWdI5qx6/AZTE2WK2qfZxt3A+8ibwWRldQS92b4VcmxKDGZzDEErOQ6gI6tGZYSLEwQ5MYLCIpBBjAOtIwgtCsxJGJgI5akRMEwEEprEBEsZmgAxXOFSADCJlADDOkHDEBABNY41ZPbRl7xl4zDVyUxCuajOo9oGb9nadIdYmIyKA4yqHK03mlpQdQpSdCd41/DOXIqn8AbYNbux16dnn1F5zE6fbQX0D0rUPZ04U6f9PGcxNMX6mM9im3ch0R2eQMxJuXKz6IO/LXqHGXLQo7Lux06ZPBH/wCTADymuxmfsY5ueCJ4s3wmoFBmGd9I6sC2Rq8IPWPgEcrScpuPTKAuscvGjoYVoZGsVIwhQiUrEWirLWz9m2luWWzUUUAszkqoroKgEkmhyA66VFUDdFImEBCvV1ezdkcYXWlRqDUVBU7wePXBWNgnYjFSImMWjAfDHMQMRMkYqxAxARqQAUxto2mG0tgPaB78DZd5mw0ytqN+8fmtmfyjLunVi7g/7Ry5v2RX2o393fQ9Oz8n0nNTpNr/AOXbLLHZ6Cmgek5ua4v1MJ7FOgueEoK65flE5+bdxQsuW74COWhRdM09imptPup+Z5rTH2Af8QfZT8z/ABmwZj9R4/o6sD6Y8AwiIzTlNwSIUdBE6UjsaQoJWC7UBPAE90vtcwLE2otQzIKlMICkD1sJ1rkdT1xNpVfkiU1F0yqqyxs/aD2L4k+TShyORBoOFKCQPIisa/kclaLF8vT2rl3piICim5VrQaCuZJ03yIxoNo+XWQK7hUgVPHXSCTbpA6jG/YaPLd5uYVA6uXBK1BC5hiACtAPaGtdJSImmTE8bpmWHPHKriTClIwEiYwg8zo3DEZjI6mSoeMYAmY21m/eP9yz/APGbDGY+11rauOCoPyfGdWH9H8HJnf5Iq7Qet3f76eTzAm9tAf3dsvrp5PMGaQ0YS2IzcujDAopqRnxyGUw5tXY9EdnkI5aCOzR2I3TYcbMn8LD4zeoJzeyH/eIPaDr3qTn+ETfUmkxzr8U/7OnA9oZmgnOORFOY6AtI2OsGsREBgnShzrujMtdSTvOmf3jv8zvrJFEP0cRLipbQwaMYTLSMTEUCDGZQRT+kekcGUIg9HzJpuyAr2AfDfrDAkhWIrHKblsmMIxVRVAkVgolJIDCw5SbLoAR6xlMJogHZMpz+0s7S1I9oDL7JRfdOgQ5qOYnOu+JXbeWZgeIZwZ14usf9s5M3cvgh2gP3DffTyaYU3do/4DfxLPyeYU1ho52KbtzU4R1jyH9JhGdBdfUU/aHkIS0OIF3fCyP7LKT1V6XhWdQTSo5zkzmtOOU6W7WuNEfeyiv3hk3iJORXjf8ADNcUqkHEY5EcTjOwECNHJhCAxCC9roK0BOba0FNfn3Q4L2YI+aj50iX8homvliEwUcuGyIYAFWoSNN1FPfIaSNLMA1zPcPICTKIaCTTdpUAWlewbGjNjwuMwmEYT9muu/t5S2wEqm6oTvpwy7q0rTtlxcVsznGTqiWxfEoPEA94rCZo5EfDJLCRKisE1jq0IsJIyELnJYETGkoWgLxa4UdvZRiOulAO8zDQdAqNwUf8AJRL+1LSlmB7bqOxOkfEATPLkBqfZ/Os62qil8nHJ3Jsi2ktLBv4ieTzCnRbXetgfvp5POdl430ZS2IzduanCDzHkJhGb1zNFXrHkIS0CIwuQmtsS06DpvRsQ+6+v/IE9szV0XkJLcLYI6sclPQbqbKvYaHvhHvp+ei9UzoDHVYyIdOEKs4ZKnR3J2rI2EakeKsADTOJhBAMcQAZo6vE0AwAJjBWIGEsAJMMjJhMYDQAKICMI4gAqRmENxSR2jhQXOigsezd2mVjjykkiZyqLZi7XtKvh3IAv8zdJv/HulVDk38vb01kZJYkt6zEk9ZNTJguTdS/nWdc2mziSYO0v8Bv4ifleYU6Lalfo5y/1E/K852ENEy2Izduz9EaajyEwjNi7t0R1+4SmrQk6HXQRUGh039sEHIdUSPEUmdJs+9F0BPrDov1jQ9ooZOwnP3C9BHqTRGorcs+i3YT3EzoVO46iZZoX+S+Tpwz64gxwYTSOs5jclGkasHEITUkjBMYiOGiaUAsNIElAyg0gJoRjASQAQDJAfDGhO2UBDAGEzTM2ra+rZ8aO/UPUB6zn2CX7ZwoLN6q5nieCjmTlMC0JYl2PSY1PLgo5AACdeKPCN+Xo58srfEGz145yRjkQKfV/OsCzHmI7793q/nWN7MrpBbUNbuSf+og/4vOdm9tI/wB3PH0ifleYMvHozlsRmrd1yHX7hMozXuoyHWPdLehAWZAAhER0WgEYvQyRgkEfDjOj2WXNmuKhIAwnGlShFQGBYEEV7qTnlJPDKb1mi/R1cllwNZdJWZcKsLJXJwnTCTLiuSaZMpuFNF+h4D8dn+qN6NuA/Gn6odvjUq1haNaGjVRnxrTAxVqnMHEFGudYV1ZbTCwdS1Rl6S0D4hqGSoz1qpFJH28Q+6mQGxbgPxp+qGtm3AfjT9UOzvCM1ol4YK+NsIZigKZYChqK86GtayG2tfR2jj94UHoCzKzOVAx0qCSxU0GKld/GsPQiP7qZKLM8B+JP1RFG4D8Sfqk63xbS2wYqobMMhRsmOIh6sp3DDlz6o11uql7ZC1oVBTCPSP0cSVOE4q688ofbxF91Mh9G3AfiT4xjZNwH4l+MppaW9EVXZ2sntCCQx9IlcKK5GXSBbpHQAHeJfvN/R0Qi0FmceauCRiANbO1FRTXiK0GsF9PEb+qmRBGJpTPrX4whZNw8V+Mr3vopUoMAtFDOjO6BGFWZVOlCAKZgVlmlmEY3dsdoEJRRaPaCoGRCliO3jD7eIvupj+jbh4j4wfRtw8RHuzIxDq6Fh9/GMsw6461FdG3ylYW4pZsz2ilba0JtGLlcKuwwM1aZigz0oe0X08B/dTZFtNHqoJAUVIzqS+VSw3AA5dpmaW1yz7psftAQ2Eqag1IIOVKLpMYEVz4xZNmmOXJW/IlGesd1yPDo/mWIAGvhuifQjkv51mfkp6A2mtLv/uJ+V5gzd2o37j/cT8rzCmsNGctim1dBkOse6Ys2Luch159wjeiUNg6I5wDWaOytmParUMqqMqmuZ7JWvdkUdkYCqmhpmDvqDwkqSbcU+zSWOSipNdMquO+bdw2xgQKFOgr6uoULlyymMdaQ23CWpNaM3FS2bx/aDD9U9mGT3TbRdiFADcDhBYcjTPq1nMljAc1y6o1J+SPTidku0LTgO8fphi9WmtB3j9M5y6bVYZOC4y6QoHA8m7c+ua93vaPkjhj7Oj9qnORN5P8AF2bQx4XtFz6W/Ad4/RF9MfgO8fokNeOXXlEWmDy5EbfbYiYX1+A7x+iMb8/AfiH6JETGXkI1lyPQn9PiRP8ATbTgPxD9EBr1aYgVABGvSFKc+hKF42jZp9bEfZTPvbQecy7xe3tFOLopuVa0J+0dWPhNoua7k/jyYyx4tRRqW22QSQMxkSQyYWPLoVMa77YKjCiEAkn1k1Y1JzTeT4zHVe0aeEksVoanSnHyhLI/Alhi+mXrzbu4B4V3gnOg9kcD3ynaNkKdfPKJ7fSnDu5GQu9acpl3J2zb8Yrig0euXnHcmhy9n8yyzs25m0JAIWm/WnZA2hdms2KNQ5IQy6MCy5iFx5cfI3GXHk10VtrrSw/nT8jzBm7tT/Lj+IvX6rzCmsNGMtimxdmGEdfw1mOZeW8KBT4yqsm6NPZ21HslwhajrAp5yrb2zO7O2pPLs39Uqvec/wD3H+kj5rEsaT5Jdsp5JOKi30iZVpmK16x8Yszu8RIPpNDl745vIOvvjpitE5PLxHxkefDykRtxu98cXrq8YUxWiwOY8R8Y1rrppzXzrIDeh81jG8A/JgkwbRcsb/aqKB3pwJDDuassDatr9k9ap7plemEIXkcvGVbEmaj7UtuIH3VT31lW1tXf13ZhwLCndWkq/SB81i+kD5Bi7G2iyBy8V+MJSSKc66r8ZVF6HzWL6UPmslxY+SNIWh3jX7S/GA7kGtMuGJfjylH6X85xvpXznFwY+ZZdzw47xv7Y2I8PEfGVxeRx8DF9JHyDHxZPI1NnX17MkqBnqCyjxMe93lnYswzooGY3MOB65mLex8gwvpo+QZPp98q7NPVdcW+ixtM/uf8AcX8jZzFl+9XsMmDfjDV/lII8ZQlRTS7M27Nv9rf2etLjeHsXU4asbN/quleiQeIFARuPZMSegv7Yf/r2/iJPPssQoooohiijxoAKKPGgAooooAKKPFABoo8UAGijxQAaKKKACiijwAaKKPABp2v7A/sI9/xvaFrOwUUVwAcb1GSg6gDFU7jQcacYmo6x5z1Zsb/L2P8ADTyjQj//2Q=='},
'C': { name: 'Colorless', decks: [], img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/MTG_%28C%29.svg/512px-MTG_%28C%29.svg.png?20180803212441'}
}
let sortOrder = ['w','u','b','r','g'];
let buildPage = function() {
let newFolderButton = [...document.getElementsByTagName('a')].find( a => a.text === "New Folder" );
console.log(newFolderButton);
let ccButton = document.createElement('a');
ccButton.href = '#';
ccButton.text = 'Show Commander Challenge';
newFolderButton.parentNode.append( ccButton );
let body = document.getElementsByTagName('body')[0];
let form = document.createElement('form');
form.id = 'frm-cc';
let modal = document.createElement('div');
let modalDialog = document.createElement('div');
let modalContent = document.createElement('div');
let modalHeader = document.createElement('div');
let modalBody = document.createElement('div');
let modalFooter = document.createElement('div');
let modalBackdrop = document.createElement('div');
// Setup the modalBackdrop
modalBackdrop.classList = 'modal-backdrop fade show d-block';
modalBackdrop.id = 'cc-backdrop';
modal.id = 'cc-modal';
modal.role = 'dialog';
// Setup the Header
let headerText = document.createElement('h5');
headerText.textContent = 'Commander Challenge Data'
headerText.classList = 'modal-title'
let headerButton = document.createElement('button');
headerButton.classList = 'btn-close'
headerButton.id = 'btn-close-cc';
headerButton.onclick = function(e) {
e.preventDefault();
document.getElementById('frm-cc').remove();
}
headerButton.type = 'button'
let headerSpan = document.createElement('span');
// Assemble the header
modalHeader.classList = 'modal-header';
modalBody.classList = 'modal-body text-center';
modalFooter.classList = 'modal-footer';
headerButton.append( headerSpan );
modalHeader.append( headerText );
modalHeader.append( headerButton );
// Assemble the body
let sortedKeys = Object.keys(masterDict).sort( (a,b) => {
if ( b.length > a.length ) {
return -1;
}
return sortOrder.indexOf( a.toLowerCase() ) - sortOrder.indexOf( b.toLowerCase() )
});
let dvSwitch = document.createElement('div');
dvSwitch.classList = 'deckview-switchmodal';
sortedKeys.forEach( (color) => {
let def = masterDict[color];
// Create a div for the entire row
let colorRow = document.createElement('div');
colorRow.classList = 'd-flex ms-3 mb-3';
// Create a div for the image
let colorImageHolder = document.createElement('div');
colorImageHolder.classList = 'flex-shrink-0 text-center me-4'
colorImageHolder.style.position = 'realtive;'
// Create an img
let colorImage = document.createElement('img');
colorImage.classList = 'img-card cursor-pointer'
colorImage.width = '130';
colorImage.src = def.img;
colorImageHolder.append(colorImage );
//Create a div to hold the text
let textHolder = document.createElement('div');
textHolder.classList = 'flex-grow-1 text-start';
// Create a title text
let titleText = document.createElement('h5');
titleText.classList = 'h4 mt-2 mb-1 d-flex align-items-center';
titleText.textContent = `${def.name} (${color})`;
textHolder.append( titleText );
def.decks.forEach( (deckName) => {
let deckNameRow = document.createElement('div');
let deckNameSpan = document.createElement('span');
deckNameSpan.classList = 'text-capitalize d-inline-block'
deckNameSpan.textContent = deckName;
deckNameRow.append( deckNameSpan );
textHolder.append(deckNameRow);
});
colorRow.append( colorImageHolder );
colorRow.append( textHolder );
modalBody.append( colorRow );
});
// Assemble the content
modalContent.classList = 'modal-content'
modalContent.append( modalHeader );
modalContent.append( modalBody );
modalContent.append( modalFooter );
// Assmble the dialog
modalDialog.classList = 'modal-dialog'
modalDialog.append( modalContent);
// Assemble the modal
modal.classList = 'modal zoom show d-block'
modal.append(modalDialog);
//Add the backdrop and the modal to the body
ccButton.onclick = function(e) {
e.preventDefault();
form.append( modalBackdrop );
form.append( modal );
body.append( form );
};
}
async function getData() {
var decks = readDecks();
if (decks.length > 0) {
decks.forEach( async (d) => {
let parts = d.href.split('/');
let deckId = parts[ parts.length -1 ];
let colorIdent = await getCommanderColorIdentity(deckId);
if ( colorIdent.length > 0 ) {
let colorSet = new Set(colorIdent);
let sortedColors = Array.from(colorSet).flat().sort( (a,b) => {
return sortOrder.indexOf( a.toLowerCase() ) - sortOrder.indexOf( b.toLowerCase() );
});
let colorId = sortedColors.join('');
masterDict[ colorId ].decks.push( d.innerText );
}
});
setTimeout(() => buildPage(), 2000);
//cc.modal();
//body.append( modalBackdrop );
//body.append( modal );
} else {
numAttempts++;
if (numAttempts >= 15) {
console.warn('Giving up after 34 attempts. Could not find: ');
} else {
setTimeout(getData, 250 * Math.pow(1.1, numAttempts));
}
}
}
await getData();
// Your code here...
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment