Last active
March 3, 2023 15:21
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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,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'}, | |
'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