From d1648d2f84852ad80098e07bf4dd670aafe48f41 Mon Sep 17 00:00:00 2001 From: jliddev Date: Mon, 22 Nov 2021 17:43:00 -0600 Subject: [PATCH] Update wago support some more --- wowup-electron/app/main.ts | 7 ++ .../src/app/addon-providers/addon-provider.ts | 3 +- .../addon-providers/wago-addon-provider.ts | 108 ++++++++++++++++++ .../addon-providers/wowup-addon-provider.ts | 2 - .../src/app/directives/webview.component.ts | 2 +- wowup-electron/src/app/models/wowup/toc.ts | 1 + .../services/addons/addon.provider.factory.ts | 12 ++ .../src/app/services/toc/toc.service.ts | 2 + wowup-electron/src/common/constants.ts | 1 + .../src/environments/environment.dev.ts | 1 + .../src/environments/environment.prod.ts | 1 + .../src/environments/environment.ts | 1 + wowup-electron/tsconfig.json | 3 +- 13 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 wowup-electron/src/app/addon-providers/wago-addon-provider.ts diff --git a/wowup-electron/app/main.ts b/wowup-electron/app/main.ts index 824f2cee..80e5dd69 100644 --- a/wowup-electron/app/main.ts +++ b/wowup-electron/app/main.ts @@ -270,6 +270,7 @@ function createWindow(): BrowserWindow { `--user-data-path=${app.getPath("userData")}`, `--base-bg-color=${getBackgroundColor()}`, ], + webviewTag: true, }, show: false, }; @@ -300,6 +301,12 @@ function createWindow(): BrowserWindow { win.webContents.userAgent = USER_AGENT; + win.webContents.on("will-attach-webview", (evt, webPreferences, params) => { + log.debug("will-attach-webview", webPreferences, params); + // in order for the wago token to be delivered this must be disabled + // webPreferences.contextIsolation = false; + }); + win.webContents.on("zoom-changed", (evt, zoomDirection) => { sendEventToContents(win, "zoom-changed", zoomDirection); }); diff --git a/wowup-electron/src/app/addon-providers/addon-provider.ts b/wowup-electron/src/app/addon-providers/addon-provider.ts index 39ebaee9..7e6a6b66 100644 --- a/wowup-electron/src/app/addon-providers/addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/addon-provider.ts @@ -16,7 +16,8 @@ export type AddonProviderType = | "WowUpHub" | "RaiderIO" | "Zip" - | "WowUpCompanion"; + | "WowUpCompanion" + | "Wago"; export interface GetAllBatchResult { installationResults: { [installationId: string]: AddonSearchResult[] }; diff --git a/wowup-electron/src/app/addon-providers/wago-addon-provider.ts b/wowup-electron/src/app/addon-providers/wago-addon-provider.ts new file mode 100644 index 00000000..d530502d --- /dev/null +++ b/wowup-electron/src/app/addon-providers/wago-addon-provider.ts @@ -0,0 +1,108 @@ +import { ADDON_PROVIDER_WAGO } from "../../common/constants"; +import { AppConfig } from "../../environments/environment"; +import { ElectronService } from "../services"; +import { WarcraftService } from "../services/warcraft/warcraft.service"; +import { CachingService } from "../services/caching/caching-service"; +import { CircuitBreakerWrapper, NetworkService } from "../services/network/network.service"; +import { AddonProvider } from "./addon-provider"; +import { WowInstallation } from "../../common/warcraft/wow-installation"; +import { AddonChannelType } from "../../common/wowup/models"; +import { AddonFolder } from "../models/wowup/addon-folder"; +import { WowClientGroup, WowClientType } from "../../common/warcraft/wow-client-type"; +import { AppWowUpScanResult } from "../models/wowup/app-wowup-scan-result"; +import { TocService } from "../services/toc/toc.service"; + +declare type WagoGameVersion = "retail" | "classic" | "bcc"; + +interface WagoFingerprintAddon { + hash: string; // hash fingerprint of the folder + cf?: string; // curseforge toc id + wowi?: string; // wow interface toc id + wago?: string; // wago interface toc id +} + +interface WagoFingerprintRequest { + game_version: WagoGameVersion; + addons: { [folder: string]: WagoFingerprintAddon }; +} + +export class WagoAddonProvider extends AddonProvider { + private readonly _circuitBreaker: CircuitBreakerWrapper; + + public readonly name = ADDON_PROVIDER_WAGO; + public readonly forceIgnore = false; + public enabled = true; + + public constructor( + private _electronService: ElectronService, + private _cachingService: CachingService, + private _networkService: NetworkService, + private _warcraftService: WarcraftService, + private _tocService: TocService + ) { + super(); + + this._circuitBreaker = _networkService.getCircuitBreaker( + `${this.name}_main`, + AppConfig.defaultHttpResetTimeoutMs, + AppConfig.wagoHttpTimeoutMs + ); + } + + public async scan( + installation: WowInstallation, + addonChannelType: AddonChannelType, + addonFolders: AddonFolder[] + ): Promise { + const gameVersion = this.getGameVersion(installation.clientType); + + console.time("WagoScan"); + const scanResults = await this.getScanResults(addonFolders); + console.timeEnd("WagoScan"); + + const request: WagoFingerprintRequest = { + game_version: gameVersion, + addons: {}, + }; + + scanResults.forEach((res) => { + const addonFolder = addonFolders.find((af) => af.name === res.folderName); + const toc = this._tocService.getTocForGameType2(addonFolder, installation.clientType); + + const waddon: WagoFingerprintAddon = { + hash: res.fingerprint, + }; + + if (toc.wagoAddonId) { + waddon.wago = toc.wagoAddonId; + } + + request.addons[res.folderName] = waddon; + }); + + console.debug(`[wago] scan`, request); + console.debug(JSON.stringify(request, null, 2)); + } + + // The wago name for the client type + private getGameVersion(clientType: WowClientType): WagoGameVersion { + const clientGroup = this._warcraftService.getClientGroup(clientType); + switch (clientGroup) { + case WowClientGroup.BurningCrusade: + return "bcc"; + case WowClientGroup.Classic: + return "classic"; + case WowClientGroup.Retail: + return "retail"; + default: + throw new Error(`[wago] Un-handled client type: ${clientType}`); + } + } + + // Scan the actual folders, luckily wago uses the same fingerprint method as wowup + private getScanResults = async (addonFolders: AddonFolder[]): Promise => { + const filePaths = addonFolders.map((addonFolder) => addonFolder.path); + const scanResults: AppWowUpScanResult[] = await this._electronService.invoke("wowup-get-scan-results", filePaths); + return scanResults; + }; +} 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 38865b8e..fd566816 100644 --- a/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts +++ b/wowup-electron/src/app/addon-providers/wowup-addon-provider.ts @@ -308,9 +308,7 @@ export class WowUpAddonProvider extends AddonProvider { public getScanResults = async (addonFolders: AddonFolder[]): Promise => { const filePaths = addonFolders.map((addonFolder) => addonFolder.path); - const scanResults: AppWowUpScanResult[] = await this._electronService.invoke(IPC_WOWUP_GET_SCAN_RESULTS, filePaths); - return scanResults; }; diff --git a/wowup-electron/src/app/directives/webview.component.ts b/wowup-electron/src/app/directives/webview.component.ts index a01eef15..aac555c5 100644 --- a/wowup-electron/src/app/directives/webview.component.ts +++ b/wowup-electron/src/app/directives/webview.component.ts @@ -30,7 +30,7 @@ export class WebviewComponent implements OnInit { const placeholder = document.createElement("div"); placeholder.innerHTML = `