Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d58e76d821 |
Binary file not shown.
Binary file not shown.
@@ -4,21 +4,19 @@
|
|||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore: Unused imports
|
// @ts-ignore: Unused imports
|
||||||
import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {number} timeout
|
* @param {number} timeout
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function CloseAppAfterTimeout(timeout) {
|
export function CloseAppAfterTimeout(timeout) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1705931481, timeout));
|
return $Call.ByID(1705931481, timeout);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function GetCurrentLauncherVersion() {
|
export function GetCurrentLauncherVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3575133982));
|
return $Call.ByID(3575133982);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,70 +4,64 @@
|
|||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore: Unused imports
|
// @ts-ignore: Unused imports
|
||||||
import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} patchPath
|
* @param {string} patchPath
|
||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string, string]>}
|
||||||
*/
|
*/
|
||||||
export function CheckTypeHDiff(patchPath) {
|
export function CheckTypeHDiff(patchPath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3717449114, patchPath));
|
return $Call.ByID(3717449114, patchPath);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} gamePath
|
* @param {string} gamePath
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function CutData(gamePath) {
|
export function CutData(gamePath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2019290107, gamePath));
|
return $Call.ByID(2019290107, gamePath);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} gamePath
|
* @param {string} gamePath
|
||||||
* @param {string} patchPath
|
* @param {string} patchPath
|
||||||
* @param {boolean} isSkipVerify
|
* @param {boolean} isSkipVerify
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function DataExtract(gamePath, patchPath, isSkipVerify) {
|
export function DataExtract(gamePath, patchPath, isSkipVerify) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2161622254, gamePath, patchPath, isSkipVerify));
|
return $Call.ByID(2161622254, gamePath, patchPath, isSkipVerify);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} gamePath
|
* @param {string} gamePath
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function DeleteFiles(gamePath) {
|
export function DeleteFiles(gamePath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1103091613, gamePath));
|
return $Call.ByID(1103091613, gamePath);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} gamePath
|
* @param {string} gamePath
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function HDiffPatchData(gamePath) {
|
export function HDiffPatchData(gamePath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3944051994, gamePath));
|
return $Call.ByID(3944051994, gamePath);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} gamePath
|
* @param {string} gamePath
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function LDiffPatchData(gamePath) {
|
export function LDiffPatchData(gamePath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(360123238, gamePath));
|
return $Call.ByID(360123238, gamePath);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} gamePath
|
* @param {string} gamePath
|
||||||
* @param {string} patchPath
|
* @param {string} patchPath
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @param {boolean} isNeedHDiff
|
||||||
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function VersionValidate(gamePath, patchPath) {
|
export function VersionValidate(gamePath, patchPath, isNeedHDiff) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2105077257, gamePath, patchPath));
|
return $Call.ByID(2105077257, gamePath, patchPath, isNeedHDiff);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,76 +4,68 @@
|
|||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore: Unused imports
|
// @ts-ignore: Unused imports
|
||||||
import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {$CancellablePromise<boolean>}
|
||||||
*/
|
*/
|
||||||
export function DirExists(path) {
|
export function DirExists(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1772289644, path));
|
return $Call.ByID(1772289644, path);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {$CancellablePromise<boolean>}
|
||||||
*/
|
*/
|
||||||
export function FileExists(path) {
|
export function FileExists(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1782610747, path));
|
return $Call.ByID(1782610747, path);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} archivePath
|
* @param {string} archivePath
|
||||||
* @param {string} fileInside
|
* @param {string} fileInside
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function FileExistsInZip(archivePath, fileInside) {
|
export function FileExistsInZip(archivePath, fileInside) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2509699047, archivePath, fileInside));
|
return $Call.ByID(2509699047, archivePath, fileInside);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function OpenFolder(path) {
|
export function OpenFolder(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1635714001, path));
|
return $Call.ByID(1635714001, path);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} filter
|
* @param {string} filter
|
||||||
* @returns {Promise<string> & { cancel(): void }}
|
* @returns {$CancellablePromise<string>}
|
||||||
*/
|
*/
|
||||||
export function PickFile(filter) {
|
export function PickFile(filter) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3756474934, filter));
|
return $Call.ByID(3756474934, filter);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {Promise<string> & { cancel(): void }}
|
* @returns {$CancellablePromise<string>}
|
||||||
*/
|
*/
|
||||||
export function PickFolder() {
|
export function PickFolder() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3654471460));
|
return $Call.ByID(3654471460);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {$CancellablePromise<boolean>}
|
||||||
*/
|
*/
|
||||||
export function StartApp(path) {
|
export function StartApp(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1267568402, path));
|
return $Call.ByID(1267568402, path);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {$CancellablePromise<boolean>}
|
||||||
*/
|
*/
|
||||||
export function StartWithConsole(path) {
|
export function StartWithConsole(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3249271428, path));
|
return $Call.ByID(3249271428, path);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,71 +4,63 @@
|
|||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore: Unused imports
|
// @ts-ignore: Unused imports
|
||||||
import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} version
|
* @param {string} version
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function DownloadProxyProgress(version) {
|
export function DownloadProxyProgress(version) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3559275334, version));
|
return $Call.ByID(3559275334, version);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} version
|
* @param {string} version
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function DownloadServerProgress(version) {
|
export function DownloadServerProgress(version) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1954767259, version));
|
return $Call.ByID(1954767259, version);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string, string]>}
|
||||||
*/
|
*/
|
||||||
export function GetLatestLauncherVersion() {
|
export function GetLatestLauncherVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(262637602));
|
return $Call.ByID(262637602);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string, string]>}
|
||||||
*/
|
*/
|
||||||
export function GetLatestProxyVersion() {
|
export function GetLatestProxyVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(289488362));
|
return $Call.ByID(289488362);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string, string]>}
|
||||||
*/
|
*/
|
||||||
export function GetLatestServerVersion() {
|
export function GetLatestServerVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2918980975));
|
return $Call.ByID(2918980975);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {Promise<void> & { cancel(): void }}
|
* @returns {$CancellablePromise<void>}
|
||||||
*/
|
*/
|
||||||
export function UnzipProxy() {
|
export function UnzipProxy() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2563246729));
|
return $Call.ByID(2563246729);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {Promise<void> & { cancel(): void }}
|
* @returns {$CancellablePromise<void>}
|
||||||
*/
|
*/
|
||||||
export function UnzipServer() {
|
export function UnzipServer() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1126363284));
|
return $Call.ByID(1126363284);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} version
|
* @param {string} version
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function UpdateLauncherProgress(version) {
|
export function UpdateLauncherProgress(version) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(97272861, version));
|
return $Call.ByID(97272861, version);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,24 +4,22 @@
|
|||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore: Unused imports
|
// @ts-ignore: Unused imports
|
||||||
import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
* @returns {Promise<[boolean, string, string, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string, string, string]>}
|
||||||
*/
|
*/
|
||||||
export function GetLanguage(path) {
|
export function GetLanguage(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3574191687, path));
|
return $Call.ByID(3574191687, path);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} path
|
* @param {string} path
|
||||||
* @param {string} text
|
* @param {string} text
|
||||||
* @param {string} voice
|
* @param {string} voice
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {$CancellablePromise<[boolean, string]>}
|
||||||
*/
|
*/
|
||||||
export function SetLanguage(path, text, voice) {
|
export function SetLanguage(path, text, voice) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2768939795, path, text, voice));
|
return $Call.ByID(2768939795, path, text, voice);
|
||||||
return $resultPromise;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,90 +103,81 @@ export default function DiffPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleUpdateGame = async () => {
|
const handleUpdateGame = async () => {
|
||||||
|
const handleResult = (ok: boolean, error: string) => {
|
||||||
|
if (!ok) {
|
||||||
|
toast.error(error)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
setIsDiffLoading(true)
|
setIsDiffLoading(true)
|
||||||
|
|
||||||
if (!gameDir || !diffDir) {
|
if (!gameDir || !diffDir) {
|
||||||
toast.error('Please select game directory and diff file')
|
toast.error('Please select game directory and diff file')
|
||||||
setIsDiffLoading(false)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
setStageType('Check Type HDiff')
|
setStageType('Check Type HDiff')
|
||||||
setProgressUpdate(0)
|
setProgressUpdate(0)
|
||||||
setMaxProgressUpdate(1)
|
setMaxProgressUpdate(1)
|
||||||
|
|
||||||
const [isOk, validType, errorType] = await DiffService.CheckTypeHDiff(diffDir)
|
const [isOk, validType, errorType] = await DiffService.CheckTypeHDiff(diffDir)
|
||||||
if (!isOk) {
|
if (!handleResult(isOk, errorType)) return
|
||||||
toast.error(errorType)
|
|
||||||
setIsDiffLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
setProgressUpdate(1)
|
setProgressUpdate(1)
|
||||||
|
|
||||||
if (validType === 'hdiffmap.json') {
|
if (['hdiffmap.json', 'hdifffiles.txt', 'hdifffiles.json'].includes(validType)) {
|
||||||
setStageType('Version Validate')
|
setStageType('Version Validate')
|
||||||
setProgressUpdate(0)
|
setProgressUpdate(0)
|
||||||
setMaxProgressUpdate(1)
|
setMaxProgressUpdate(1)
|
||||||
const [validVersion, errorVersion] = await DiffService.VersionValidate(gameDir, diffDir)
|
const isNeedHDiff = validType !== 'hdiffmap.json'
|
||||||
if (!validVersion) {
|
const [validVersion, errorVersion] = await DiffService.VersionValidate(gameDir, diffDir, isNeedHDiff)
|
||||||
toast.error(errorVersion)
|
if (!handleResult(validVersion, errorVersion)) return
|
||||||
setIsDiffLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
setProgressUpdate(1)
|
setProgressUpdate(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
const isSkipVerify = validType === 'manifest' || validType === 'hdifffiles.txt'
|
const isSkipVerify = ['manifest', 'hdifffiles.txt', 'hdifffiles.json'].includes(validType)
|
||||||
setStageType('Data Extract')
|
setStageType('Data Extract')
|
||||||
const [validData, errorData] = await DiffService.DataExtract(gameDir, diffDir, isSkipVerify)
|
const [validData, errorData] = await DiffService.DataExtract(gameDir, diffDir, isSkipVerify)
|
||||||
if (!validData) {
|
if (!handleResult(validData, errorData)) return
|
||||||
toast.error(errorData)
|
|
||||||
setIsDiffLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setStageType('Cut Data')
|
setStageType('Cut Data')
|
||||||
setMessageUpdate('')
|
setMessageUpdate('')
|
||||||
const [validCut, errorCut] = await DiffService.CutData(gameDir)
|
const [validCut, errorCut] = await DiffService.CutData(gameDir)
|
||||||
if (!validCut) {
|
if (!handleResult(validCut, errorCut)) return
|
||||||
toast.error(errorCut)
|
|
||||||
setIsDiffLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( validType === 'hdifffiles.txt' || validType === 'hdiffmap.json') {
|
switch (validType) {
|
||||||
setStageType('Patch Data')
|
case 'hdifffiles.txt':
|
||||||
const [validPatch, errorPatch] = await DiffService.HDiffPatchData(gameDir)
|
case 'hdiffmap.json':
|
||||||
if (!validPatch) {
|
case 'hdifffiles.json': {
|
||||||
toast.error(errorPatch)
|
setStageType('Patch Data')
|
||||||
setIsDiffLoading(false)
|
const [validPatch, errorPatch] = await DiffService.HDiffPatchData(gameDir)
|
||||||
return
|
if (!handleResult(validPatch, errorPatch)) return
|
||||||
|
|
||||||
|
setStageType('Delete old files')
|
||||||
|
const [validDelete, errorDelete] = await DiffService.DeleteFiles(gameDir)
|
||||||
|
if (!handleResult(validDelete, errorDelete)) return
|
||||||
|
break
|
||||||
}
|
}
|
||||||
setStageType('Delete old files')
|
case 'manifest': {
|
||||||
const [validDelete, errorDelete] = await DiffService.DeleteFiles(gameDir)
|
setStageType('Patch Data')
|
||||||
if (!validDelete) {
|
const [validPatch, errorPatch] = await DiffService.LDiffPatchData(gameDir)
|
||||||
toast.error(errorDelete)
|
if (!handleResult(validPatch, errorPatch)) return
|
||||||
setIsDiffLoading(false)
|
break
|
||||||
return
|
|
||||||
}
|
|
||||||
} else if (validType === 'manifest') {
|
|
||||||
setStageType('Patch Data')
|
|
||||||
const [validPatch, errorPatch] = await DiffService.LDiffPatchData(gameDir)
|
|
||||||
if (!validPatch) {
|
|
||||||
toast.error(errorPatch)
|
|
||||||
setIsDiffLoading(false)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
toast.success('Update game completed')
|
toast.success('Update game completed')
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
toast.error('PickFile error:', err)
|
toast.error(`PickFile error: ${err}`)
|
||||||
setIsDiffLoading(false)
|
|
||||||
} finally {
|
} finally {
|
||||||
setIsDiffLoading(false)
|
setIsDiffLoading(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="p-2 mx-4">
|
<div className="p-2 mx-4">
|
||||||
<div className="max-w-4xl mx-auto">
|
<div className="max-w-4xl mx-auto">
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"firefly-launcher/pkg/hpatchz"
|
"firefly-launcher/pkg/hpatchz"
|
||||||
"firefly-launcher/pkg/models"
|
"firefly-launcher/pkg/models"
|
||||||
"firefly-launcher/pkg/sevenzip"
|
"firefly-launcher/pkg/sevenzip"
|
||||||
|
"firefly-launcher/pkg/verifier"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -21,6 +22,9 @@ func (h *DiffService) CheckTypeHDiff(patchPath string) (bool, string, string) {
|
|||||||
if ok, err := sevenzip.IsFileIn7z(patchPath, "hdifffiles.txt"); err == nil && ok {
|
if ok, err := sevenzip.IsFileIn7z(patchPath, "hdifffiles.txt"); err == nil && ok {
|
||||||
return true, "hdifffiles.txt", ""
|
return true, "hdifffiles.txt", ""
|
||||||
}
|
}
|
||||||
|
if ok, err := sevenzip.IsFileIn7z(patchPath, "hdifffiles.txt"); err == nil && ok {
|
||||||
|
return true, "hdifffiles.json", ""
|
||||||
|
}
|
||||||
if ok, err := sevenzip.IsFileIn7z(patchPath, "hdiffmap.json"); err == nil && ok {
|
if ok, err := sevenzip.IsFileIn7z(patchPath, "hdiffmap.json"); err == nil && ok {
|
||||||
return true, "hdiffmap.json", ""
|
return true, "hdiffmap.json", ""
|
||||||
}
|
}
|
||||||
@@ -31,8 +35,9 @@ func (h *DiffService) CheckTypeHDiff(patchPath string) (bool, string, string) {
|
|||||||
return false, "", "not found hdifffiles.txt or hdiffmap.json"
|
return false, "", "not found hdifffiles.txt or hdiffmap.json"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DiffService) VersionValidate(gamePath, patchPath string) (bool, string) {
|
func (h *DiffService) VersionValidate(gamePath, patchPath string, isNeedHDiff bool) (bool, string) {
|
||||||
oldVersionData, err := models.ParseBinaryVersion(filepath.Join(gamePath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes"))
|
oldBinPath := filepath.Join(gamePath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes")
|
||||||
|
oldVersionData, err := models.ParseBinaryVersion(oldBinPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err.Error()
|
return false, err.Error()
|
||||||
}
|
}
|
||||||
@@ -46,28 +51,104 @@ func (h *DiffService) VersionValidate(gamePath, patchPath string) (bool, string)
|
|||||||
return false, err.Error()
|
return false, err.Error()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := sevenzip.ExtractAFileFromZip(patchPath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes", constant.TempUrl); err != nil {
|
|
||||||
|
if !isNeedHDiff {
|
||||||
|
if err := sevenzip.ExtractAFileFromZip(patchPath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes", constant.TempUrl); err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
binPath := filepath.Join(constant.TempUrl, "BinaryVersion.bytes")
|
||||||
|
newVersionData, err := models.ParseBinaryVersion(binPath)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
defer os.Remove(binPath)
|
||||||
|
|
||||||
|
v := newVersionData.Subtract(oldVersionData)
|
||||||
|
if v != 0 && v != 1 {
|
||||||
|
return false, fmt.Sprintf("the diff version %s not valid with game version %s", newVersionData, oldVersionData)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, "validated"
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sevenzip.ExtractAFileFromZip(patchPath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes.hdiff", constant.TempUrl); err != nil {
|
||||||
return false, err.Error()
|
return false, err.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
binPath := filepath.Join(constant.TempUrl, "BinaryVersion.bytes")
|
patchBinFile := filepath.Join(constant.TempUrl, "BinaryVersion.bytes.hdiff")
|
||||||
newVersionData, err := models.ParseBinaryVersion(binPath)
|
sourceBinFile := filepath.Join(gamePath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes")
|
||||||
|
tempBinFile := filepath.Join(constant.TempUrl, "BinaryVersion.bytes")
|
||||||
|
if err := hpatchz.ApplyPatch(sourceBinFile, patchBinFile, tempBinFile); err != nil {
|
||||||
|
os.Remove(patchBinFile)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
os.Remove(patchBinFile)
|
||||||
|
|
||||||
|
okFullPkg, err1 := sevenzip.IsFileIn7z(patchPath, "pkg_version")
|
||||||
|
okDiffPkg, err2 := sevenzip.IsFileIn7z(patchPath, "pkg_version.hdiff")
|
||||||
|
if err1 != nil && err2 != nil {
|
||||||
|
return false, err1.Error()
|
||||||
|
}
|
||||||
|
if okFullPkg {
|
||||||
|
if err := sevenzip.ExtractAFileFromZip(patchPath, "pkg_version", constant.TempUrl); err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if okDiffPkg {
|
||||||
|
|
||||||
|
if err := sevenzip.ExtractAFileFromZip(patchPath, "pkg_version.hdiff", constant.TempUrl); err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
patchPkgFile := filepath.Join(constant.TempUrl, "pkg_version.hdiff")
|
||||||
|
sourcePkgFile := filepath.Join(gamePath, "pkg_version")
|
||||||
|
tempPkgFile := filepath.Join(constant.TempUrl, "pkg_version")
|
||||||
|
if err := hpatchz.ApplyPatch(sourcePkgFile, patchPkgFile, tempPkgFile); err != nil {
|
||||||
|
os.Remove(patchPkgFile)
|
||||||
|
os.Remove(tempPkgFile)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
os.Remove(patchPkgFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
tempPkgFile := filepath.Join(constant.TempUrl, "pkg_version")
|
||||||
|
pkgDataList, err := models.LoadPkgVersion(tempPkgFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
os.Remove(tempPkgFile)
|
||||||
return false, err.Error()
|
return false, err.Error()
|
||||||
}
|
}
|
||||||
defer os.Remove(binPath)
|
os.Remove(tempPkgFile)
|
||||||
|
|
||||||
v := newVersionData.Subtract(*oldVersionData)
|
for _, pkgData := range pkgDataList {
|
||||||
if v != 0 && v != 1 {
|
if filepath.ToSlash(pkgData.RemoteFile) == "StarRail_Data/StreamingAssets/BinaryVersion.bytes" {
|
||||||
return false, fmt.Sprintf("the diff version %s not valid with game version %s", newVersionData, oldVersionData)
|
md5, err := verifier.FileMD5(tempBinFile)
|
||||||
|
if err != nil {
|
||||||
|
os.Remove(tempBinFile)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
if md5 != pkgData.MD5 {
|
||||||
|
os.Remove(tempBinFile)
|
||||||
|
return false, fmt.Sprintf("md5 mismatch for %s: expected %s, got %s",
|
||||||
|
tempBinFile, pkgData.MD5, md5)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err = models.ParseBinaryVersion(tempBinFile)
|
||||||
|
if err != nil {
|
||||||
|
os.Remove(tempBinFile)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
os.Remove(tempBinFile)
|
||||||
return true, "validated"
|
return true, "validated"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DiffService) HDiffPatchData(gamePath string) (bool, string) {
|
func (h *DiffService) HDiffPatchData(gamePath string) (bool, string) {
|
||||||
hdiffMapPath := filepath.Join(gamePath, "hdiffmap.json")
|
hdiffMapPath := filepath.Join(gamePath, "hdiffmap.json")
|
||||||
hdiffFilesPath := filepath.Join(gamePath, "hdifffiles.txt")
|
hdiffFilesPath := filepath.Join(gamePath, "hdifffiles.txt")
|
||||||
|
hdifffilesJsonPath := filepath.Join(gamePath, "hdifffiles.json")
|
||||||
|
|
||||||
var jsonData struct {
|
var jsonData struct {
|
||||||
DiffMap []*models.HDiffData `json:"diff_map"`
|
DiffMap []*models.HDiffData `json:"diff_map"`
|
||||||
@@ -88,6 +169,14 @@ func (h *DiffService) HDiffPatchData(gamePath string) (bool, string) {
|
|||||||
for _, entry := range jsonDataDiffMap.DiffMap {
|
for _, entry := range jsonDataDiffMap.DiffMap {
|
||||||
jsonData.DiffMap = append(jsonData.DiffMap, entry.ToHDiffData())
|
jsonData.DiffMap = append(jsonData.DiffMap, entry.ToHDiffData())
|
||||||
}
|
}
|
||||||
|
} else if _, err := os.Stat(hdifffilesJsonPath); err == nil {
|
||||||
|
data, err := os.ReadFile(hdifffilesJsonPath)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(data, &jsonData); err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
} else if _, err := os.Stat(hdiffFilesPath); err == nil {
|
} else if _, err := os.Stat(hdiffFilesPath); err == nil {
|
||||||
files, err := models.LoadHDiffFiles(hdiffFilesPath)
|
files, err := models.LoadHDiffFiles(hdiffFilesPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -99,6 +188,7 @@ func (h *DiffService) HDiffPatchData(gamePath string) (bool, string) {
|
|||||||
} else {
|
} else {
|
||||||
return false, "no hdiff entries map exist"
|
return false, "no hdiff entries map exist"
|
||||||
}
|
}
|
||||||
|
|
||||||
application.Get().Event.Emit("diff:stage", map[string]string{"stage": "Patching HDiff"})
|
application.Get().Event.Emit("diff:stage", map[string]string{"stage": "Patching HDiff"})
|
||||||
for i, entry := range jsonData.DiffMap {
|
for i, entry := range jsonData.DiffMap {
|
||||||
application.Get().Event.Emit(
|
application.Get().Event.Emit(
|
||||||
@@ -134,6 +224,7 @@ func (h *DiffService) HDiffPatchData(gamePath string) (bool, string) {
|
|||||||
|
|
||||||
os.Remove(filepath.Join(gamePath, "hdiffmap.json"))
|
os.Remove(filepath.Join(gamePath, "hdiffmap.json"))
|
||||||
os.Remove(filepath.Join(gamePath, "hdifffiles.txt"))
|
os.Remove(filepath.Join(gamePath, "hdifffiles.txt"))
|
||||||
|
os.Remove(filepath.Join(gamePath, "hdifffiles.json"))
|
||||||
return true, "patching completed"
|
return true, "patching completed"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const ProxyZipFile = "64bit.zip"
|
|||||||
const LauncherFile = "firefly-launcher.exe"
|
const LauncherFile = "firefly-launcher.exe"
|
||||||
const TempUrl = "./temp"
|
const TempUrl = "./temp"
|
||||||
|
|
||||||
const CurrentLauncherVersion = "1.6.0"
|
const CurrentLauncherVersion = "1.7.0"
|
||||||
|
|
||||||
type ToolFile string
|
type ToolFile string
|
||||||
|
|
||||||
|
|||||||
@@ -10,10 +10,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type BinaryVersion struct {
|
type BinaryVersion struct {
|
||||||
Name string
|
Name string
|
||||||
Major int
|
Major int
|
||||||
Minor int
|
Minor int
|
||||||
Patch int
|
Patch int
|
||||||
|
Data []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseBinaryVersion(path string) (*BinaryVersion, error) {
|
func ParseBinaryVersion(path string) (*BinaryVersion, error) {
|
||||||
@@ -64,17 +65,18 @@ func ParseBinaryVersion(path string) (*BinaryVersion, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binaryVersion.Data = data
|
||||||
return &binaryVersion, nil
|
return &binaryVersion, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *BinaryVersion) String() string {
|
func (v *BinaryVersion) String() string {
|
||||||
return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch)
|
return fmt.Sprintf("%s-%d.%d.%d", v.Name, v.Major, v.Minor, v.Patch)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v BinaryVersion) ToInt() int {
|
func (v BinaryVersion) ToInt() int {
|
||||||
return v.Major*100 + v.Minor*10 + v.Patch
|
return v.Major*100 + v.Minor*10 + v.Patch
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v BinaryVersion) Subtract(other BinaryVersion) int {
|
func (v BinaryVersion) Subtract(other *BinaryVersion) int {
|
||||||
return v.ToInt() - other.ToInt()
|
return v.ToInt() - other.ToInt()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func check(relPath string, expectedSize int64, expectedMD5, base string) error {
|
|||||||
fullPath, expectedSize, info.Size())
|
fullPath, expectedSize, info.Size())
|
||||||
}
|
}
|
||||||
|
|
||||||
md5Hash, err := fileMD5(fullPath)
|
md5Hash, err := FileMD5(fullPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error reading %s: %w", fullPath, err)
|
return fmt.Errorf("error reading %s: %w", fullPath, err)
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ func check(relPath string, expectedSize int64, expectedMD5, base string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func fileMD5(path string) (string, error) {
|
func FileMD5(path string) (string, error) {
|
||||||
f, err := os.Open(path)
|
f, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|||||||
Reference in New Issue
Block a user