// SPDX-FileCopyrightText: 2021 Johannes Loher // // SPDX-License-Identifier: MIT import { getGame } from "./helpers"; import logger from "./logger"; import { migrate as migrate001 } from "./migrations/001"; import { migrate as migrate002 } from "./migrations/002"; import { migrate as migrate003 } from "./migrations/003"; import { migrate as migrate004 } from "./migrations/004"; import notifications from "./ui/notifications"; async function migrate(): Promise { if (!getGame().user?.isGM) { return; } const oldMigrationVersion = getGame().settings.get("ds4", "systemMigrationVersion"); const targetMigrationVersion = migrations.length; if (isFirstWorldStart(oldMigrationVersion)) { getGame().settings.set("ds4", "systemMigrationVersion", targetMigrationVersion); return; } return migrateFromTo(oldMigrationVersion, targetMigrationVersion); } async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion: number): Promise { if (!getGame().user?.isGM) { return; } const migrationsToExecute = migrations.slice(oldMigrationVersion, targetMigrationVersion); if (migrationsToExecute.length > 0) { notifications.info( getGame().i18n.format("DS4.InfoSystemUpdateStart", { currentVersion: oldMigrationVersion, targetVersion: targetMigrationVersion, }), { permanent: true }, ); for (const [i, migration] of migrationsToExecute.entries()) { const currentMigrationVersion = oldMigrationVersion + i + 1; logger.info("executing migration script ", currentMigrationVersion); try { await migration(); getGame().settings.set("ds4", "systemMigrationVersion", currentMigrationVersion); } catch (err) { notifications.error( getGame().i18n.format("DS4.ErrorDuringMigration", { currentVersion: oldMigrationVersion, targetVersion: targetMigrationVersion, migrationVersion: currentMigrationVersion, }), { permanent: true }, ); err.message = `Failed ds4 system migration: ${err.message}`; logger.error(err); return; } } notifications.info( getGame().i18n.format("DS4.InfoSystemUpdateCompleted", { currentVersion: oldMigrationVersion, targetVersion: targetMigrationVersion, }), { permanent: true }, ); } } function getTargetMigrationVersion(): number { return migrations.length; } const migrations: Array<() => Promise> = [migrate001, migrate002, migrate003, migrate004]; function isFirstWorldStart(migrationVersion: number): boolean { return migrationVersion < 0; } export const migration = { migrate: migrate, migrateFromTo: migrateFromTo, getTargetMigrationVersion: getTargetMigrationVersion, };