brawlset/app/tools/createJson.mjs

238 lines
8.1 KiB
JavaScript

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()