brawlset/app/tools/createJson.mjs
2024-12-27 16:41:39 +01:00

160 lines
4.8 KiB
JavaScript

import { PrismaClient } from '@prisma/client'
import { writeFileSync } from 'fs'
const db = new PrismaClient()
const color_names = {
"mono-white": ["W"],
"mono-black": ["B"],
"mono-blue": ["U"],
"mono-green": ["G"],
"mono-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 ""
}
// I need to create
// Lands
// lands.json
// All jsons lands from colors
// Types
async function createJson() {
console.log("Fetching data...")
const bsets = await db.bset.findMany({
relationLoadStrategy: "join",
include: {
sets: {
include: {
cards: {
include: {
decks: true
}
}
}
},
decks: true
}
})
let bsets_export = []
let all_cards = []
bsets.forEach((bset) => {
let icons = []
let set_codes = []
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
}
all_cards = [...all_cards, ...cards_temp]
})
bsets_export.push({name: bset.name, sanitized_name: bset.sanitized_name, icons, set_codes})
})
writeFileSync(import.meta.dirname + "/json/misc/bsets.json",JSON.stringify(bsets_export), 'utf8')
const landsData = {}
for (const colorName of Object.keys(color_names)) {
landsData[colorName] = []
}
const type_dict = {"creature": [],"land": [],"instant": [],"sorcery": [], "planeswalker": [], "artifact": [], "enchantment": []}
const colorsData = {"mono-white": structuredClone(type_dict),"mono-black": structuredClone(type_dict),"mono-blue": structuredClone(type_dict),"mono-green": structuredClone(type_dict),"mono-red": structuredClone(type_dict),"colorless": structuredClone(type_dict),"multicolor": structuredClone(type_dict)}
for (const card of all_cards) {
let card_object = {
"name": card.name,
"sanitized_name": 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": bsets.find((bset) => bset.id == card.bset_id).decks.length,
"colors": card.colors,
}
card_object.percent_decks = (card_object.total_decks != 0) ? parseInt(10000 * (card_object.nbr_decks / card_object.total_decks)) / 100 : 0
const colorName = getColorName(card.colors)
if (card.type == "land") {
if (colorName != "") {
landsData[colorName].push(card_object)
}
}
if (card.colors.length <= 1) {
colorsData[colorName][card.type].push(card_object)
} else {
colorsData["multicolor"][card.type].push(card_object)
}
}
for (const index of Object.keys(colorsData)) {
let JSONToWrite = colorsData[index]
for (const key of Object.keys(JSONToWrite)){
JSONToWrite[key].sort((a,b) => b.percent_decks - a.percent_decks)
}
writeFileSync(import.meta.dirname + "/json/top/" + index + ".json",JSON.stringify(JSONToWrite), 'utf8')
}
const landsJsonRoot = [[],[],[],[]]
for (const colorName of Object.keys(color_names)){
if(color_names[colorName].length <= 3){
let index = color_names[colorName].length - 1
if(index < 0) { index = 0 }
landsJsonRoot[index].push({ "name": colorName, "count": landsData[colorName].length})
} else {
landsJsonRoot[3].push({ "name": colorName, "count": landsData[colorName].length})
}
let JSONToWrite = landsData[colorName]
JSONToWrite.sort((a,b) => b.percent_decks - a.percent_decks)
writeFileSync(import.meta.dirname + "/json/lands/" + colorName + ".json",JSON.stringify(JSONToWrite), 'utf8')
}
writeFileSync(import.meta.dirname + "/json/lands/lands.json",JSON.stringify(landsJsonRoot), 'utf8')
}
createJson()