75 lines
1.5 KiB
JavaScript
75 lines
1.5 KiB
JavaScript
import { createHash } from 'node:crypto'
|
|
|
|
function normalizeRecipe(recipe) {
|
|
return {
|
|
...recipe,
|
|
components: recipe.components.map((component) => ({
|
|
...component,
|
|
owned: 0,
|
|
})),
|
|
canCraft: false,
|
|
}
|
|
}
|
|
|
|
function normalizeDungeon(dungeon) {
|
|
return {
|
|
...dungeon,
|
|
completionCount: 0,
|
|
leaderboard: [],
|
|
leaderboards: {
|
|
part_1: [],
|
|
part_2: [],
|
|
part_3: [],
|
|
full_run: [],
|
|
},
|
|
}
|
|
}
|
|
|
|
export function normalizeCatalogProfile(profile) {
|
|
return {
|
|
...profile,
|
|
character: {
|
|
...profile.character,
|
|
id: 1,
|
|
name: 'Mira',
|
|
level: 1,
|
|
experience: 0,
|
|
talentPoints: 1,
|
|
currentLevelExperience: 0,
|
|
nextLevelExperience: 100,
|
|
},
|
|
abilitySlots: profile.abilitySlots,
|
|
allocatedTalentPoints: 0,
|
|
inventory: [],
|
|
completedDungeonParts: 0,
|
|
completedRaidPhases: 0,
|
|
gearStats: {
|
|
averageItemLevel: 0,
|
|
healingPower: 0,
|
|
maxResourceBonus: 0,
|
|
},
|
|
setBonuses: profile.setBonuses.map((bonus) => ({
|
|
...bonus,
|
|
equippedPieces: 0,
|
|
active: false,
|
|
})),
|
|
craftingRecipes: profile.craftingRecipes.map(normalizeRecipe),
|
|
dungeons: profile.dungeons.map(normalizeDungeon),
|
|
}
|
|
}
|
|
|
|
export function catalogHash(profile) {
|
|
return createHash('sha256')
|
|
.update(JSON.stringify(profile))
|
|
.digest('hex')
|
|
}
|
|
|
|
export function catalogPayload(profile) {
|
|
const normalized = normalizeCatalogProfile(profile)
|
|
return {
|
|
version: 1,
|
|
hash: catalogHash(normalized),
|
|
profile: normalized,
|
|
}
|
|
}
|