diff --git a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts index 5077b10a..ee2bd304 100644 --- a/wowup-electron/src/app/addon-providers/curse-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/curse-addon-provider.ts @@ -221,9 +221,7 @@ export class CurseAddonProvider extends AddonProvider { return; } - console.time("CFScan"); - const scanResults = await this.getScanResults(addonFolders); - console.timeEnd("CFScan"); + const scanResults = this.getScanResults(addonFolders); await this.mapAddonFolders(scanResults, installation); @@ -265,12 +263,8 @@ export class CurseAddonProvider extends AddonProvider { } } - public getScanResults = async (addonFolders: AddonFolder[]): Promise => { - const filePaths = addonFolders.map((addonFolder) => addonFolder.path); - const scanResults: CurseFolderScanResult[] = await this._electronService.invoke( - IPC_CURSE_GET_SCAN_RESULTS, - filePaths - ); + public getScanResults = (addonFolders: AddonFolder[]): AppCurseScanResult[] => { + const scanResults = addonFolders.map((af) => af.cfScanResults).filter((sr) => sr !== undefined); const appScanResults: AppCurseScanResult[] = scanResults.map((scanResult) => { const addonFolder = addonFolders.find((af) => af.path === scanResult.directory); diff --git a/wowup-electron/src/app/addon-providers/curse-addon-v2-provider.ts b/wowup-electron/src/app/addon-providers/curse-addon-v2-provider.ts index bfb62226..72832c65 100644 --- a/wowup-electron/src/app/addon-providers/curse-addon-v2-provider.ts +++ b/wowup-electron/src/app/addon-providers/curse-addon-v2-provider.ts @@ -234,9 +234,7 @@ export class CurseAddonV2Provider extends AddonProvider { return; } - console.time("CFScan"); - const scanResults = await this.getScanResults(addonFolders); - console.timeEnd("CFScan"); + const scanResults = this.getScanResults(addonFolders); await this.mapAddonFolders(scanResults, installation); @@ -278,12 +276,8 @@ export class CurseAddonV2Provider extends AddonProvider { } } - public getScanResults = async (addonFolders: AddonFolder[]): Promise => { - const filePaths = addonFolders.map((addonFolder) => addonFolder.path); - const scanResults: CurseFolderScanResult[] = await this._electronService.invoke( - IPC_CURSE_GET_SCAN_RESULTS, - filePaths - ); + public getScanResults = (addonFolders: AddonFolder[]): AppCurseV2ScanResult[] => { + const scanResults = addonFolders.map((af) => af.cfScanResults).filter((sr) => sr !== undefined); const appScanResults: AppCurseV2ScanResult[] = scanResults.map((scanResult) => { const addonFolder = addonFolders.find((af) => af.path === scanResult.directory); diff --git a/wowup-electron/src/app/addon-providers/wago-addon-provider.ts b/wowup-electron/src/app/addon-providers/wago-addon-provider.ts index 51a78366..00cf55a3 100644 --- a/wowup-electron/src/app/addon-providers/wago-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/wago-addon-provider.ts @@ -208,7 +208,7 @@ export class WagoAddonProvider extends AddonProvider { } const gameVersion = this.getGameVersion(installation.clientType); - const scanResults = await this.getScanResults(addonFolders); + const scanResults = addonFolders.map((af) => af.wowUpScanResults).filter((sr) => sr !== undefined); const request: WagoFingerprintRequest = { game_version: gameVersion, diff --git a/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts b/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts index 244c542e..5cff6e7b 100644 --- a/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts @@ -249,9 +249,7 @@ export class WowUpAddonProvider extends AddonProvider { ): Promise { const gameType = this.getWowGameType(installation.clientType); - console.time("WowUpScan"); - const scanResults = await this.getScanResults(addonFolders); - console.timeEnd("WowUpScan"); + const scanResults = addonFolders.map((af) => af.wowUpScanResults).filter((sr) => sr !== undefined); const fingerprints = scanResults.map((result) => result.fingerprint); console.log("[WowUpFingerprints]", JSON.stringify(fingerprints)); diff --git a/wowup-electron/src/app/models/wowup/addon-folder.ts b/wowup-electron/src/app/models/wowup/addon-folder.ts index ff03d9c2..febb6a32 100644 --- a/wowup-electron/src/app/models/wowup/addon-folder.ts +++ b/wowup-electron/src/app/models/wowup/addon-folder.ts @@ -1,6 +1,8 @@ import { FsStats } from "../../../common/models/ipc-events"; import { Addon } from "../../../common/entities/addon"; import { Toc } from "./toc"; +import { CurseFolderScanResult } from "../../../common/curse/curse-folder-scan-result"; +import { AppWowUpScanResult } from "./app-wowup-scan-result"; export interface AddonFolder { name: string; @@ -12,4 +14,6 @@ export interface AddonFolder { tocs: Toc[]; matchingAddon?: Addon; fileStats?: FsStats; + cfScanResults?: CurseFolderScanResult; + wowUpScanResults?: AppWowUpScanResult; } diff --git a/wowup-electron/src/app/services/addons/addon-fingerprint.service.ts b/wowup-electron/src/app/services/addons/addon-fingerprint.service.ts new file mode 100644 index 00000000..33b9bbc3 --- /dev/null +++ b/wowup-electron/src/app/services/addons/addon-fingerprint.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from "@angular/core"; +import { IPC_CURSE_GET_SCAN_RESULTS, IPC_WOWUP_GET_SCAN_RESULTS } from "../../../common/constants"; +import { CurseFolderScanResult } from "../../../common/curse/curse-folder-scan-result"; +import { AddonFolder } from "../../models/wowup/addon-folder"; +import { AppWowUpScanResult } from "../../models/wowup/app-wowup-scan-result"; +import { ElectronService } from "../electron/electron.service"; + +@Injectable({ + providedIn: "root", +}) +export class AddonFingerprintService { + constructor(private _electronService: ElectronService) {} + + async getFingerprints(addonFolders: AddonFolder[]) { + const filePaths = addonFolders.map((addonFolder) => addonFolder.path); + + console.time("WowUpScan"); + const wowUpScanResults: AppWowUpScanResult[] = await this._electronService.invoke( + IPC_WOWUP_GET_SCAN_RESULTS, + filePaths + ); + console.timeEnd("WowUpScan"); + + console.time("CFScan"); + const cfScanResults: CurseFolderScanResult[] = await this._electronService.invoke( + IPC_CURSE_GET_SCAN_RESULTS, + filePaths + ); + console.timeEnd("CFScan"); + + addonFolders.forEach((af) => { + af.wowUpScanResults = wowUpScanResults.find((wur) => wur.path === af.path); + af.cfScanResults = cfScanResults.find((cfr) => cfr.directory === af.path); + }); + } +} diff --git a/wowup-electron/src/app/services/addons/addon.service.ts b/wowup-electron/src/app/services/addons/addon.service.ts index 0f4d4d79..8afcbf14 100644 --- a/wowup-electron/src/app/services/addons/addon.service.ts +++ b/wowup-electron/src/app/services/addons/addon.service.ts @@ -62,6 +62,7 @@ import { WarcraftService } from "../warcraft/warcraft.service"; import { WowUpService } from "../wowup/wowup.service"; import { AddonProviderFactory } from "./addon.provider.factory"; import { CurseAddonV2Provider } from "../../addon-providers/curse-addon-v2-provider"; +import { AddonFingerprintService } from "./addon-fingerprint.service"; export enum ScanUpdateType { Start, @@ -141,7 +142,8 @@ export class AddonService { private _fileService: FileService, private _tocService: TocService, private _warcraftInstallationService: WarcraftInstallationService, - private _addonProviderService: AddonProviderFactory + private _addonProviderService: AddonProviderFactory, + private _addonFingerprintService: AddonFingerprintService ) { // This should keep the current update queue state snapshot up to date const addonInstalledSub = this.addonInstalled$ @@ -1534,6 +1536,9 @@ export class AddonService { await this.removeGitFolders(addonFolders); + // Get all the fingerprints we might need + await this._addonFingerprintService.getFingerprints(addonFolders); + this._scanUpdateSrc.next({ type: ScanUpdateType.Update, currentCount: 0, @@ -1544,6 +1549,7 @@ export class AddonService { for (const provider of enabledProviders) { try { const validFolders = addonFolders.filter((af) => !af.ignoreReason && !af.matchingAddon && af.tocs.length > 0); + await provider.scan(installation, defaultAddonChannel, validFolders); } catch (e) { console.error(e);