import { PrismaClient } from '@prisma/client' import { writeFileSync } from 'fs' import { performance } from 'perf_hooks' const db = new PrismaClient() const color_names = { "white": ["W"], "black": ["B"], "blue": ["U"], "green": ["G"], "red": ["R"], "colorless": [], "azorius": ["W","U"], "dimir": ["U","B"], "rakdos": ["B","R"], "gruul": ["R","G"], "selesnya": ["G","W"], "orzhov": ["W","B"], "izzet": ["U","R"], "golgari": ["B","G"], "boros": ["R","W"], "simic": ["G","U"], "esper": ["W","U","B"], "grixis": ["U","B","R"], "jund": ["B","R","G"], "naya": ["R","G","W"], "bant": ["G","W","U"], "abzan": ["W","B","G"], "jeskai": ["U","R","W"], "sultai": ["B","G","U"], "mardu": ["R","W","B"], "temur": ["G","U","R"], "yore-tiller": ["W","U","B","R"], "glint-eye": ["U","B","R","G"], "dune-brood": ["B","R","G","W"], "ink-treader": ["R","G","W","U"], "witch-maw": ["G","W","U","B"], "five-color": ["G","W","U","B","R"], } function getColorName(colorArray) { const colorArrayID = colorArray.sort().join(',') for (const colorName of Object.keys(color_names)) { if(colorArrayID === color_names[colorName].sort().join(',')){ return(colorName) } } return "" } async function createJson() { const start = performance.now() console.log(process.env.NODE_ENV) console.log("Fetching data...") const bsets = await db.bset.findMany({ relationLoadStrategy: "join", include: { sets: { include: { cards: { include: { decks: { include: { deck: { include: { commander: { include: { decks_as_commander: true, } }, }, }, } }, decks_as_commander: true, } } } }, decks: { include: { commander: { include: { decks_as_commander: true } } } } } }) console.log("Creating stats...") let bsets_list_export = [] let all_cards = [] const commanderData = {"top": []} for (const colorName of Object.keys(color_names)) { commanderData[colorName] = [] } let bset_cards_data_export = {} let commander_details_export = {} bsets.forEach((bset) => { let icons = [] let set_codes = [] let bset_cards = [] bset.sets.forEach((set) => { icons.push(set.icon_svg_uri) set_codes.push(set.code) let cards_temp = set.cards for(let i = 0; i < cards_temp.length; i++){ cards_temp[i].bset_id = bset.id } bset_cards = [...bset_cards, ...cards_temp] all_cards = [...all_cards, ...cards_temp] }) bsets_list_export.push({name: bset.name, sanitized_name: bset.sanitized_name, icons, set_codes}) // BSETS CARDS STATS bset_cards_data_export[bset.sanitized_name] = { "commander": [], "creature": [], "land": [], "enchantment": [], "sorcery": [], "instant": [], "planeswalker": [], "artifact": [], } for (const card of bset_cards) { let card_object = { "name": card.name, "sanitized_name": card.sanitized_name, "url": card.set_code + "-" + card.sanitized_name, "normal_image": card.normal_image, "small_image": card.small_image, "type": card.type, "layout": card.layout, "price": card.price, "cardmarket_uri": card.cardmarket_uri, "nbr_decks": card.decks.length, "total_decks": bset.decks.filter((deck) => card.color_identity.every(color => deck.color_identity.includes(color))).length, "color_identity": card.color_identity, } card_object.percent_decks = (card_object.total_decks != 0) ? parseInt(100 * (card_object.nbr_decks / card_object.total_decks)) : 0 bset_cards_data_export[bset.sanitized_name][card.type].push(card_object) card.decks.forEach((deck) => { const card_url_name = deck.deck.commander.set_code + "-" + deck.deck.commander.sanitized_name if(!Object.keys(commander_details_export).includes(card_url_name)) { commander_details_export[card_url_name] = { "card_data": deck.deck.commander, "creature": {}, "land": {}, "enchantment": {}, "sorcery": {}, "instant": {}, "planeswalker": {}, "artifact": {}, } commander_details_export[card_url_name].card_data.nbr_decks = deck.deck.commander.decks_as_commander.length } if(!Object.keys(commander_details_export[card_url_name][card.type]).includes(card.sanitized_name)) { let card_synergy_object = structuredClone(card_object) card_synergy_object.commander_total = 0 commander_details_export[card_url_name][card.type][card.sanitized_name] = card_synergy_object } commander_details_export[card_url_name][card.type][card.sanitized_name].commander_total += 1 }) if(card.can_be_commander) { let commander_card_object = structuredClone(card_object) commander_card_object.total_decks = bset.decks.length commander_card_object.nbr_decks = card.decks_as_commander != undefined ? card.decks_as_commander.length : 0 commander_card_object.percent_decks = (commander_card_object.total_decks != 0) ? parseInt(100 * (commander_card_object.nbr_decks / commander_card_object.total_decks)) : 0 bset_cards_data_export[bset.sanitized_name]["commander"].push(commander_card_object) const colorName = getColorName(card.color_identity) if(colorName != "") { commanderData[colorName].push(commander_card_object) commanderData["top"].push(commander_card_object) } } } }) console.log("Exporting stats...") writeFileSync(import.meta.dirname + "/../data/misc/bsets.json",JSON.stringify(bsets_list_export), 'utf8') for (const index of Object.keys(commanderData)) { let JSONToWrite = commanderData[index].sort((a,b) => b.nbr_decks - a.nbr_decks || b.percent_decks - a.percent_decks) writeFileSync(import.meta.dirname + "/../data/commander/" + index + ".json",JSON.stringify(JSONToWrite), 'utf8') } for (const index of Object.keys(commander_details_export)) { let JSONToWrite = structuredClone(commander_details_export[index]) JSONToWrite["high_synergy"] = [] for (const type of ["creature","land","enchantment","sorcery","instant","planeswalker","artifact"]) { JSONToWrite[type] = [] for (const card_key of Object.keys(commander_details_export[index][type])) { let card_object_synergy = commander_details_export[index][type][card_key] card_object_synergy.synergy = parseInt(100 * (card_object_synergy.commander_total / commander_details_export[index].card_data.nbr_decks) - card_object_synergy.percent_decks) JSONToWrite[type].push(card_object_synergy) } JSONToWrite[type].sort((a,b) => b.synergy - a.synergy || b.percent_decks - a.percent_decks || b.nbr_decks - a.nbr_decks) JSONToWrite["high_synergy"] = [...JSONToWrite["high_synergy"], ...JSONToWrite[type]] } JSONToWrite["high_synergy"].sort((a,b) => b.synergy - a.synergy || b.percent_decks - a.percent_decks || b.nbr_decks - a.nbr_decks) JSONToWrite["high_synergy"] = JSONToWrite["high_synergy"].slice(0,15) writeFileSync(import.meta.dirname + "/../data/card-commander/" + index + ".json",JSON.stringify(JSONToWrite), 'utf8') } for (const index of Object.keys(bset_cards_data_export)) { let JSONToWrite = bset_cards_data_export[index] for (const type of Object.keys(JSONToWrite)) { JSONToWrite[type] = JSONToWrite[type].sort((a,b) => b.percent_decks - a.percent_decks || b.nbr_decks - a.nbr_decks) } writeFileSync(import.meta.dirname + "/../data/bset/" + index + ".json",JSON.stringify(JSONToWrite), 'utf8') } const end = performance.now() console.log(`Time taken to generate stats is ${(end - start)/1000}s.`); } createJson()