Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a021658fa9 | |||
| 6b222bfa70 | |||
| 99b9df1ce5 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,6 +3,7 @@ bin
|
|||||||
tests/
|
tests/
|
||||||
server/
|
server/
|
||||||
proxy/
|
proxy/
|
||||||
|
proto/
|
||||||
temp/
|
temp/
|
||||||
frontend/dist
|
frontend/dist
|
||||||
frontend/node_modules
|
frontend/node_modules
|
||||||
|
|||||||
7
Makefile
Normal file
7
Makefile
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
PROTO_SRC=./proto
|
||||||
|
GEN_DEST=./pkg
|
||||||
|
|
||||||
|
build_proto:
|
||||||
|
@echo Compiling Protobuf files...
|
||||||
|
protoc --go_out=${GEN_DEST} --go-grpc_out=${GEN_DEST} ${PROTO_SRC}/*.proto
|
||||||
|
@echo Done!
|
||||||
@@ -11,7 +11,7 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function CloseAppAfterTimeout(timeout) {
|
export function CloseAppAfterTimeout(timeout) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(982751559, timeout));
|
let $resultPromise = /** @type {any} */($Call.ByID(1705931481, timeout));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,6 +19,6 @@ export function CloseAppAfterTimeout(timeout) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function GetCurrentLauncherVersion() {
|
export function GetCurrentLauncherVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2542090372));
|
let $resultPromise = /** @type {any} */($Call.ByID(3575133982));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
import * as AppService from "./appservice.js";
|
||||||
|
export {
|
||||||
|
AppService
|
||||||
|
};
|
||||||
@@ -11,7 +11,7 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
|||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function CheckTypeHDiff(patchPath) {
|
export function CheckTypeHDiff(patchPath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1068035136, patchPath));
|
let $resultPromise = /** @type {any} */($Call.ByID(3717449114, patchPath));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ export function CheckTypeHDiff(patchPath) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function CutData(gamePath) {
|
export function CutData(gamePath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3671642725, gamePath));
|
let $resultPromise = /** @type {any} */($Call.ByID(2019290107, gamePath));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ export function CutData(gamePath) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function DataExtract(gamePath, patchPath, isSkipVerify) {
|
export function DataExtract(gamePath, patchPath, isSkipVerify) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1843136452, gamePath, patchPath, isSkipVerify));
|
let $resultPromise = /** @type {any} */($Call.ByID(2161622254, gamePath, patchPath, isSkipVerify));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ export function DataExtract(gamePath, patchPath, isSkipVerify) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function DeleteFiles(gamePath) {
|
export function DeleteFiles(gamePath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(989019003, gamePath));
|
let $resultPromise = /** @type {any} */($Call.ByID(1103091613, gamePath));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,8 +48,17 @@ export function DeleteFiles(gamePath) {
|
|||||||
* @param {string} gamePath
|
* @param {string} gamePath
|
||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function PatchData(gamePath) {
|
export function HDiffPatchData(gamePath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3608591627, gamePath));
|
let $resultPromise = /** @type {any} */($Call.ByID(3944051994, gamePath));
|
||||||
|
return $resultPromise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} gamePath
|
||||||
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
|
*/
|
||||||
|
export function LDiffPatchData(gamePath) {
|
||||||
|
let $resultPromise = /** @type {any} */($Call.ByID(360123238, gamePath));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,6 +68,6 @@ export function PatchData(gamePath) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function VersionValidate(gamePath, patchPath) {
|
export function VersionValidate(gamePath, patchPath) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3916254383, gamePath, patchPath));
|
let $resultPromise = /** @type {any} */($Call.ByID(2105077257, gamePath, patchPath));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
import * as DiffService from "./diffservice.js";
|
||||||
|
export {
|
||||||
|
DiffService
|
||||||
|
};
|
||||||
@@ -11,7 +11,7 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
|||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {Promise<boolean> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function DirExists(path) {
|
export function DirExists(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1291974398, path));
|
let $resultPromise = /** @type {any} */($Call.ByID(1772289644, path));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ export function DirExists(path) {
|
|||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {Promise<boolean> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function FileExists(path) {
|
export function FileExists(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3373618865, path));
|
let $resultPromise = /** @type {any} */($Call.ByID(1782610747, path));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ export function FileExists(path) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function FileExistsInZip(archivePath, fileInside) {
|
export function FileExistsInZip(archivePath, fileInside) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1737012553, archivePath, fileInside));
|
let $resultPromise = /** @type {any} */($Call.ByID(2509699047, archivePath, fileInside));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,15 +39,16 @@ export function FileExistsInZip(archivePath, fileInside) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function OpenFolder(path) {
|
export function OpenFolder(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2733319263, path));
|
let $resultPromise = /** @type {any} */($Call.ByID(1635714001, path));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param {string} filter
|
||||||
* @returns {Promise<string> & { cancel(): void }}
|
* @returns {Promise<string> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function PickFile() {
|
export function PickFile(filter) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2181012076));
|
let $resultPromise = /** @type {any} */($Call.ByID(3756474934, filter));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ export function PickFile() {
|
|||||||
* @returns {Promise<string> & { cancel(): void }}
|
* @returns {Promise<string> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function PickFolder() {
|
export function PickFolder() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3906046322));
|
let $resultPromise = /** @type {any} */($Call.ByID(3654471460));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +65,7 @@ export function PickFolder() {
|
|||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {Promise<boolean> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function StartApp(path) {
|
export function StartApp(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3825990132, path));
|
let $resultPromise = /** @type {any} */($Call.ByID(1267568402, path));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,6 +74,6 @@ export function StartApp(path) {
|
|||||||
* @returns {Promise<boolean> & { cancel(): void }}
|
* @returns {Promise<boolean> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function StartWithConsole(path) {
|
export function StartWithConsole(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2364569062, path));
|
let $resultPromise = /** @type {any} */($Call.ByID(3249271428, path));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
import * as FSService from "./fsservice.js";
|
||||||
|
export {
|
||||||
|
FSService
|
||||||
|
};
|
||||||
@@ -11,7 +11,7 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function DownloadProxyProgress(version) {
|
export function DownloadProxyProgress(version) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1951249093, version));
|
let $resultPromise = /** @type {any} */($Call.ByID(3559275334, version));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ export function DownloadProxyProgress(version) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function DownloadServerProgress(version) {
|
export function DownloadServerProgress(version) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(314135954, version));
|
let $resultPromise = /** @type {any} */($Call.ByID(1954767259, version));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ export function DownloadServerProgress(version) {
|
|||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function GetLatestLauncherVersion() {
|
export function GetLatestLauncherVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3191972855));
|
let $resultPromise = /** @type {any} */($Call.ByID(262637602));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ export function GetLatestLauncherVersion() {
|
|||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function GetLatestProxyVersion() {
|
export function GetLatestProxyVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1462362449));
|
let $resultPromise = /** @type {any} */($Call.ByID(289488362));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ export function GetLatestProxyVersion() {
|
|||||||
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function GetLatestServerVersion() {
|
export function GetLatestServerVersion() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(1447982978));
|
let $resultPromise = /** @type {any} */($Call.ByID(2918980975));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ export function GetLatestServerVersion() {
|
|||||||
* @returns {Promise<void> & { cancel(): void }}
|
* @returns {Promise<void> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function UnzipProxy() {
|
export function UnzipProxy() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(4071181044));
|
let $resultPromise = /** @type {any} */($Call.ByID(2563246729));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ export function UnzipProxy() {
|
|||||||
* @returns {Promise<void> & { cancel(): void }}
|
* @returns {Promise<void> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function UnzipServer() {
|
export function UnzipServer() {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(4110296071));
|
let $resultPromise = /** @type {any} */($Call.ByID(1126363284));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +69,6 @@ export function UnzipServer() {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function UpdateLauncherProgress(version) {
|
export function UpdateLauncherProgress(version) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2648938152, version));
|
let $resultPromise = /** @type {any} */($Call.ByID(97272861, version));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
import * as GitService from "./gitservice.js";
|
||||||
|
export {
|
||||||
|
GitService
|
||||||
|
};
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// @ts-check
|
|
||||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
|
||||||
// This file is automatically generated. DO NOT EDIT
|
|
||||||
|
|
||||||
import * as AppService from "./appservice.js";
|
|
||||||
import * as FSService from "./fsservice.js";
|
|
||||||
import * as GitService from "./gitservice.js";
|
|
||||||
import * as HdiffzService from "./hdiffzservice.js";
|
|
||||||
import * as LanguageService from "./languageservice.js";
|
|
||||||
export {
|
|
||||||
AppService,
|
|
||||||
FSService,
|
|
||||||
GitService,
|
|
||||||
HdiffzService,
|
|
||||||
LanguageService
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// @ts-check
|
||||||
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
|
import * as LanguageService from "./languageservice.js";
|
||||||
|
export {
|
||||||
|
LanguageService
|
||||||
|
};
|
||||||
@@ -11,7 +11,7 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime";
|
|||||||
* @returns {Promise<[boolean, string, string, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string, string, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function GetLanguage(path) {
|
export function GetLanguage(path) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(3450750492, path));
|
let $resultPromise = /** @type {any} */($Call.ByID(3574191687, path));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,6 +22,6 @@ export function GetLanguage(path) {
|
|||||||
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
* @returns {Promise<[boolean, string]> & { cancel(): void }}
|
||||||
*/
|
*/
|
||||||
export function SetLanguage(path, text, voice) {
|
export function SetLanguage(path, text, voice) {
|
||||||
let $resultPromise = /** @type {any} */($Call.ByID(2793672496, path, text, voice));
|
let $resultPromise = /** @type {any} */($Call.ByID(2768939795, path, text, voice));
|
||||||
return $resultPromise;
|
return $resultPromise;
|
||||||
}
|
}
|
||||||
2626
frontend/package-lock.json
generated
2626
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -11,33 +11,33 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tailwindcss/vite": "^4.1.11",
|
"@tailwindcss/vite": "^4.1.12",
|
||||||
"@tanstack/react-router": "^1.124.0",
|
"@tanstack/react-router": "^1.131.27",
|
||||||
"@tanstack/react-router-devtools": "^1.124.0",
|
"@tanstack/react-router-devtools": "^1.131.27",
|
||||||
"lucide-react": "^0.525.0",
|
"lucide-react": "^0.541.0",
|
||||||
"motion": "^12.23.0",
|
"motion": "^12.23.12",
|
||||||
"path-browserify": "^1.0.1",
|
"path-browserify": "^1.0.1",
|
||||||
"react": "^18.2.0",
|
"react": "^19.1.1",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^19.1.1",
|
||||||
"react-toastify": "^11.0.5",
|
"react-toastify": "^11.0.5",
|
||||||
"tailwindcss": "^4.1.11",
|
"tailwindcss": "^4.1.12",
|
||||||
"zustand": "^5.0.6"
|
"zustand": "^5.0.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tanstack/router-plugin": "^1.124.0",
|
"@tanstack/router-plugin": "^1.131.27",
|
||||||
"@types/node": "^24.0.10",
|
"@types/node": "^24.3.0",
|
||||||
"@types/path-browserify": "^1.0.3",
|
"@types/path-browserify": "^1.0.3",
|
||||||
"@types/react": "^18.2.43",
|
"@types/react": "^19.1.11",
|
||||||
"@types/react-dom": "^18.2.17",
|
"@types/react-dom": "^19.1.7",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
"@typescript-eslint/eslint-plugin": "^8.40.0",
|
||||||
"@typescript-eslint/parser": "^6.14.0",
|
"@typescript-eslint/parser": "^8.40.0",
|
||||||
"@vitejs/plugin-react": "^4.2.1",
|
"@vitejs/plugin-react": "^5.0.1",
|
||||||
"@wailsio/runtime": "^3.0.0-alpha.66",
|
"@wailsio/runtime": "^3.0.0-alpha.66",
|
||||||
"daisyui": "^5.0.43",
|
"daisyui": "^5.0.50",
|
||||||
"eslint": "^8.55.0",
|
"eslint": "^9.34.0",
|
||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
"eslint-plugin-react-refresh": "^0.4.5",
|
"eslint-plugin-react-refresh": "^0.4.20",
|
||||||
"typescript": "^5.2.2",
|
"typescript": "^5.9.2",
|
||||||
"vite": "^5.0.8"
|
"vite": "^7.1.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import useLauncherStore from "@/stores/launcherStore";
|
import useLauncherStore from "@/stores/launcherStore";
|
||||||
import { AppService, GitService } from "@bindings/firefly-launcher/internal";
|
import { AppService, } from "@bindings/firefly-launcher/internal/app-service";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
import { sleep } from "./sleep";
|
import { sleep } from "./sleep";
|
||||||
|
import { GitService } from "@bindings/firefly-launcher/internal/git-service";
|
||||||
|
|
||||||
export async function CheckUpdateLauncher(): Promise<{ isUpdate: boolean; isExists: boolean; version: string }> {
|
export async function CheckUpdateLauncher(): Promise<{ isUpdate: boolean; isExists: boolean; version: string }> {
|
||||||
const [currentOk, currentVersion] = await AppService.GetCurrentLauncherVersion()
|
const [currentOk, currentVersion] = await AppService.GetCurrentLauncherVersion()
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import useLauncherStore from "@/stores/launcherStore";
|
import useLauncherStore from "@/stores/launcherStore";
|
||||||
import useSettingStore from "@/stores/settingStore";
|
import useSettingStore from "@/stores/settingStore";
|
||||||
import { FSService, GitService } from "@bindings/firefly-launcher/internal";
|
import { FSService } from "@bindings/firefly-launcher/internal/fs-service";
|
||||||
|
import { GitService } from "@bindings/firefly-launcher/internal/git-service";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
|
|
||||||
export async function CheckUpdateProxy(proxyPath: string, proxyVersion: string) : Promise<{isUpdate: boolean, isExists: boolean, version: string}> {
|
export async function CheckUpdateProxy(proxyPath: string, proxyVersion: string) : Promise<{isUpdate: boolean, isExists: boolean, version: string}> {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import useLauncherStore from '@/stores/launcherStore';
|
import useLauncherStore from '@/stores/launcherStore';
|
||||||
import useSettingStore from '@/stores/settingStore';
|
import useSettingStore from '@/stores/settingStore';
|
||||||
import { FSService, GitService } from '@bindings/firefly-launcher/internal';
|
import { FSService } from '@bindings/firefly-launcher/internal/fs-service';
|
||||||
|
import { GitService } from '@bindings/firefly-launcher/internal/git-service';
|
||||||
import { toast } from 'react-toastify';
|
import { toast } from 'react-toastify';
|
||||||
|
|
||||||
export async function CheckUpdateServer(
|
export async function CheckUpdateServer(
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export function useGlobalEvents({
|
|||||||
setProgressDownload,
|
setProgressDownload,
|
||||||
setDownloadSpeed,
|
setDownloadSpeed,
|
||||||
setMessageUpdate,
|
setMessageUpdate,
|
||||||
|
setStageType,
|
||||||
|
|
||||||
}: {
|
}: {
|
||||||
setGameRunning: (v: boolean) => void;
|
setGameRunning: (v: boolean) => void;
|
||||||
@@ -22,6 +23,7 @@ export function useGlobalEvents({
|
|||||||
setProgressDownload: (v: number) => void;
|
setProgressDownload: (v: number) => void;
|
||||||
setDownloadSpeed: (v: number) => void;
|
setDownloadSpeed: (v: number) => void;
|
||||||
setMessageUpdate: (v: string) => void;
|
setMessageUpdate: (v: string) => void;
|
||||||
|
setStageType: (v: string) => void,
|
||||||
}) {
|
}) {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onGameExit = () => setGameRunning(false);
|
const onGameExit = () => setGameRunning(false);
|
||||||
@@ -45,14 +47,20 @@ export function useGlobalEvents({
|
|||||||
setMessageUpdate(message);
|
setMessageUpdate(message);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onStageUpdate = (event: any) => {
|
||||||
|
const { stage } = event.data[0];
|
||||||
|
setStageType(stage);
|
||||||
|
};
|
||||||
|
|
||||||
Events.On("download:server", onDownload);
|
Events.On("download:server", onDownload);
|
||||||
Events.On("download:proxy", onDownload);
|
Events.On("download:proxy", onDownload);
|
||||||
Events.On("game:exit", onGameExit);
|
Events.On("game:exit", onGameExit);
|
||||||
Events.On("server:exit", onServerExit);
|
Events.On("server:exit", onServerExit);
|
||||||
Events.On("proxy:exit", onProxyExit);
|
Events.On("proxy:exit", onProxyExit);
|
||||||
Events.On("hdiffz:progress", onUpdateProgress);
|
Events.On("diff:progress", onUpdateProgress);
|
||||||
Events.On("hdiffz:message", onMessageUpdate);
|
Events.On("diff:message", onMessageUpdate);
|
||||||
Events.On("hdiffz:error", (event: any) => {
|
Events.On("diff:stage", onStageUpdate);
|
||||||
|
Events.On("diff:error", (event: any) => {
|
||||||
const { message } = event.data[0];
|
const { message } = event.data[0];
|
||||||
toast.error(message);
|
toast.error(message);
|
||||||
});
|
});
|
||||||
@@ -63,8 +71,9 @@ export function useGlobalEvents({
|
|||||||
Events.Off("game:exit");
|
Events.Off("game:exit");
|
||||||
Events.Off("server:exit");
|
Events.Off("server:exit");
|
||||||
Events.Off("proxy:exit");
|
Events.Off("proxy:exit");
|
||||||
Events.Off("hdiffz:progress");
|
Events.Off("diff:progress")
|
||||||
Events.Off("hdiffz:message");
|
Events.Off("diff:message");
|
||||||
|
Events.Off("diff:stage");
|
||||||
Events.Off("version:check");
|
Events.Off("version:check");
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ import useSettingStore from "@/stores/settingStore"
|
|||||||
import { Check, Folder, File, X, Settings } from "lucide-react"
|
import { Check, Folder, File, X, Settings } from "lucide-react"
|
||||||
import { useEffect } from "react"
|
import { useEffect } from "react"
|
||||||
import { toast } from "react-toastify"
|
import { toast } from "react-toastify"
|
||||||
import { FSService, HdiffzService} from "@bindings/firefly-launcher/internal"
|
import { DiffService} from "@bindings/firefly-launcher/internal/diff-service"
|
||||||
|
import { FSService } from "@bindings/firefly-launcher/internal/fs-service"
|
||||||
import { motion } from "motion/react"
|
import { motion } from "motion/react"
|
||||||
import useHdiffzStore from "@/stores/hdiffzStore"
|
import useDiffStore from "@/stores/diffStore"
|
||||||
|
|
||||||
export default function HdiffzPage() {
|
export default function DiffPage() {
|
||||||
const { gameDir, setGameDir } = useSettingStore()
|
const { gameDir, setGameDir } = useSettingStore()
|
||||||
const {
|
const {
|
||||||
isLoading,
|
isLoading,
|
||||||
@@ -27,7 +28,7 @@ export default function HdiffzPage() {
|
|||||||
setStageType,
|
setStageType,
|
||||||
messageUpdate,
|
messageUpdate,
|
||||||
setMessageUpdate
|
setMessageUpdate
|
||||||
} = useHdiffzStore()
|
} = useDiffStore()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const getLanguage = async () => {
|
const getLanguage = async () => {
|
||||||
@@ -78,7 +79,7 @@ export default function HdiffzPage() {
|
|||||||
const handlePickDiffFile = async () => {
|
const handlePickDiffFile = async () => {
|
||||||
try {
|
try {
|
||||||
setIsLoading({game: false, diff: true})
|
setIsLoading({game: false, diff: true})
|
||||||
const basePath = await FSService.PickFile()
|
const basePath = await FSService.PickFile("")
|
||||||
if (basePath) {
|
if (basePath) {
|
||||||
if (!basePath.endsWith(".7z") && !basePath.endsWith(".zip") && !basePath.endsWith(".rar")) {
|
if (!basePath.endsWith(".7z") && !basePath.endsWith(".zip") && !basePath.endsWith(".rar")) {
|
||||||
toast.error('Not valid file type')
|
toast.error('Not valid file type')
|
||||||
@@ -86,13 +87,6 @@ export default function HdiffzPage() {
|
|||||||
setDiffDir('')
|
setDiffDir('')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const [exists, error] = await FSService.FileExistsInZip(basePath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes")
|
|
||||||
if (!exists) {
|
|
||||||
toast.error(error)
|
|
||||||
setDiffCheckResult('error')
|
|
||||||
setDiffDir('')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
setDiffDir(basePath)
|
setDiffDir(basePath)
|
||||||
setDiffCheckResult('success')
|
setDiffCheckResult('success')
|
||||||
} else {
|
} else {
|
||||||
@@ -119,7 +113,7 @@ export default function HdiffzPage() {
|
|||||||
setStageType('Check Type HDiff')
|
setStageType('Check Type HDiff')
|
||||||
setProgressUpdate(0)
|
setProgressUpdate(0)
|
||||||
setMaxProgressUpdate(1)
|
setMaxProgressUpdate(1)
|
||||||
const [isOk, validType, errorType] = await HdiffzService.CheckTypeHDiff(diffDir)
|
const [isOk, validType, errorType] = await DiffService.CheckTypeHDiff(diffDir)
|
||||||
if (!isOk) {
|
if (!isOk) {
|
||||||
toast.error(errorType)
|
toast.error(errorType)
|
||||||
setIsDiffLoading(false)
|
setIsDiffLoading(false)
|
||||||
@@ -131,7 +125,7 @@ export default function HdiffzPage() {
|
|||||||
setStageType('Version Validate')
|
setStageType('Version Validate')
|
||||||
setProgressUpdate(0)
|
setProgressUpdate(0)
|
||||||
setMaxProgressUpdate(1)
|
setMaxProgressUpdate(1)
|
||||||
const [validVersion, errorVersion] = await HdiffzService.VersionValidate(gameDir, diffDir)
|
const [validVersion, errorVersion] = await DiffService.VersionValidate(gameDir, diffDir)
|
||||||
if (!validVersion) {
|
if (!validVersion) {
|
||||||
toast.error(errorVersion)
|
toast.error(errorVersion)
|
||||||
setIsDiffLoading(false)
|
setIsDiffLoading(false)
|
||||||
@@ -140,8 +134,9 @@ export default function HdiffzPage() {
|
|||||||
setProgressUpdate(1)
|
setProgressUpdate(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isSkipVerify = validType === 'manifest' || validType === 'hdifffiles.txt'
|
||||||
setStageType('Data Extract')
|
setStageType('Data Extract')
|
||||||
const [validData, errorData] = await HdiffzService.DataExtract(gameDir, diffDir, validType === 'hdifffiles.txt')
|
const [validData, errorData] = await DiffService.DataExtract(gameDir, diffDir, isSkipVerify)
|
||||||
if (!validData) {
|
if (!validData) {
|
||||||
toast.error(errorData)
|
toast.error(errorData)
|
||||||
setIsDiffLoading(false)
|
setIsDiffLoading(false)
|
||||||
@@ -150,28 +145,38 @@ export default function HdiffzPage() {
|
|||||||
|
|
||||||
setStageType('Cut Data')
|
setStageType('Cut Data')
|
||||||
setMessageUpdate('')
|
setMessageUpdate('')
|
||||||
const [validCut, errorCut] = await HdiffzService.CutData(gameDir)
|
const [validCut, errorCut] = await DiffService.CutData(gameDir)
|
||||||
if (!validCut) {
|
if (!validCut) {
|
||||||
toast.error(errorCut)
|
toast.error(errorCut)
|
||||||
setIsDiffLoading(false)
|
setIsDiffLoading(false)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
setStageType('Patch Data')
|
if ( validType === 'hdifffiles.txt' || validType === 'hdiffmap.json') {
|
||||||
const [validPatch, errorPatch] = await HdiffzService.PatchData(gameDir)
|
setStageType('Patch Data')
|
||||||
if (!validPatch) {
|
const [validPatch, errorPatch] = await DiffService.HDiffPatchData(gameDir)
|
||||||
toast.error(errorPatch)
|
if (!validPatch) {
|
||||||
setIsDiffLoading(false)
|
toast.error(errorPatch)
|
||||||
return
|
setIsDiffLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setStageType('Delete old files')
|
||||||
|
const [validDelete, errorDelete] = await DiffService.DeleteFiles(gameDir)
|
||||||
|
if (!validDelete) {
|
||||||
|
toast.error(errorDelete)
|
||||||
|
setIsDiffLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if (validType === 'manifest') {
|
||||||
|
setStageType('Patch Data')
|
||||||
|
const [validPatch, errorPatch] = await DiffService.LDiffPatchData(gameDir)
|
||||||
|
if (!validPatch) {
|
||||||
|
toast.error(errorPatch)
|
||||||
|
setIsDiffLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setStageType('Delete old files')
|
|
||||||
const [validDelete, errorDelete] = await HdiffzService.DeleteFiles(gameDir)
|
|
||||||
if (!validDelete) {
|
|
||||||
toast.error(errorDelete)
|
|
||||||
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)
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useEffect, useState } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import { Folder, Settings, Check, X, Globe, Mic } from 'lucide-react'
|
import { Folder, Settings, Check, X, Globe, Mic } from 'lucide-react'
|
||||||
import { FSService } from '@bindings/firefly-launcher/internal'
|
import { FSService } from '@bindings/firefly-launcher/internal/fs-service'
|
||||||
import { LanguageService } from '@bindings/firefly-launcher/internal'
|
import { LanguageService } from '@bindings/firefly-launcher/internal/language-service'
|
||||||
import { toast } from 'react-toastify'
|
import { toast } from 'react-toastify'
|
||||||
import useSettingStore from '@/stores/settingStore'
|
import useSettingStore from '@/stores/settingStore'
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { Play, Menu, FolderOpen, MessageCircleQuestionMark } from 'lucide-react';
|
import { Play, Menu, FolderOpen, MessageCircleQuestionMark } from 'lucide-react';
|
||||||
import { FSService, AppService } from '@bindings/firefly-launcher/internal';
|
import { AppService } from '@bindings/firefly-launcher/internal/app-service';
|
||||||
|
import { FSService } from '@bindings/firefly-launcher/internal/fs-service';
|
||||||
import { toast } from 'react-toastify';
|
import { toast } from 'react-toastify';
|
||||||
import path from 'path-browserify'
|
import path from 'path-browserify'
|
||||||
import useSettingStore from '@/stores/settingStore';
|
import useSettingStore from '@/stores/settingStore';
|
||||||
@@ -120,7 +121,7 @@ export default function LauncherPage() {
|
|||||||
const handlePickFile = async () => {
|
const handlePickFile = async () => {
|
||||||
try {
|
try {
|
||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
const basePath = await FSService.PickFile()
|
const basePath = await FSService.PickFile("exe")
|
||||||
if (basePath.endsWith("StarRail.exe") || basePath.endsWith("launcher.exe")) {
|
if (basePath.endsWith("StarRail.exe") || basePath.endsWith("launcher.exe")) {
|
||||||
const normalized = basePath.replace(/\\/g, '/')
|
const normalized = basePath.replace(/\\/g, '/')
|
||||||
const folderPath = path.dirname(normalized)
|
const folderPath = path.dirname(normalized)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import { Route as rootRouteImport } from './routes/__root'
|
|||||||
import { Route as SrtoolsRouteImport } from './routes/srtools'
|
import { Route as SrtoolsRouteImport } from './routes/srtools'
|
||||||
import { Route as LanguageRouteImport } from './routes/language'
|
import { Route as LanguageRouteImport } from './routes/language'
|
||||||
import { Route as HowtoRouteImport } from './routes/howto'
|
import { Route as HowtoRouteImport } from './routes/howto'
|
||||||
import { Route as HdiffzRouteImport } from './routes/hdiffz'
|
import { Route as DiffRouteImport } from './routes/diff'
|
||||||
import { Route as AnalysisRouteImport } from './routes/analysis'
|
import { Route as AnalysisRouteImport } from './routes/analysis'
|
||||||
import { Route as AboutRouteImport } from './routes/about'
|
import { Route as AboutRouteImport } from './routes/about'
|
||||||
import { Route as IndexRouteImport } from './routes/index'
|
import { Route as IndexRouteImport } from './routes/index'
|
||||||
@@ -32,9 +32,9 @@ const HowtoRoute = HowtoRouteImport.update({
|
|||||||
path: '/howto',
|
path: '/howto',
|
||||||
getParentRoute: () => rootRouteImport,
|
getParentRoute: () => rootRouteImport,
|
||||||
} as any)
|
} as any)
|
||||||
const HdiffzRoute = HdiffzRouteImport.update({
|
const DiffRoute = DiffRouteImport.update({
|
||||||
id: '/hdiffz',
|
id: '/diff',
|
||||||
path: '/hdiffz',
|
path: '/diff',
|
||||||
getParentRoute: () => rootRouteImport,
|
getParentRoute: () => rootRouteImport,
|
||||||
} as any)
|
} as any)
|
||||||
const AnalysisRoute = AnalysisRouteImport.update({
|
const AnalysisRoute = AnalysisRouteImport.update({
|
||||||
@@ -57,7 +57,7 @@ export interface FileRoutesByFullPath {
|
|||||||
'/': typeof IndexRoute
|
'/': typeof IndexRoute
|
||||||
'/about': typeof AboutRoute
|
'/about': typeof AboutRoute
|
||||||
'/analysis': typeof AnalysisRoute
|
'/analysis': typeof AnalysisRoute
|
||||||
'/hdiffz': typeof HdiffzRoute
|
'/diff': typeof DiffRoute
|
||||||
'/howto': typeof HowtoRoute
|
'/howto': typeof HowtoRoute
|
||||||
'/language': typeof LanguageRoute
|
'/language': typeof LanguageRoute
|
||||||
'/srtools': typeof SrtoolsRoute
|
'/srtools': typeof SrtoolsRoute
|
||||||
@@ -66,7 +66,7 @@ export interface FileRoutesByTo {
|
|||||||
'/': typeof IndexRoute
|
'/': typeof IndexRoute
|
||||||
'/about': typeof AboutRoute
|
'/about': typeof AboutRoute
|
||||||
'/analysis': typeof AnalysisRoute
|
'/analysis': typeof AnalysisRoute
|
||||||
'/hdiffz': typeof HdiffzRoute
|
'/diff': typeof DiffRoute
|
||||||
'/howto': typeof HowtoRoute
|
'/howto': typeof HowtoRoute
|
||||||
'/language': typeof LanguageRoute
|
'/language': typeof LanguageRoute
|
||||||
'/srtools': typeof SrtoolsRoute
|
'/srtools': typeof SrtoolsRoute
|
||||||
@@ -76,7 +76,7 @@ export interface FileRoutesById {
|
|||||||
'/': typeof IndexRoute
|
'/': typeof IndexRoute
|
||||||
'/about': typeof AboutRoute
|
'/about': typeof AboutRoute
|
||||||
'/analysis': typeof AnalysisRoute
|
'/analysis': typeof AnalysisRoute
|
||||||
'/hdiffz': typeof HdiffzRoute
|
'/diff': typeof DiffRoute
|
||||||
'/howto': typeof HowtoRoute
|
'/howto': typeof HowtoRoute
|
||||||
'/language': typeof LanguageRoute
|
'/language': typeof LanguageRoute
|
||||||
'/srtools': typeof SrtoolsRoute
|
'/srtools': typeof SrtoolsRoute
|
||||||
@@ -87,7 +87,7 @@ export interface FileRouteTypes {
|
|||||||
| '/'
|
| '/'
|
||||||
| '/about'
|
| '/about'
|
||||||
| '/analysis'
|
| '/analysis'
|
||||||
| '/hdiffz'
|
| '/diff'
|
||||||
| '/howto'
|
| '/howto'
|
||||||
| '/language'
|
| '/language'
|
||||||
| '/srtools'
|
| '/srtools'
|
||||||
@@ -96,7 +96,7 @@ export interface FileRouteTypes {
|
|||||||
| '/'
|
| '/'
|
||||||
| '/about'
|
| '/about'
|
||||||
| '/analysis'
|
| '/analysis'
|
||||||
| '/hdiffz'
|
| '/diff'
|
||||||
| '/howto'
|
| '/howto'
|
||||||
| '/language'
|
| '/language'
|
||||||
| '/srtools'
|
| '/srtools'
|
||||||
@@ -105,7 +105,7 @@ export interface FileRouteTypes {
|
|||||||
| '/'
|
| '/'
|
||||||
| '/about'
|
| '/about'
|
||||||
| '/analysis'
|
| '/analysis'
|
||||||
| '/hdiffz'
|
| '/diff'
|
||||||
| '/howto'
|
| '/howto'
|
||||||
| '/language'
|
| '/language'
|
||||||
| '/srtools'
|
| '/srtools'
|
||||||
@@ -115,7 +115,7 @@ export interface RootRouteChildren {
|
|||||||
IndexRoute: typeof IndexRoute
|
IndexRoute: typeof IndexRoute
|
||||||
AboutRoute: typeof AboutRoute
|
AboutRoute: typeof AboutRoute
|
||||||
AnalysisRoute: typeof AnalysisRoute
|
AnalysisRoute: typeof AnalysisRoute
|
||||||
HdiffzRoute: typeof HdiffzRoute
|
DiffRoute: typeof DiffRoute
|
||||||
HowtoRoute: typeof HowtoRoute
|
HowtoRoute: typeof HowtoRoute
|
||||||
LanguageRoute: typeof LanguageRoute
|
LanguageRoute: typeof LanguageRoute
|
||||||
SrtoolsRoute: typeof SrtoolsRoute
|
SrtoolsRoute: typeof SrtoolsRoute
|
||||||
@@ -144,11 +144,11 @@ declare module '@tanstack/react-router' {
|
|||||||
preLoaderRoute: typeof HowtoRouteImport
|
preLoaderRoute: typeof HowtoRouteImport
|
||||||
parentRoute: typeof rootRouteImport
|
parentRoute: typeof rootRouteImport
|
||||||
}
|
}
|
||||||
'/hdiffz': {
|
'/diff': {
|
||||||
id: '/hdiffz'
|
id: '/diff'
|
||||||
path: '/hdiffz'
|
path: '/diff'
|
||||||
fullPath: '/hdiffz'
|
fullPath: '/diff'
|
||||||
preLoaderRoute: typeof HdiffzRouteImport
|
preLoaderRoute: typeof DiffRouteImport
|
||||||
parentRoute: typeof rootRouteImport
|
parentRoute: typeof rootRouteImport
|
||||||
}
|
}
|
||||||
'/analysis': {
|
'/analysis': {
|
||||||
@@ -179,7 +179,7 @@ const rootRouteChildren: RootRouteChildren = {
|
|||||||
IndexRoute: IndexRoute,
|
IndexRoute: IndexRoute,
|
||||||
AboutRoute: AboutRoute,
|
AboutRoute: AboutRoute,
|
||||||
AnalysisRoute: AnalysisRoute,
|
AnalysisRoute: AnalysisRoute,
|
||||||
HdiffzRoute: HdiffzRoute,
|
DiffRoute: DiffRoute,
|
||||||
HowtoRoute: HowtoRoute,
|
HowtoRoute: HowtoRoute,
|
||||||
LanguageRoute: LanguageRoute,
|
LanguageRoute: LanguageRoute,
|
||||||
SrtoolsRoute: SrtoolsRoute,
|
SrtoolsRoute: SrtoolsRoute,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import ThemeController from '../components/themeController'
|
|||||||
import { ToastContainer } from 'react-toastify'
|
import { ToastContainer } from 'react-toastify'
|
||||||
import { useGlobalEvents } from '@/hooks';
|
import { useGlobalEvents } from '@/hooks';
|
||||||
import useLauncherStore from '@/stores/launcherStore';
|
import useLauncherStore from '@/stores/launcherStore';
|
||||||
import useHdiffzStore from '@/stores/hdiffzStore';
|
import useDiffStore from '@/stores/diffStore';
|
||||||
|
|
||||||
export const Route = createRootRoute({
|
export const Route = createRootRoute({
|
||||||
component: RootLayout
|
component: RootLayout
|
||||||
@@ -11,7 +11,7 @@ export const Route = createRootRoute({
|
|||||||
|
|
||||||
function RootLayout() {
|
function RootLayout() {
|
||||||
const { setGameRunning, setServerRunning, setProxyRunning, setProgressDownload, setDownloadSpeed } = useLauncherStore()
|
const { setGameRunning, setServerRunning, setProxyRunning, setProgressDownload, setDownloadSpeed } = useLauncherStore()
|
||||||
const { setProgressUpdate, setMaxProgressUpdate, setMessageUpdate } = useHdiffzStore()
|
const { setProgressUpdate, setMaxProgressUpdate, setMessageUpdate, setStageType } = useDiffStore()
|
||||||
useGlobalEvents({
|
useGlobalEvents({
|
||||||
setGameRunning,
|
setGameRunning,
|
||||||
setServerRunning,
|
setServerRunning,
|
||||||
@@ -21,6 +21,7 @@ function RootLayout() {
|
|||||||
setProgressDownload,
|
setProgressDownload,
|
||||||
setDownloadSpeed,
|
setDownloadSpeed,
|
||||||
setMessageUpdate,
|
setMessageUpdate,
|
||||||
|
setStageType
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -40,7 +41,7 @@ function RootLayout() {
|
|||||||
<a>Tools</a>
|
<a>Tools</a>
|
||||||
<ul className="p-2">
|
<ul className="p-2">
|
||||||
<li><Link to="/language">Language</Link></li>
|
<li><Link to="/language">Language</Link></li>
|
||||||
<li><Link to="/hdiffz">Hdiffz</Link></li>
|
<li><Link to="/diff">Diff</Link></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@@ -77,7 +78,7 @@ function RootLayout() {
|
|||||||
<summary>Tools</summary>
|
<summary>Tools</summary>
|
||||||
<ul className="p-2">
|
<ul className="p-2">
|
||||||
<li><Link to="/language">Language</Link></li>
|
<li><Link to="/language">Language</Link></li>
|
||||||
<li><Link to="/hdiffz">Hdiffz</Link></li>
|
<li><Link to="/diff">Diff</Link></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
7
frontend/src/routes/diff.tsx
Normal file
7
frontend/src/routes/diff.tsx
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import DiffPage from '@/pages/diff'
|
||||||
|
import { createFileRoute } from '@tanstack/react-router'
|
||||||
|
|
||||||
|
export const Route = createFileRoute('/diff')({
|
||||||
|
component: DiffPage,
|
||||||
|
})
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
import HdiffzPage from '@/pages/hdiffz'
|
|
||||||
import { createFileRoute } from '@tanstack/react-router'
|
|
||||||
|
|
||||||
export const Route = createFileRoute('/hdiffz')({
|
|
||||||
component: HdiffzPage,
|
|
||||||
})
|
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
import { create } from 'zustand'
|
import { create } from 'zustand'
|
||||||
|
|
||||||
interface LauncherState {
|
interface DiffState {
|
||||||
folderCheckResult: 'success' | 'error' | null,
|
folderCheckResult: 'success' | 'error' | null,
|
||||||
isLoading: {game: boolean, diff: boolean},
|
isLoading: {game: boolean, diff: boolean},
|
||||||
diffDir: string,
|
diffDir: string,
|
||||||
@@ -22,7 +22,7 @@ interface LauncherState {
|
|||||||
setStageType: (value: string) => void,
|
setStageType: (value: string) => void,
|
||||||
}
|
}
|
||||||
|
|
||||||
const useLauncherStore = create<LauncherState>((set, get) => ({
|
const useDiffStore = create<DiffState>((set, get) => ({
|
||||||
isLoading: {game: false, diff: false},
|
isLoading: {game: false, diff: false},
|
||||||
folderCheckResult: null,
|
folderCheckResult: null,
|
||||||
diffDir: "",
|
diffDir: "",
|
||||||
@@ -43,4 +43,4 @@ const useLauncherStore = create<LauncherState>((set, get) => ({
|
|||||||
setStageType: (value: string) => set({ stageType: value }),
|
setStageType: (value: string) => set({ stageType: value }),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export default useLauncherStore;
|
export default useDiffStore;
|
||||||
69
go.mod
69
go.mod
@@ -1,57 +1,58 @@
|
|||||||
module firefly-launcher
|
module firefly-launcher
|
||||||
|
|
||||||
go 1.22.4
|
go 1.25
|
||||||
|
|
||||||
toolchain go1.24.4
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/wailsapp/wails/v3 v3.0.0-alpha.9
|
github.com/wailsapp/wails/v3 v3.0.0-alpha.26
|
||||||
golang.org/x/sys v0.28.0
|
golang.org/x/sys v0.35.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require aead.dev/minisign v0.2.0 // indirect
|
require (
|
||||||
|
aead.dev/minisign v0.3.0 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
golang.org/x/text v0.28.0 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
dario.cat/mergo v1.0.1 // indirect
|
dario.cat/mergo v1.0.2 // indirect
|
||||||
github.com/Microsoft/go-winio v0.6.1 // indirect
|
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||||
github.com/ProtonMail/go-crypto v1.0.0 // indirect
|
github.com/ProtonMail/go-crypto v1.3.0 // indirect
|
||||||
github.com/adrg/xdg v0.5.0 // indirect
|
github.com/adrg/xdg v0.5.3 // indirect
|
||||||
github.com/bep/debounce v1.2.1 // indirect
|
github.com/bep/debounce v1.2.1 // indirect
|
||||||
github.com/cloudflare/circl v1.3.8 // indirect
|
github.com/cloudflare/circl v1.6.1 // indirect
|
||||||
github.com/cyphar/filepath-securejoin v0.2.5 // indirect
|
github.com/cyphar/filepath-securejoin v0.4.1 // indirect
|
||||||
github.com/ebitengine/purego v0.4.0-alpha.4 // indirect
|
github.com/ebitengine/purego v0.8.4 // indirect
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
github.com/emirpasic/gods v1.18.1 // indirect
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||||
github.com/go-git/go-billy/v5 v5.6.0 // indirect
|
github.com/go-git/go-billy/v5 v5.6.2 // indirect
|
||||||
github.com/go-git/go-git/v5 v5.12.0 // indirect
|
github.com/go-git/go-git/v5 v5.16.2 // indirect
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||||
github.com/google/uuid v1.4.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
|
github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 // indirect
|
||||||
github.com/kevinburke/ssh_config v1.2.0 // indirect
|
github.com/kevinburke/ssh_config v1.4.0 // indirect
|
||||||
|
github.com/klauspost/compress v1.18.0
|
||||||
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
|
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
|
||||||
github.com/leaanthony/u v1.1.0 // indirect
|
github.com/leaanthony/u v1.1.1 // indirect
|
||||||
github.com/lmittmann/tint v1.0.4 // indirect
|
github.com/lmittmann/tint v1.1.2 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/minio/selfupdate v0.6.0
|
github.com/minio/selfupdate v0.6.0
|
||||||
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
github.com/pjbgf/sha1cd v0.4.0 // indirect
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
|
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/samber/lo v1.38.1 // indirect
|
github.com/samber/lo v1.51.0 // indirect
|
||||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
|
github.com/sergi/go-diff v1.4.0 // indirect
|
||||||
github.com/skeema/knownhosts v1.2.2 // indirect
|
github.com/skeema/knownhosts v1.3.1 // indirect
|
||||||
github.com/wailsapp/go-webview2 v1.0.19 // indirect
|
github.com/wailsapp/go-webview2 v1.0.21 // indirect
|
||||||
github.com/wailsapp/mimetype v1.4.1 // indirect
|
github.com/wailsapp/mimetype v1.4.1 // indirect
|
||||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||||
golang.org/x/crypto v0.25.0 // indirect
|
golang.org/x/crypto v0.41.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
|
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b
|
||||||
golang.org/x/mod v0.19.0 // indirect
|
golang.org/x/net v0.43.0 // indirect
|
||||||
golang.org/x/net v0.27.0 // indirect
|
google.golang.org/protobuf v1.36.8
|
||||||
golang.org/x/sync v0.9.0 // indirect
|
|
||||||
golang.org/x/tools v0.23.0 // indirect
|
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
190
go.sum
190
go.sum
@@ -1,61 +1,62 @@
|
|||||||
aead.dev/minisign v0.2.0 h1:kAWrq/hBRu4AARY6AlciO83xhNnW9UaC8YipS2uhLPk=
|
|
||||||
aead.dev/minisign v0.2.0/go.mod h1:zdq6LdSd9TbuSxchxwhpA9zEb9YXcVGoE8JakuiGaIQ=
|
aead.dev/minisign v0.2.0/go.mod h1:zdq6LdSd9TbuSxchxwhpA9zEb9YXcVGoE8JakuiGaIQ=
|
||||||
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
|
aead.dev/minisign v0.3.0 h1:8Xafzy5PEVZqYDNP60yJHARlW1eOQtsKNp/Ph2c0vRA=
|
||||||
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
|
aead.dev/minisign v0.3.0/go.mod h1:NLvG3Uoq3skkRMDuc3YHpWUTMTrSExqm+Ij73W13F6Y=
|
||||||
|
dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
|
||||||
|
dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
|
||||||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
||||||
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
|
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
||||||
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
|
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
||||||
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
|
github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
|
||||||
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
|
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
|
||||||
github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY=
|
github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78=
|
||||||
github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4=
|
github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
|
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
|
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
|
||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||||
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
|
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
|
||||||
github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
|
github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
|
||||||
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
||||||
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
|
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||||
github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI=
|
github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s=
|
||||||
github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
|
github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
|
||||||
github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo=
|
|
||||||
github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5770OhYUVes=
|
github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw=
|
||||||
github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
|
github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
||||||
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
|
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
|
||||||
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
|
github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
|
||||||
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
||||||
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
||||||
github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE=
|
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
|
||||||
github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
|
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
|
||||||
github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8=
|
github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM=
|
||||||
github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM=
|
github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
|
||||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
|
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
|
||||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
|
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
|
||||||
github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys=
|
github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM=
|
||||||
github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY=
|
github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
|
||||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||||
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck=
|
github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 h1:njuLRcjAuMKr7kI3D85AXWkw6/+v9PwtV6M6o11sWHQ=
|
||||||
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
|
github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
|
||||||
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
|
github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ=
|
||||||
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M=
|
||||||
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
@@ -65,25 +66,25 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
|||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A=
|
github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A=
|
||||||
github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU=
|
github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU=
|
||||||
github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI=
|
github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M=
|
||||||
github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
|
github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
|
||||||
github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc=
|
github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w=
|
||||||
github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
|
github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
|
||||||
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
|
|
||||||
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
|
||||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||||
|
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/minio/selfupdate v0.6.0 h1:i76PgT0K5xO9+hjzKcacQtO7+MjJ4JKA8Ak8XQ9DDwU=
|
github.com/minio/selfupdate v0.6.0 h1:i76PgT0K5xO9+hjzKcacQtO7+MjJ4JKA8Ak8XQ9DDwU=
|
||||||
github.com/minio/selfupdate v0.6.0/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM=
|
github.com/minio/selfupdate v0.6.0/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM=
|
||||||
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
|
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
|
||||||
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
|
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
|
||||||
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
github.com/pjbgf/sha1cd v0.4.0 h1:NXzbL1RvjTUi6kgYZCX3fPwwl27Q1LJndxtUDVfJGRY=
|
||||||
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
|
github.com/pjbgf/sha1cd v0.4.0/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A=
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
|
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
@@ -91,60 +92,41 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
|||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
|
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||||
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
|
github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI=
|
||||||
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
|
github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
|
||||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
|
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
|
||||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
|
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
|
||||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
|
github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8=
|
||||||
github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
|
github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/wailsapp/go-webview2 v1.0.19 h1:7U3QcDj1PrBPaxJNCui2k1SkWml+Q5kvFUFyTImA6NU=
|
github.com/wailsapp/go-webview2 v1.0.21 h1:k3dtoZU4KCoN/AEIbWiPln3P2661GtA2oEgA2Pb+maA=
|
||||||
github.com/wailsapp/go-webview2 v1.0.19/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc=
|
github.com/wailsapp/go-webview2 v1.0.21/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc=
|
||||||
github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
|
github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
|
||||||
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
|
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
|
||||||
github.com/wailsapp/wails/v3 v3.0.0-alpha.9 h1:b8CfRrhPno8Fra0xFp4Ifyj+ogmXBc35rsQWvcrHtsI=
|
github.com/wailsapp/wails/v3 v3.0.0-alpha.26 h1:co3eifrIcG/J7sQ1oMPmLfvtAE4bezdhOtabI4Ua5fg=
|
||||||
github.com/wailsapp/wails/v3 v3.0.0-alpha.9/go.mod h1:dSv6s722nSWaUyUiapAM1DHc5HKggNGY1a79shO85/g=
|
github.com/wailsapp/wails/v3 v3.0.0-alpha.26/go.mod h1:UZpnhYuju4saspCJrIHAvC0H5XjtKnqd26FRxJLrQ0M=
|
||||||
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
|
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
|
||||||
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
|
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
|
||||||
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
|
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
|
||||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
|
||||||
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
|
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0=
|
||||||
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
|
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
|
||||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
|
|
||||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
|
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
|
||||||
golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
|
|
||||||
golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
|
||||||
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
|
||||||
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
|
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
|
||||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
|
||||||
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
|
|
||||||
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
|
||||||
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -153,42 +135,22 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
|
||||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
|
||||||
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
|
||||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
|
||||||
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
|
|
||||||
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
|
||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|
||||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
|
||||||
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
|
|
||||||
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
|
||||||
golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
|
|
||||||
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
|
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package internal
|
package appService
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"firefly-launcher/pkg/constant"
|
"firefly-launcher/pkg/constant"
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
package internal
|
package diffService
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"firefly-launcher/pkg/constant"
|
"firefly-launcher/pkg/constant"
|
||||||
|
"firefly-launcher/pkg/hpatchz"
|
||||||
"firefly-launcher/pkg/models"
|
"firefly-launcher/pkg/models"
|
||||||
"firefly-launcher/pkg/sevenzip"
|
"firefly-launcher/pkg/sevenzip"
|
||||||
"firefly-launcher/pkg/verifier"
|
|
||||||
"firefly-launcher/pkg/hpatchz"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -17,21 +15,23 @@ import (
|
|||||||
"github.com/wailsapp/wails/v3/pkg/application"
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HdiffzService struct{}
|
type DiffService struct{}
|
||||||
|
|
||||||
func (h *HdiffzService) CheckTypeHDiff(patchPath string) (bool, string, string) {
|
func (h *DiffService) CheckTypeHDiff(patchPath string) (bool, string, string) {
|
||||||
isFileInTxt, _ := sevenzip.IsFileIn7z(patchPath, "hdifffiles.txt")
|
if ok, err := sevenzip.IsFileIn7z(patchPath, "hdifffiles.txt"); err == nil && ok {
|
||||||
if isFileInTxt {
|
|
||||||
return true, "hdifffiles.txt", ""
|
return true, "hdifffiles.txt", ""
|
||||||
}
|
}
|
||||||
isFileInJson, _ := sevenzip.IsFileIn7z(patchPath, "hdiffmap.json")
|
if ok, err := sevenzip.IsFileIn7z(patchPath, "hdiffmap.json"); err == nil && ok {
|
||||||
if isFileInJson {
|
|
||||||
return true, "hdiffmap.json", ""
|
return true, "hdiffmap.json", ""
|
||||||
}
|
}
|
||||||
|
if ok, err := sevenzip.IsFileIn7z(patchPath, "manifest"); err == nil && ok {
|
||||||
|
return true, "manifest", ""
|
||||||
|
}
|
||||||
|
|
||||||
return false, "", "not found hdifffiles.txt or hdiffmap.json"
|
return false, "", "not found hdifffiles.txt or hdiffmap.json"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HdiffzService) VersionValidate(gamePath, patchPath string) (bool, string) {
|
func (h *DiffService) VersionValidate(gamePath, patchPath string) (bool, string) {
|
||||||
oldVersionData, err := models.ParseBinaryVersion(filepath.Join(gamePath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes"))
|
oldVersionData, err := models.ParseBinaryVersion(filepath.Join(gamePath, "StarRail_Data\\StreamingAssets\\BinaryVersion.bytes"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err.Error()
|
return false, err.Error()
|
||||||
@@ -65,95 +65,7 @@ func (h *HdiffzService) VersionValidate(gamePath, patchPath string) (bool, strin
|
|||||||
return true, "validated"
|
return true, "validated"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HdiffzService) DataExtract(gamePath, patchPath string, isSkipVerify bool) (bool, string) {
|
func (h *DiffService) HDiffPatchData(gamePath string) (bool, string) {
|
||||||
if _, err := os.Stat(gamePath); err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := os.Stat(patchPath); err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := os.Stat(constant.TempUrl); os.IsNotExist(err) {
|
|
||||||
if err := os.MkdirAll(constant.TempUrl, os.ModePerm); err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := sevenzip.ExtractAllFilesFromZip(patchPath, constant.TempUrl); err != nil {
|
|
||||||
os.RemoveAll(constant.TempUrl)
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if !isSkipVerify {
|
|
||||||
validator, err := verifier.NewVerifier(gamePath, constant.TempUrl)
|
|
||||||
if err != nil {
|
|
||||||
os.RemoveAll(constant.TempUrl)
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := validator.VerifyAll(); err != nil {
|
|
||||||
os.RemoveAll(constant.TempUrl)
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, "validated"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *HdiffzService) CutData(gamePath string) (bool, string) {
|
|
||||||
if _, err := os.Stat(constant.TempUrl); os.IsNotExist(err) {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
err := filepath.Walk(constant.TempUrl, func(path string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
relPath, err := filepath.Rel(constant.TempUrl, path)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
destPath := filepath.Join(gamePath, relPath)
|
|
||||||
application.Get().EmitEvent("hdiffz:message", map[string]string{"message": destPath})
|
|
||||||
if info.IsDir() {
|
|
||||||
return os.MkdirAll(destPath, os.ModePerm)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.MkdirAll(filepath.Dir(destPath), os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.Rename(path, destPath); err != nil {
|
|
||||||
srcFile, err := os.Open(path)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer srcFile.Close()
|
|
||||||
|
|
||||||
dstFile, err := os.Create(destPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer dstFile.Close()
|
|
||||||
|
|
||||||
if _, err := io.Copy(dstFile, srcFile); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_ = os.Remove(path)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, "cut completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *HdiffzService) PatchData(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")
|
||||||
|
|
||||||
@@ -187,10 +99,10 @@ func (h *HdiffzService) PatchData(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"})
|
||||||
for i, entry := range jsonData.DiffMap {
|
for i, entry := range jsonData.DiffMap {
|
||||||
application.Get().EmitEvent(
|
application.Get().Event.Emit(
|
||||||
"hdiffz:progress", map[string]int{
|
"diff:progress", map[string]int{
|
||||||
"progress": i,
|
"progress": i,
|
||||||
"maxProgress": len(jsonData.DiffMap),
|
"maxProgress": len(jsonData.DiffMap),
|
||||||
})
|
})
|
||||||
@@ -199,20 +111,13 @@ func (h *HdiffzService) PatchData(gamePath string) (bool, string) {
|
|||||||
patchFile := filepath.Join(gamePath, entry.PatchFileName)
|
patchFile := filepath.Join(gamePath, entry.PatchFileName)
|
||||||
targetFile := filepath.Join(gamePath, entry.TargetFileName)
|
targetFile := filepath.Join(gamePath, entry.TargetFileName)
|
||||||
|
|
||||||
// Check patch file tồn tại chưa
|
|
||||||
if _, err := os.Stat(patchFile); os.IsNotExist(err) {
|
if _, err := os.Stat(patchFile); os.IsNotExist(err) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nếu không có source file hoặc SourceFileName rỗng → apply_patch_empty
|
|
||||||
if entry.SourceFileName == "" {
|
if entry.SourceFileName == "" {
|
||||||
err := hpatchz.ApplyPatchEmpty(patchFile, targetFile)
|
hpatchz.ApplyPatchEmpty(patchFile, targetFile)
|
||||||
if err != nil {
|
os.Remove(patchFile)
|
||||||
fmt.Printf("%s failed to patch! %v\n", entry.TargetFileName, err)
|
|
||||||
_ = os.Remove(patchFile)
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
_ = os.Remove(patchFile)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,18 +125,11 @@ func (h *HdiffzService) PatchData(gamePath string) (bool, string) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Có source file → apply_patch
|
hpatchz.ApplyPatch(sourceFile, patchFile, targetFile)
|
||||||
err := hpatchz.ApplyPatch(sourceFile, patchFile, targetFile)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("%s failed to patch! %v\n", entry.TargetFileName, err)
|
|
||||||
_ = os.Remove(patchFile)
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if entry.SourceFileName != entry.TargetFileName {
|
if entry.SourceFileName != entry.TargetFileName {
|
||||||
_ = os.Remove(sourceFile)
|
os.Remove(sourceFile)
|
||||||
}
|
}
|
||||||
_ = os.Remove(patchFile)
|
os.Remove(patchFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
os.Remove(filepath.Join(gamePath, "hdiffmap.json"))
|
os.Remove(filepath.Join(gamePath, "hdiffmap.json"))
|
||||||
@@ -239,7 +137,7 @@ func (h *HdiffzService) PatchData(gamePath string) (bool, string) {
|
|||||||
return true, "patching completed"
|
return true, "patching completed"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HdiffzService) DeleteFiles(gamePath string) (bool, string) {
|
func (h *DiffService) DeleteFiles(gamePath string) (bool, string) {
|
||||||
var deleteFiles []string
|
var deleteFiles []string
|
||||||
|
|
||||||
file, err := os.Open(filepath.Join(gamePath, "deletefiles.txt"))
|
file, err := os.Open(filepath.Join(gamePath, "deletefiles.txt"))
|
||||||
@@ -257,14 +155,16 @@ func (h *HdiffzService) DeleteFiles(gamePath string) (bool, string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
|
file.Close()
|
||||||
return false, "no delete files exist"
|
return false, "no delete files exist"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file.Close()
|
||||||
|
|
||||||
for i, file := range deleteFiles {
|
for i, file := range deleteFiles {
|
||||||
os.Remove(filepath.Join(gamePath, file))
|
os.Remove(filepath.Join(gamePath, file))
|
||||||
application.Get().EmitEvent("hdiffz:progress", map[string]int{"progress": i, "maxProgress": len(deleteFiles)})
|
application.Get().Event.Emit("diff:progress", map[string]int{"progress": i, "maxProgress": len(deleteFiles)})
|
||||||
}
|
}
|
||||||
_ = os.Remove(filepath.Join(gamePath, "deletefiles.txt"))
|
os.Remove(filepath.Join(gamePath, "deletefiles.txt"))
|
||||||
return true, ""
|
return true, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
172
internal/diff-service/ldifff.go
Normal file
172
internal/diff-service/ldifff.go
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
package diffService
|
||||||
|
|
||||||
|
import (
|
||||||
|
"firefly-launcher/pkg/firefly"
|
||||||
|
"firefly-launcher/pkg/firefly/pb"
|
||||||
|
"firefly-launcher/pkg/hpatchz"
|
||||||
|
"firefly-launcher/pkg/models"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (h *DiffService) LDiffPatchData(gamePath string) (bool, string) {
|
||||||
|
entries, err := os.ReadDir(gamePath)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
ldiffPath := filepath.Join(gamePath, "ldiff")
|
||||||
|
|
||||||
|
for _, entry := range entries {
|
||||||
|
if entry.IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !entry.Type().IsRegular() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
name := entry.Name()
|
||||||
|
if strings.HasPrefix(name, "manifest") {
|
||||||
|
manifestName := entry.Name()
|
||||||
|
manifestPath := filepath.Join(gamePath, manifestName)
|
||||||
|
|
||||||
|
manifest, err := firefly.LoadManifestProto(manifestPath)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ldiffEntries, err := os.ReadDir(ldiffPath)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
application.Get().Event.Emit("diff:stage", map[string]string{"stage": "Processing LDiff"})
|
||||||
|
for i, ldiffEntry := range ldiffEntries {
|
||||||
|
assetName := ldiffEntry.Name()
|
||||||
|
var matchingAssets []struct {
|
||||||
|
AssetName string
|
||||||
|
AssetSize int64
|
||||||
|
Asset *pb.AssetManifest
|
||||||
|
}
|
||||||
|
|
||||||
|
application.Get().Event.Emit(
|
||||||
|
"diff:progress", map[string]int{
|
||||||
|
"progress": i,
|
||||||
|
"maxProgress": len(ldiffEntries),
|
||||||
|
})
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
var mu sync.Mutex
|
||||||
|
|
||||||
|
for _, assetGroup := range manifest.Assets {
|
||||||
|
assetGroup := assetGroup
|
||||||
|
wg.Go(func() {
|
||||||
|
if data := assetGroup.AssetData; data != nil {
|
||||||
|
for _, asset := range data.Assets {
|
||||||
|
if asset.ChunkFileName == assetName {
|
||||||
|
mu.Lock()
|
||||||
|
matchingAssets = append(matchingAssets, struct {
|
||||||
|
AssetName string
|
||||||
|
AssetSize int64
|
||||||
|
Asset *pb.AssetManifest
|
||||||
|
}{assetGroup.AssetName, assetGroup.AssetSize, asset})
|
||||||
|
mu.Unlock()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
for _, ma := range matchingAssets {
|
||||||
|
err := firefly.LDiffFile(ma.Asset, ma.AssetName, ma.AssetSize, ldiffPath, gamePath)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diffMapNames := make([]string, len(ldiffEntries))
|
||||||
|
for i, e := range ldiffEntries {
|
||||||
|
diffMapNames[i] = e.Name()
|
||||||
|
}
|
||||||
|
|
||||||
|
diffMapList, err := MakeDiffMap(manifest, diffMapNames)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
application.Get().Event.Emit("diff:stage", map[string]string{"stage": "Patching HDiff"})
|
||||||
|
for i, entry := range diffMapList {
|
||||||
|
application.Get().Event.Emit(
|
||||||
|
"diff:progress", map[string]int{
|
||||||
|
"progress": i,
|
||||||
|
"maxProgress": len(diffMapList),
|
||||||
|
})
|
||||||
|
sourceFile := filepath.Join(gamePath, entry.SourceFileName)
|
||||||
|
patchFile := filepath.Join(gamePath, entry.PatchFileName)
|
||||||
|
targetFile := filepath.Join(gamePath, entry.TargetFileName)
|
||||||
|
|
||||||
|
if _, err := os.Stat(patchFile); os.IsNotExist(err) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if entry.SourceFileName == "" {
|
||||||
|
hpatchz.ApplyPatchEmpty(patchFile, targetFile)
|
||||||
|
os.Remove(patchFile)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := os.Stat(sourceFile); os.IsNotExist(err) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
hpatchz.ApplyPatch(sourceFile, patchFile, targetFile)
|
||||||
|
if entry.SourceFileName != entry.TargetFileName {
|
||||||
|
os.Remove(sourceFile)
|
||||||
|
}
|
||||||
|
os.Remove(patchFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
os.RemoveAll(ldiffPath)
|
||||||
|
return true, "patching completed"
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeDiffMap(manifest *pb.ManifestProto, chunkNames []string) ([]*models.HDiffData, error) {
|
||||||
|
var hdiffFiles []*models.HDiffData
|
||||||
|
|
||||||
|
for _, asset := range manifest.Assets {
|
||||||
|
assetName := asset.AssetName
|
||||||
|
assetSize := asset.AssetSize
|
||||||
|
|
||||||
|
if asset.AssetData != nil {
|
||||||
|
for _, chunk := range asset.AssetData.Assets {
|
||||||
|
matched := false
|
||||||
|
for _, name := range chunkNames {
|
||||||
|
if name == chunk.ChunkFileName {
|
||||||
|
matched = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !matched {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if chunk.OriginalFileSize != 0 || chunk.HdiffFileSize != assetSize {
|
||||||
|
hdiffFiles = append(hdiffFiles, &models.HDiffData{
|
||||||
|
SourceFileName: chunk.OriginalFilePath,
|
||||||
|
TargetFileName: assetName,
|
||||||
|
PatchFileName: fmt.Sprintf("%s.hdiff", assetName),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hdiffFiles, nil
|
||||||
|
}
|
||||||
100
internal/diff-service/utils.go
Normal file
100
internal/diff-service/utils.go
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
package diffService
|
||||||
|
|
||||||
|
import (
|
||||||
|
"firefly-launcher/pkg/constant"
|
||||||
|
"firefly-launcher/pkg/verifier"
|
||||||
|
"firefly-launcher/pkg/sevenzip"
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (h *DiffService) DataExtract(gamePath, patchPath string, isSkipVerify bool) (bool, string) {
|
||||||
|
os.RemoveAll(constant.TempUrl)
|
||||||
|
if _, err := os.Stat(gamePath); err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := os.Stat(patchPath); err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := os.Stat(constant.TempUrl); os.IsNotExist(err) {
|
||||||
|
if err := os.MkdirAll(constant.TempUrl, os.ModePerm); err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sevenzip.ExtractAllFilesFromZip(patchPath, constant.TempUrl); err != nil {
|
||||||
|
os.RemoveAll(constant.TempUrl)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if !isSkipVerify {
|
||||||
|
validator, err := verifier.NewVerifier(gamePath, constant.TempUrl)
|
||||||
|
if err != nil {
|
||||||
|
os.RemoveAll(constant.TempUrl)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := validator.VerifyAll(); err != nil {
|
||||||
|
os.RemoveAll(constant.TempUrl)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, "validated"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *DiffService) CutData(gamePath string) (bool, string) {
|
||||||
|
if _, err := os.Stat(constant.TempUrl); os.IsNotExist(err) {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
err := filepath.Walk(constant.TempUrl, func(path string, info os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
relPath, err := filepath.Rel(constant.TempUrl, path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
destPath := filepath.Join(gamePath, relPath)
|
||||||
|
application.Get().Event.Emit("diff:message", map[string]string{"message": destPath})
|
||||||
|
if info.IsDir() {
|
||||||
|
return os.MkdirAll(destPath, os.ModePerm)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.MkdirAll(filepath.Dir(destPath), os.ModePerm); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Rename(path, destPath); err != nil {
|
||||||
|
srcFile, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer srcFile.Close()
|
||||||
|
|
||||||
|
dstFile, err := os.Create(destPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer dstFile.Close()
|
||||||
|
|
||||||
|
if _, err := io.Copy(dstFile, srcFile); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
os.Remove(path)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
os.RemoveAll(constant.TempUrl)
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
os.RemoveAll(constant.TempUrl)
|
||||||
|
return true, "cut completed"
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package internal
|
package fsService
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"firefly-launcher/pkg/sevenzip"
|
"firefly-launcher/pkg/sevenzip"
|
||||||
@@ -30,7 +30,7 @@ func (f *FSService) PickFolder() (string, error) {
|
|||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FSService) PickFile() (string, error) {
|
func (f *FSService) PickFile(filter string) (string, error) {
|
||||||
dialog := application.OpenFileDialog().
|
dialog := application.OpenFileDialog().
|
||||||
CanChooseFiles(true).
|
CanChooseFiles(true).
|
||||||
ResolvesAliases(true)
|
ResolvesAliases(true)
|
||||||
@@ -39,6 +39,9 @@ func (f *FSService) PickFile() (string, error) {
|
|||||||
} else {
|
} else {
|
||||||
dialog.SetTitle("Select a file/directory")
|
dialog.SetTitle("Select a file/directory")
|
||||||
}
|
}
|
||||||
|
if filter == "exe" {
|
||||||
|
dialog.AddFilter("Executable Files (*.exe)", "*.exe")
|
||||||
|
}
|
||||||
if path, err := dialog.PromptForSingleSelection(); err == nil {
|
if path, err := dialog.PromptForSingleSelection(); err == nil {
|
||||||
return path, nil
|
return path, nil
|
||||||
}
|
}
|
||||||
@@ -69,7 +72,7 @@ func (f *FSService) StartApp(path string) (bool, error) {
|
|||||||
if strings.HasSuffix(path, "StarRail.exe") {
|
if strings.HasSuffix(path, "StarRail.exe") {
|
||||||
go func() {
|
go func() {
|
||||||
_ = cmd.Wait()
|
_ = cmd.Wait()
|
||||||
application.Get().EmitEvent("game:exit")
|
application.Get().Event.Emit("game:exit")
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,11 +109,11 @@ func (f *FSService) StartWithConsole(path string) (bool, error) {
|
|||||||
go func() {
|
go func() {
|
||||||
_ = cmd.Wait()
|
_ = cmd.Wait()
|
||||||
if strings.HasSuffix(path, "launcher.exe") {
|
if strings.HasSuffix(path, "launcher.exe") {
|
||||||
application.Get().EmitEvent("game:exit")
|
application.Get().Event.Emit("game:exit")
|
||||||
} else if strings.HasSuffix(path, "firefly-go_win.exe") {
|
} else if strings.HasSuffix(path, "firefly-go_win.exe") {
|
||||||
application.Get().EmitEvent("server:exit")
|
application.Get().Event.Emit("server:exit")
|
||||||
} else if strings.HasSuffix(path, "FireflyProxy.exe") {
|
} else if strings.HasSuffix(path, "FireflyProxy.exe") {
|
||||||
application.Get().EmitEvent("proxy:exit")
|
application.Get().Event.Emit("proxy:exit")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return true, nil
|
return true, nil
|
||||||
@@ -127,7 +130,7 @@ func (f *FSService) OpenFolder(path string) (bool, string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
url := "file:///" + filepath.ToSlash(absPath)
|
url := "file:///" + filepath.ToSlash(absPath)
|
||||||
application.Get().BrowserOpenURL(url)
|
application.Get().Browser.OpenURL(url)
|
||||||
|
|
||||||
return true, ""
|
return true, ""
|
||||||
}
|
}
|
||||||
@@ -1,282 +0,0 @@
|
|||||||
package internal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"firefly-launcher/pkg/constant"
|
|
||||||
"firefly-launcher/pkg/models"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/minio/selfupdate"
|
|
||||||
"github.com/wailsapp/wails/v3/pkg/application"
|
|
||||||
)
|
|
||||||
|
|
||||||
type GitService struct{}
|
|
||||||
|
|
||||||
func (g *GitService) GetLatestServerVersion() (bool, string, string) {
|
|
||||||
resp, err := http.Get(constant.ServerGitUrl)
|
|
||||||
if err != nil {
|
|
||||||
return false, "", err.Error()
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, _ := io.ReadAll(resp.Body)
|
|
||||||
|
|
||||||
var releases []models.ReleaseType
|
|
||||||
err = json.Unmarshal(body, &releases)
|
|
||||||
if err != nil {
|
|
||||||
return false, "", err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(releases) == 0 {
|
|
||||||
return false, "", "no releases found"
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, releases[0].TagName, ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *GitService) DownloadServerProgress(version string) (bool, string) {
|
|
||||||
resp, err := http.Get(constant.ServerGitUrl)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, _ := io.ReadAll(resp.Body)
|
|
||||||
|
|
||||||
var releases []*models.ReleaseType
|
|
||||||
err = json.Unmarshal(body, &releases)
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(releases) == 0 {
|
|
||||||
return false, "no releases found"
|
|
||||||
}
|
|
||||||
|
|
||||||
var releaseData *models.ReleaseType
|
|
||||||
for _, release := range releases {
|
|
||||||
if release.TagName == version {
|
|
||||||
releaseData = release
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if releaseData == nil || releaseData.TagName == "" {
|
|
||||||
return false, "no release found"
|
|
||||||
}
|
|
||||||
|
|
||||||
var assetWin models.AssetType
|
|
||||||
for _, asset := range releaseData.Assets {
|
|
||||||
if asset.Name == constant.ServerZipFile {
|
|
||||||
assetWin = asset
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if assetWin.Name == "" {
|
|
||||||
return false, "no assets found"
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.Mkdir(constant.ServerStorageUrl, 0755); err != nil {
|
|
||||||
if !os.IsExist(err) {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
saveFile := filepath.Join(constant.ServerStorageUrl, assetWin.Name)
|
|
||||||
|
|
||||||
resp, err = http.Get(assetWin.BrowserDownloadURL)
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
DownloadFile(saveFile, assetWin.BrowserDownloadURL, func(percent float64, speed float64) {
|
|
||||||
application.Get().EmitEvent("download:server", map[string]interface{}{
|
|
||||||
"percent": fmt.Sprintf("%.2f", percent),
|
|
||||||
"speed": fmt.Sprintf("%.2f", speed),
|
|
||||||
})
|
|
||||||
})
|
|
||||||
return true, ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *GitService) UnzipServer() {
|
|
||||||
unzipParallel(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile), constant.ServerStorageUrl)
|
|
||||||
os.Remove(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *GitService) GetLatestProxyVersion() (bool, string, string) {
|
|
||||||
resp, err := http.Get(constant.ProxyGitUrl)
|
|
||||||
if err != nil {
|
|
||||||
return false, "", err.Error()
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, _ := io.ReadAll(resp.Body)
|
|
||||||
|
|
||||||
var releases []models.ReleaseType
|
|
||||||
err = json.Unmarshal(body, &releases)
|
|
||||||
if err != nil {
|
|
||||||
return false, "", err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(releases) == 0 {
|
|
||||||
return false, "", "no releases found"
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, releases[0].TagName, ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *GitService) DownloadProxyProgress(version string) (bool, string) {
|
|
||||||
resp, err := http.Get(constant.ProxyGitUrl)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, _ := io.ReadAll(resp.Body)
|
|
||||||
|
|
||||||
var releases []*models.ReleaseType
|
|
||||||
err = json.Unmarshal(body, &releases)
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(releases) == 0 {
|
|
||||||
return false, "no releases found"
|
|
||||||
}
|
|
||||||
|
|
||||||
var releaseData *models.ReleaseType
|
|
||||||
for _, release := range releases {
|
|
||||||
if release.TagName == version {
|
|
||||||
releaseData = release
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if releaseData == nil || releaseData.TagName == "" {
|
|
||||||
return false, "no release found"
|
|
||||||
}
|
|
||||||
|
|
||||||
var assetWin models.AssetType
|
|
||||||
for _, asset := range releaseData.Assets {
|
|
||||||
if asset.Name == constant.ProxyZipFile {
|
|
||||||
assetWin = asset
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if assetWin.Name == "" {
|
|
||||||
return false, "no assets found"
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.Mkdir(constant.ProxyStorageUrl, 0755); err != nil {
|
|
||||||
if !os.IsExist(err) {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
saveFile := filepath.Join(constant.ProxyStorageUrl, assetWin.Name)
|
|
||||||
|
|
||||||
resp, err = http.Get(assetWin.BrowserDownloadURL)
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
DownloadFile(saveFile, assetWin.BrowserDownloadURL, func(percent float64, speed float64) {
|
|
||||||
application.Get().EmitEvent("download:proxy", map[string]interface{}{
|
|
||||||
"percent": fmt.Sprintf("%.2f", percent),
|
|
||||||
"speed": fmt.Sprintf("%.2f", speed),
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
return true, ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *GitService) UnzipProxy() {
|
|
||||||
unzipParallel(filepath.Join(constant.ProxyStorageUrl, constant.ProxyZipFile), constant.ProxyStorageUrl)
|
|
||||||
os.Remove(filepath.Join(constant.ProxyStorageUrl, constant.ProxyZipFile))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g *GitService) GetLatestLauncherVersion() (bool, string, string) {
|
|
||||||
resp, err := http.Get(constant.LauncherGitUrl)
|
|
||||||
if err != nil {
|
|
||||||
return false, "", err.Error()
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, _ := io.ReadAll(resp.Body)
|
|
||||||
|
|
||||||
var releases []models.ReleaseType
|
|
||||||
err = json.Unmarshal(body, &releases)
|
|
||||||
if err != nil {
|
|
||||||
return false, "", err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(releases) == 0 {
|
|
||||||
return false, "", "no releases found"
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, releases[0].TagName, ""
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func (g *GitService) UpdateLauncherProgress(version string) (bool, string) {
|
|
||||||
resp, err := http.Get(constant.LauncherGitUrl)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, _ := io.ReadAll(resp.Body)
|
|
||||||
|
|
||||||
var releases []*models.ReleaseType
|
|
||||||
err = json.Unmarshal(body, &releases)
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(releases) == 0 {
|
|
||||||
return false, "no releases found"
|
|
||||||
}
|
|
||||||
|
|
||||||
var releaseData *models.ReleaseType
|
|
||||||
for _, release := range releases {
|
|
||||||
if release.TagName == version {
|
|
||||||
releaseData = release
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if releaseData == nil || releaseData.TagName == "" {
|
|
||||||
return false, "no release found"
|
|
||||||
}
|
|
||||||
|
|
||||||
var assetWin models.AssetType
|
|
||||||
for _, asset := range releaseData.Assets {
|
|
||||||
if asset.Name == constant.LauncherFile {
|
|
||||||
assetWin = asset
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if assetWin.Name == "" {
|
|
||||||
return false, "no assets found"
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err = http.Get(assetWin.BrowserDownloadURL)
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
err = selfupdate.Apply(resp.Body, selfupdate.Options{})
|
|
||||||
if err != nil {
|
|
||||||
return false, err.Error()
|
|
||||||
}
|
|
||||||
return true, ""
|
|
||||||
}
|
|
||||||
93
internal/git-service/launcher.go
Normal file
93
internal/git-service/launcher.go
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
package gitService
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"firefly-launcher/pkg/constant"
|
||||||
|
"firefly-launcher/pkg/models"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"github.com/minio/selfupdate"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
type GitService struct{}
|
||||||
|
|
||||||
|
|
||||||
|
func (g *GitService) GetLatestLauncherVersion() (bool, string, string) {
|
||||||
|
resp, err := http.Get(constant.LauncherGitUrl)
|
||||||
|
if err != nil {
|
||||||
|
return false, "", err.Error()
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var releases []models.ReleaseType
|
||||||
|
err = json.Unmarshal(body, &releases)
|
||||||
|
if err != nil {
|
||||||
|
return false, "", err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
return false, "", "no releases found"
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, releases[0].TagName, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (g *GitService) UpdateLauncherProgress(version string) (bool, string) {
|
||||||
|
resp, err := http.Get(constant.LauncherGitUrl)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var releases []*models.ReleaseType
|
||||||
|
err = json.Unmarshal(body, &releases)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
return false, "no releases found"
|
||||||
|
}
|
||||||
|
|
||||||
|
var releaseData *models.ReleaseType
|
||||||
|
for _, release := range releases {
|
||||||
|
if release.TagName == version {
|
||||||
|
releaseData = release
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if releaseData == nil || releaseData.TagName == "" {
|
||||||
|
return false, "no release found"
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetWin models.AssetType
|
||||||
|
for _, asset := range releaseData.Assets {
|
||||||
|
if asset.Name == constant.LauncherFile {
|
||||||
|
assetWin = asset
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if assetWin.Name == "" {
|
||||||
|
return false, "no assets found"
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err = http.Get(assetWin.BrowserDownloadURL)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
err = selfupdate.Apply(resp.Body, selfupdate.Options{})
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
return true, ""
|
||||||
|
}
|
||||||
106
internal/git-service/proxy.go
Normal file
106
internal/git-service/proxy.go
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
package gitService
|
||||||
|
|
||||||
|
import (
|
||||||
|
"firefly-launcher/pkg/constant"
|
||||||
|
"firefly-launcher/pkg/models"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (g *GitService) GetLatestProxyVersion() (bool, string, string) {
|
||||||
|
resp, err := http.Get(constant.ProxyGitUrl)
|
||||||
|
if err != nil {
|
||||||
|
return false, "", err.Error()
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var releases []models.ReleaseType
|
||||||
|
err = json.Unmarshal(body, &releases)
|
||||||
|
if err != nil {
|
||||||
|
return false, "", err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
return false, "", "no releases found"
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, releases[0].TagName, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GitService) DownloadProxyProgress(version string) (bool, string) {
|
||||||
|
resp, err := http.Get(constant.ProxyGitUrl)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var releases []*models.ReleaseType
|
||||||
|
err = json.Unmarshal(body, &releases)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
return false, "no releases found"
|
||||||
|
}
|
||||||
|
|
||||||
|
var releaseData *models.ReleaseType
|
||||||
|
for _, release := range releases {
|
||||||
|
if release.TagName == version {
|
||||||
|
releaseData = release
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if releaseData == nil || releaseData.TagName == "" {
|
||||||
|
return false, "no release found"
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetWin models.AssetType
|
||||||
|
for _, asset := range releaseData.Assets {
|
||||||
|
if asset.Name == constant.ProxyZipFile {
|
||||||
|
assetWin = asset
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if assetWin.Name == "" {
|
||||||
|
return false, "no assets found"
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Mkdir(constant.ProxyStorageUrl, 0755); err != nil {
|
||||||
|
if !os.IsExist(err) {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
saveFile := filepath.Join(constant.ProxyStorageUrl, assetWin.Name)
|
||||||
|
|
||||||
|
resp, err = http.Get(assetWin.BrowserDownloadURL)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
DownloadFile(saveFile, assetWin.BrowserDownloadURL, func(percent float64, speed float64) {
|
||||||
|
application.Get().Event.Emit("download:proxy", map[string]interface{}{
|
||||||
|
"percent": fmt.Sprintf("%.2f", percent),
|
||||||
|
"speed": fmt.Sprintf("%.2f", speed),
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
return true, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GitService) UnzipProxy() {
|
||||||
|
unzipParallel(filepath.Join(constant.ProxyStorageUrl, constant.ProxyZipFile), constant.ProxyStorageUrl)
|
||||||
|
os.Remove(filepath.Join(constant.ProxyStorageUrl, constant.ProxyZipFile))
|
||||||
|
}
|
||||||
107
internal/git-service/server.go
Normal file
107
internal/git-service/server.go
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
package gitService
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"firefly-launcher/pkg/constant"
|
||||||
|
"firefly-launcher/pkg/models"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/wailsapp/wails/v3/pkg/application"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (g *GitService) GetLatestServerVersion() (bool, string, string) {
|
||||||
|
resp, err := http.Get(constant.ServerGitUrl)
|
||||||
|
if err != nil {
|
||||||
|
return false, "", err.Error()
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var releases []models.ReleaseType
|
||||||
|
err = json.Unmarshal(body, &releases)
|
||||||
|
if err != nil {
|
||||||
|
return false, "", err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
return false, "", "no releases found"
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, releases[0].TagName, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GitService) DownloadServerProgress(version string) (bool, string) {
|
||||||
|
resp, err := http.Get(constant.ServerGitUrl)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var releases []*models.ReleaseType
|
||||||
|
err = json.Unmarshal(body, &releases)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
return false, "no releases found"
|
||||||
|
}
|
||||||
|
|
||||||
|
var releaseData *models.ReleaseType
|
||||||
|
for _, release := range releases {
|
||||||
|
if release.TagName == version {
|
||||||
|
releaseData = release
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if releaseData == nil || releaseData.TagName == "" {
|
||||||
|
return false, "no release found"
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetWin models.AssetType
|
||||||
|
for _, asset := range releaseData.Assets {
|
||||||
|
if asset.Name == constant.ServerZipFile {
|
||||||
|
assetWin = asset
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if assetWin.Name == "" {
|
||||||
|
return false, "no assets found"
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Mkdir(constant.ServerStorageUrl, 0755); err != nil {
|
||||||
|
if !os.IsExist(err) {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveFile := filepath.Join(constant.ServerStorageUrl, assetWin.Name)
|
||||||
|
|
||||||
|
resp, err = http.Get(assetWin.BrowserDownloadURL)
|
||||||
|
if err != nil {
|
||||||
|
return false, err.Error()
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
DownloadFile(saveFile, assetWin.BrowserDownloadURL, func(percent float64, speed float64) {
|
||||||
|
application.Get().Event.Emit("download:server", map[string]interface{}{
|
||||||
|
"percent": fmt.Sprintf("%.2f", percent),
|
||||||
|
"speed": fmt.Sprintf("%.2f", speed),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return true, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GitService) UnzipServer() {
|
||||||
|
unzipParallel(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile), constant.ServerStorageUrl)
|
||||||
|
os.Remove(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile))
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package internal
|
package gitService
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"archive/zip"
|
"archive/zip"
|
||||||
@@ -109,8 +109,6 @@ func DownloadFile(filepath string, url string, onEmit func(percent float64, spee
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func unzipParallel(src string, dest string) error {
|
func unzipParallel(src string, dest string) error {
|
||||||
numCPU := runtime.NumCPU()
|
numCPU := runtime.NumCPU()
|
||||||
|
|
||||||
@@ -141,16 +139,14 @@ func unzipParallel(src string, dest string) error {
|
|||||||
|
|
||||||
// Worker pool
|
// Worker pool
|
||||||
for i := 0; i < maxWorkers; i++ {
|
for i := 0; i < maxWorkers; i++ {
|
||||||
wg.Add(1)
|
wg.Go(func() {
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
for j := range jobs {
|
for j := range jobs {
|
||||||
err := extractFile(j.f, dest)
|
err := extractFile(j.f, dest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error extracting %s: %v\n", j.f.Name, err)
|
fmt.Printf("Error extracting %s: %v\n", j.f.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Feed jobs
|
// Feed jobs
|
||||||
@@ -189,4 +185,4 @@ func extractFile(f *zip.File, dest string) error {
|
|||||||
|
|
||||||
_, err = io.Copy(out, rc)
|
_, err = io.Copy(out, rc)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package internal
|
package languageService
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@@ -1 +0,0 @@
|
|||||||
package internal
|
|
||||||
20
main.go
20
main.go
@@ -3,7 +3,13 @@ package main
|
|||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"firefly-launcher/internal"
|
|
||||||
|
appService "firefly-launcher/internal/app-service"
|
||||||
|
diffService "firefly-launcher/internal/diff-service"
|
||||||
|
fsService "firefly-launcher/internal/fs-service"
|
||||||
|
gitService "firefly-launcher/internal/git-service"
|
||||||
|
languageService "firefly-launcher/internal/language-service"
|
||||||
|
|
||||||
"firefly-launcher/pkg/constant"
|
"firefly-launcher/pkg/constant"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
@@ -63,11 +69,11 @@ func main() {
|
|||||||
Name: "firefly-launcher",
|
Name: "firefly-launcher",
|
||||||
Description: "Firefly Launcher - Kain",
|
Description: "Firefly Launcher - Kain",
|
||||||
Services: []application.Service{
|
Services: []application.Service{
|
||||||
application.NewService(&internal.FSService{}),
|
application.NewService(&fsService.FSService{}),
|
||||||
application.NewService(&internal.LanguageService{}),
|
application.NewService(&languageService.LanguageService{}),
|
||||||
application.NewService(&internal.GitService{}),
|
application.NewService(&gitService.GitService{}),
|
||||||
application.NewService(&internal.HdiffzService{}),
|
application.NewService(&diffService.DiffService{}),
|
||||||
application.NewService(&internal.AppService{}),
|
application.NewService(&appService.AppService{}),
|
||||||
},
|
},
|
||||||
Assets: application.AssetOptions{
|
Assets: application.AssetOptions{
|
||||||
Handler: application.AssetFileServerFS(assets),
|
Handler: application.AssetFileServerFS(assets),
|
||||||
@@ -78,7 +84,7 @@ func main() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Create window
|
// Create window
|
||||||
app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
app.Window.NewWithOptions(application.WebviewWindowOptions{
|
||||||
Title: "Firefly Launcher - Kain",
|
Title: "Firefly Launcher - Kain",
|
||||||
Mac: application.MacWindow{
|
Mac: application.MacWindow{
|
||||||
InvisibleTitleBarHeight: 50,
|
InvisibleTitleBarHeight: 50,
|
||||||
|
|||||||
@@ -10,8 +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.5.1"
|
||||||
const CurrentLauncherVersion = "1.4.0"
|
|
||||||
|
|
||||||
type ToolFile string
|
type ToolFile string
|
||||||
|
|
||||||
|
|||||||
73
pkg/firefly/chunk.go
Normal file
73
pkg/firefly/chunk.go
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
package firefly
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"golang.org/x/exp/mmap"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChunkInfo struct {
|
||||||
|
Name string
|
||||||
|
Offset int64
|
||||||
|
Size int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProcessWithBufReader(path string, chunks []ChunkInfo) {
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error opening file %s: %v\n", path, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
for _, chunk := range chunks {
|
||||||
|
buffer, err := ReadChunkData(file, chunk.Offset, chunk.Size)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error reading chunk %s: %v\n", chunk.Name, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
assetPath := filepath.Join("chunk_tmp", chunk.Name)
|
||||||
|
parentDir := filepath.Dir(assetPath)
|
||||||
|
if _, err := os.Stat(parentDir); os.IsNotExist(err) {
|
||||||
|
if err := os.MkdirAll(parentDir, 0o755); err != nil {
|
||||||
|
fmt.Printf("Error creating directory %s: %v\n", parentDir, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.WriteFile(assetPath, buffer, 0o644); err != nil {
|
||||||
|
fmt.Printf("Error writing chunk file %s: %v\n", assetPath, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadChunkData(file *os.File, offset, size int64) ([]byte, error) {
|
||||||
|
info, err := file.Stat()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error getting file info: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.Size() > 1024*1024 && size > 1024*1024 {
|
||||||
|
mmapReader, err := mmap.Open(file.Name())
|
||||||
|
if err == nil {
|
||||||
|
defer mmapReader.Close()
|
||||||
|
buffer := make([]byte, size)
|
||||||
|
_, err := mmapReader.ReadAt(buffer, offset)
|
||||||
|
if err != nil && err != io.EOF {
|
||||||
|
return nil, fmt.Errorf("error reading mmap: %w", err)
|
||||||
|
}
|
||||||
|
return buffer, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer := make([]byte, size)
|
||||||
|
_, err = file.ReadAt(buffer, offset)
|
||||||
|
if err != nil && err != io.EOF {
|
||||||
|
return nil, fmt.Errorf("error reading buffered: %w", err)
|
||||||
|
}
|
||||||
|
return buffer, nil
|
||||||
|
}
|
||||||
94
pkg/firefly/ldiff.go
Normal file
94
pkg/firefly/ldiff.go
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
package firefly
|
||||||
|
|
||||||
|
import (
|
||||||
|
"firefly-launcher/pkg/firefly/pb"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"golang.org/x/exp/mmap"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffsDir, outputDir string) error {
|
||||||
|
path := filepath.Join(ldiffsDir, data.ChunkFileName)
|
||||||
|
|
||||||
|
info, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("%s does not exist: %w", path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileSize := info.Size()
|
||||||
|
var buffer []byte
|
||||||
|
|
||||||
|
if fileSize > 10*1024*1024 && data.HdiffFileSize > 1*1024*1024 {
|
||||||
|
// mmap for large files using x/exp/mmap
|
||||||
|
reader, err := mmap.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
// fallback to buffered read
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error opening file %s: %w", path, err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
buffer, err = ReadBuffer(file, data.HdiffFileInChunkOffset, data.HdiffFileSize)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
defer reader.Close()
|
||||||
|
buffer = make([]byte, data.HdiffFileSize)
|
||||||
|
_, err := reader.ReadAt(buffer, data.HdiffFileInChunkOffset)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error reading mmap data: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// small files, buffered read
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error opening file %s: %w", path, err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
buffer, err = ReadBuffer(file, data.HdiffFileInChunkOffset, data.HdiffFileSize)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension := ""
|
||||||
|
if data.OriginalFileSize != 0 || assetSize != data.HdiffFileSize {
|
||||||
|
extension = ".hdiff"
|
||||||
|
}
|
||||||
|
assetPath := filepath.Join(outputDir, assetName+extension)
|
||||||
|
parentDir := filepath.Dir(assetPath)
|
||||||
|
if _, err := os.Stat(parentDir); os.IsNotExist(err) {
|
||||||
|
if err := os.MkdirAll(parentDir, 0o755); err != nil {
|
||||||
|
return fmt.Errorf("error creating directory %s: %w", parentDir, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.WriteFile(assetPath, buffer, 0o644); err != nil {
|
||||||
|
return fmt.Errorf("error writing file %s: %w", assetPath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func ReadBuffer(file *os.File, offset int64, size int64) ([]byte, error) {
|
||||||
|
buffer := make([]byte, size)
|
||||||
|
|
||||||
|
n, err := file.ReadAt(buffer, offset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error reading data: %w", err)
|
||||||
|
}
|
||||||
|
if int64(n) != size {
|
||||||
|
return nil, fmt.Errorf("expected %d bytes, but read %d bytes", size, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer, nil
|
||||||
|
}
|
||||||
|
|
||||||
66
pkg/firefly/loader.go
Normal file
66
pkg/firefly/loader.go
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
package firefly
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"firefly-launcher/pkg/firefly/pb"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/klauspost/compress/zstd"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
func LoadChunkProto(path string) (*pb.ChunkProto, error) {
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
reader := bufio.NewReader(file)
|
||||||
|
decoder, err := zstd.NewReader(reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer decoder.Close()
|
||||||
|
|
||||||
|
data, err := io.ReadAll(decoder)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var chunk pb.ChunkProto
|
||||||
|
if err := proto.Unmarshal(data, &chunk); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &chunk, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load ManifestProto từ file Zstd + Protobuf
|
||||||
|
func LoadManifestProto(path string) (*pb.ManifestProto, error) {
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
reader := bufio.NewReader(file)
|
||||||
|
decoder, err := zstd.NewReader(reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer decoder.Close()
|
||||||
|
|
||||||
|
data, err := io.ReadAll(decoder)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var manifest pb.ManifestProto
|
||||||
|
if err := proto.Unmarshal(data, &manifest); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &manifest, nil
|
||||||
|
}
|
||||||
651
pkg/firefly/pb/firefly.pb.go
Normal file
651
pkg/firefly/pb/firefly.pb.go
Normal file
@@ -0,0 +1,651 @@
|
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// protoc-gen-go v1.36.5
|
||||||
|
// protoc v4.25.6
|
||||||
|
// source: proto/firefly.proto
|
||||||
|
|
||||||
|
package pb
|
||||||
|
|
||||||
|
import (
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
unsafe "unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Verify that this generated code is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||||
|
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChunkProto struct {
|
||||||
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
|
Assets []*AssetChunkProperty `protobuf:"bytes,1,rep,name=assets,proto3" json:"assets,omitempty"`
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ChunkProto) Reset() {
|
||||||
|
*x = ChunkProto{}
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[0]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ChunkProto) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ChunkProto) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *ChunkProto) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[0]
|
||||||
|
if x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use ChunkProto.ProtoReflect.Descriptor instead.
|
||||||
|
func (*ChunkProto) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_firefly_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ChunkProto) GetAssets() []*AssetChunkProperty {
|
||||||
|
if x != nil {
|
||||||
|
return x.Assets
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type AssetChunkProperty struct {
|
||||||
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
|
AssetName string `protobuf:"bytes,1,opt,name=asset_name,json=assetName,proto3" json:"asset_name,omitempty"`
|
||||||
|
AssetChunks []*AssetChunk `protobuf:"bytes,2,rep,name=asset_chunks,json=assetChunks,proto3" json:"asset_chunks,omitempty"`
|
||||||
|
AssetType int32 `protobuf:"varint,3,opt,name=asset_type,json=assetType,proto3" json:"asset_type,omitempty"`
|
||||||
|
AssetSize int64 `protobuf:"varint,4,opt,name=asset_size,json=assetSize,proto3" json:"asset_size,omitempty"`
|
||||||
|
AssetHashMd5 string `protobuf:"bytes,5,opt,name=asset_hash_md5,json=assetHashMd5,proto3" json:"asset_hash_md5,omitempty"`
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) Reset() {
|
||||||
|
*x = AssetChunkProperty{}
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[1]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*AssetChunkProperty) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[1]
|
||||||
|
if x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use AssetChunkProperty.ProtoReflect.Descriptor instead.
|
||||||
|
func (*AssetChunkProperty) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_firefly_proto_rawDescGZIP(), []int{1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) GetAssetName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetName
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) GetAssetChunks() []*AssetChunk {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetChunks
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) GetAssetType() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetType
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) GetAssetSize() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetSize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunkProperty) GetAssetHashMd5() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetHashMd5
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type AssetChunk struct {
|
||||||
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
|
ChunkName string `protobuf:"bytes,1,opt,name=chunk_name,json=chunkName,proto3" json:"chunk_name,omitempty"`
|
||||||
|
ChunkDecompressedHashMd5 string `protobuf:"bytes,2,opt,name=chunk_decompressed_hash_md5,json=chunkDecompressedHashMd5,proto3" json:"chunk_decompressed_hash_md5,omitempty"`
|
||||||
|
ChunkOnFileOffset int64 `protobuf:"varint,3,opt,name=chunk_on_file_offset,json=chunkOnFileOffset,proto3" json:"chunk_on_file_offset,omitempty"`
|
||||||
|
ChunkSize int64 `protobuf:"varint,4,opt,name=chunk_size,json=chunkSize,proto3" json:"chunk_size,omitempty"`
|
||||||
|
ChunkSizeDecompressed int64 `protobuf:"varint,5,opt,name=chunk_size_decompressed,json=chunkSizeDecompressed,proto3" json:"chunk_size_decompressed,omitempty"`
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunk) Reset() {
|
||||||
|
*x = AssetChunk{}
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[2]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunk) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*AssetChunk) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *AssetChunk) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[2]
|
||||||
|
if x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use AssetChunk.ProtoReflect.Descriptor instead.
|
||||||
|
func (*AssetChunk) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_firefly_proto_rawDescGZIP(), []int{2}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunk) GetChunkName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkName
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunk) GetChunkDecompressedHashMd5() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkDecompressedHashMd5
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunk) GetChunkOnFileOffset() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkOnFileOffset
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunk) GetChunkSize() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkSize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetChunk) GetChunkSizeDecompressed() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkSizeDecompressed
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type ManifestProto struct {
|
||||||
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
|
Assets []*AssetManifestProperty `protobuf:"bytes,1,rep,name=assets,proto3" json:"assets,omitempty"`
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ManifestProto) Reset() {
|
||||||
|
*x = ManifestProto{}
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[3]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ManifestProto) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ManifestProto) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *ManifestProto) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[3]
|
||||||
|
if x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use ManifestProto.ProtoReflect.Descriptor instead.
|
||||||
|
func (*ManifestProto) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_firefly_proto_rawDescGZIP(), []int{3}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ManifestProto) GetAssets() []*AssetManifestProperty {
|
||||||
|
if x != nil {
|
||||||
|
return x.Assets
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type AssetManifestProperty struct {
|
||||||
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
|
AssetName string `protobuf:"bytes,1,opt,name=asset_name,json=assetName,proto3" json:"asset_name,omitempty"`
|
||||||
|
AssetSize int64 `protobuf:"varint,2,opt,name=asset_size,json=assetSize,proto3" json:"asset_size,omitempty"`
|
||||||
|
AssetHashMd5 string `protobuf:"bytes,3,opt,name=asset_hash_md5,json=assetHashMd5,proto3" json:"asset_hash_md5,omitempty"`
|
||||||
|
AssetData *AssetManifestChunk `protobuf:"bytes,4,opt,name=asset_data,json=assetData,proto3" json:"asset_data,omitempty"`
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestProperty) Reset() {
|
||||||
|
*x = AssetManifestProperty{}
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[4]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestProperty) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*AssetManifestProperty) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *AssetManifestProperty) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[4]
|
||||||
|
if x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use AssetManifestProperty.ProtoReflect.Descriptor instead.
|
||||||
|
func (*AssetManifestProperty) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_firefly_proto_rawDescGZIP(), []int{4}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestProperty) GetAssetName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetName
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestProperty) GetAssetSize() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetSize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestProperty) GetAssetHashMd5() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetHashMd5
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestProperty) GetAssetData() *AssetManifestChunk {
|
||||||
|
if x != nil {
|
||||||
|
return x.AssetData
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type AssetManifestChunk struct {
|
||||||
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
|
LatestAssetVersion string `protobuf:"bytes,1,opt,name=latest_asset_version,json=latestAssetVersion,proto3" json:"latest_asset_version,omitempty"`
|
||||||
|
Assets []*AssetManifest `protobuf:"bytes,2,rep,name=assets,proto3" json:"assets,omitempty"`
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestChunk) Reset() {
|
||||||
|
*x = AssetManifestChunk{}
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[5]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestChunk) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*AssetManifestChunk) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *AssetManifestChunk) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[5]
|
||||||
|
if x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use AssetManifestChunk.ProtoReflect.Descriptor instead.
|
||||||
|
func (*AssetManifestChunk) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_firefly_proto_rawDescGZIP(), []int{5}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestChunk) GetLatestAssetVersion() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.LatestAssetVersion
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifestChunk) GetAssets() []*AssetManifest {
|
||||||
|
if x != nil {
|
||||||
|
return x.Assets
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type AssetManifest struct {
|
||||||
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
|
ChunkFileName string `protobuf:"bytes,1,opt,name=chunk_file_name,json=chunkFileName,proto3" json:"chunk_file_name,omitempty"`
|
||||||
|
ChunkFileVersion string `protobuf:"bytes,2,opt,name=chunk_file_version,json=chunkFileVersion,proto3" json:"chunk_file_version,omitempty"`
|
||||||
|
ChunkFileNode string `protobuf:"bytes,3,opt,name=chunk_file_node,json=chunkFileNode,proto3" json:"chunk_file_node,omitempty"`
|
||||||
|
ChunkFileSize int64 `protobuf:"varint,4,opt,name=chunk_file_size,json=chunkFileSize,proto3" json:"chunk_file_size,omitempty"`
|
||||||
|
ChunkFileMd5 string `protobuf:"bytes,5,opt,name=chunk_file_md5,json=chunkFileMd5,proto3" json:"chunk_file_md5,omitempty"`
|
||||||
|
HdiffFileInChunkOffset int64 `protobuf:"varint,6,opt,name=hdiff_file_in_chunk_offset,json=hdiffFileInChunkOffset,proto3" json:"hdiff_file_in_chunk_offset,omitempty"`
|
||||||
|
HdiffFileSize int64 `protobuf:"varint,7,opt,name=hdiff_file_size,json=hdiffFileSize,proto3" json:"hdiff_file_size,omitempty"`
|
||||||
|
OriginalFilePath string `protobuf:"bytes,8,opt,name=original_file_path,json=originalFilePath,proto3" json:"original_file_path,omitempty"`
|
||||||
|
OriginalFileSize int64 `protobuf:"varint,9,opt,name=original_file_size,json=originalFileSize,proto3" json:"original_file_size,omitempty"`
|
||||||
|
OriginalFileMd5 string `protobuf:"bytes,10,opt,name=original_file_md5,json=originalFileMd5,proto3" json:"original_file_md5,omitempty"`
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) Reset() {
|
||||||
|
*x = AssetManifest{}
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[6]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*AssetManifest) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *AssetManifest) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_proto_firefly_proto_msgTypes[6]
|
||||||
|
if x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use AssetManifest.ProtoReflect.Descriptor instead.
|
||||||
|
func (*AssetManifest) Descriptor() ([]byte, []int) {
|
||||||
|
return file_proto_firefly_proto_rawDescGZIP(), []int{6}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetChunkFileName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkFileName
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetChunkFileVersion() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkFileVersion
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetChunkFileNode() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkFileNode
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetChunkFileSize() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkFileSize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetChunkFileMd5() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.ChunkFileMd5
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetHdiffFileInChunkOffset() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.HdiffFileInChunkOffset
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetHdiffFileSize() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.HdiffFileSize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetOriginalFilePath() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.OriginalFilePath
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetOriginalFileSize() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.OriginalFileSize
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *AssetManifest) GetOriginalFileMd5() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.OriginalFileMd5
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
var File_proto_firefly_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
|
var file_proto_firefly_proto_rawDesc = string([]byte{
|
||||||
|
0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6c, 0x79, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6c, 0x79, 0x22, 0x41,
|
||||||
|
0x0a, 0x0a, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x33, 0x0a, 0x06,
|
||||||
|
0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66,
|
||||||
|
0x69, 0x72, 0x65, 0x66, 0x6c, 0x79, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x43, 0x68, 0x75, 0x6e,
|
||||||
|
0x6b, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74,
|
||||||
|
0x73, 0x22, 0xcf, 0x01, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b,
|
||||||
|
0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65,
|
||||||
|
0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73,
|
||||||
|
0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74,
|
||||||
|
0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e,
|
||||||
|
0x66, 0x69, 0x72, 0x65, 0x66, 0x6c, 0x79, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x43, 0x68, 0x75,
|
||||||
|
0x6e, 0x6b, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12,
|
||||||
|
0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20,
|
||||||
|
0x01, 0x28, 0x05, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d,
|
||||||
|
0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01,
|
||||||
|
0x28, 0x03, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24, 0x0a,
|
||||||
|
0x0e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6d, 0x64, 0x35, 0x18,
|
||||||
|
0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x48, 0x61, 0x73, 0x68,
|
||||||
|
0x4d, 0x64, 0x35, 0x22, 0xf2, 0x01, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x43, 0x68, 0x75,
|
||||||
|
0x6e, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x4e, 0x61, 0x6d,
|
||||||
|
0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x6d,
|
||||||
|
0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6d, 0x64, 0x35,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x65, 0x63,
|
||||||
|
0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x4d, 0x64, 0x35,
|
||||||
|
0x12, 0x2f, 0x0a, 0x14, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c,
|
||||||
|
0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11,
|
||||||
|
0x63, 0x68, 0x75, 0x6e, 0x6b, 0x4f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65,
|
||||||
|
0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,
|
||||||
|
0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65,
|
||||||
|
0x12, 0x36, 0x0a, 0x17, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x64,
|
||||||
|
0x65, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28,
|
||||||
|
0x03, 0x52, 0x15, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x44, 0x65, 0x63, 0x6f,
|
||||||
|
0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x47, 0x0a, 0x0d, 0x4d, 0x61, 0x6e, 0x69,
|
||||||
|
0x66, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x73, 0x73,
|
||||||
|
0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x66, 0x69, 0x72, 0x65,
|
||||||
|
0x66, 0x6c, 0x79, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73,
|
||||||
|
0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74,
|
||||||
|
0x73, 0x22, 0xb7, 0x01, 0x0a, 0x15, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66,
|
||||||
|
0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61,
|
||||||
|
0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73,
|
||||||
|
0x73, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
|
||||||
|
0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x73, 0x73,
|
||||||
|
0x65, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x48, 0x61, 0x73, 0x68, 0x4d, 0x64, 0x35, 0x12,
|
||||||
|
0x3a, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6c, 0x79, 0x2e, 0x41, 0x73,
|
||||||
|
0x73, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b,
|
||||||
|
0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, 0x76, 0x0a, 0x12, 0x41,
|
||||||
|
0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e,
|
||||||
|
0x6b, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65,
|
||||||
|
0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x12, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73,
|
||||||
|
0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20,
|
||||||
|
0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6c, 0x79, 0x2e, 0x41, 0x73,
|
||||||
|
0x73, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73,
|
||||||
|
0x65, 0x74, 0x73, 0x22, 0xc7, 0x03, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x6e,
|
||||||
|
0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66,
|
||||||
|
0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,
|
||||||
|
0x63, 0x68, 0x75, 0x6e, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a,
|
||||||
|
0x12, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73,
|
||||||
|
0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x68, 0x75, 0x6e, 0x6b,
|
||||||
|
0x46, 0x69, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x63,
|
||||||
|
0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03,
|
||||||
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x4e,
|
||||||
|
0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, 0x69, 0x6c,
|
||||||
|
0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68,
|
||||||
|
0x75, 0x6e, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x63,
|
||||||
|
0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x05, 0x20,
|
||||||
|
0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x64,
|
||||||
|
0x35, 0x12, 0x3a, 0x0a, 0x1a, 0x68, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f,
|
||||||
|
0x69, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18,
|
||||||
|
0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x68, 0x64, 0x69, 0x66, 0x66, 0x46, 0x69, 0x6c, 0x65,
|
||||||
|
0x49, 0x6e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x26, 0x0a,
|
||||||
|
0x0f, 0x68, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65,
|
||||||
|
0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x68, 0x64, 0x69, 0x66, 0x66, 0x46, 0x69, 0x6c,
|
||||||
|
0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61,
|
||||||
|
0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x10, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x50,
|
||||||
|
0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f,
|
||||||
|
0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52,
|
||||||
|
0x10, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a,
|
||||||
|
0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69,
|
||||||
|
0x6c, 0x65, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x72,
|
||||||
|
0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x42, 0x0e, 0x5a,
|
||||||
|
0x0c, 0x2e, 0x2f, 0x66, 0x69, 0x72, 0x65, 0x66, 0x6c, 0x79, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70,
|
||||||
|
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
|
})
|
||||||
|
|
||||||
|
var (
|
||||||
|
file_proto_firefly_proto_rawDescOnce sync.Once
|
||||||
|
file_proto_firefly_proto_rawDescData []byte
|
||||||
|
)
|
||||||
|
|
||||||
|
func file_proto_firefly_proto_rawDescGZIP() []byte {
|
||||||
|
file_proto_firefly_proto_rawDescOnce.Do(func() {
|
||||||
|
file_proto_firefly_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proto_firefly_proto_rawDesc), len(file_proto_firefly_proto_rawDesc)))
|
||||||
|
})
|
||||||
|
return file_proto_firefly_proto_rawDescData
|
||||||
|
}
|
||||||
|
|
||||||
|
var file_proto_firefly_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
|
||||||
|
var file_proto_firefly_proto_goTypes = []any{
|
||||||
|
(*ChunkProto)(nil), // 0: firefly.ChunkProto
|
||||||
|
(*AssetChunkProperty)(nil), // 1: firefly.AssetChunkProperty
|
||||||
|
(*AssetChunk)(nil), // 2: firefly.AssetChunk
|
||||||
|
(*ManifestProto)(nil), // 3: firefly.ManifestProto
|
||||||
|
(*AssetManifestProperty)(nil), // 4: firefly.AssetManifestProperty
|
||||||
|
(*AssetManifestChunk)(nil), // 5: firefly.AssetManifestChunk
|
||||||
|
(*AssetManifest)(nil), // 6: firefly.AssetManifest
|
||||||
|
}
|
||||||
|
var file_proto_firefly_proto_depIdxs = []int32{
|
||||||
|
1, // 0: firefly.ChunkProto.assets:type_name -> firefly.AssetChunkProperty
|
||||||
|
2, // 1: firefly.AssetChunkProperty.asset_chunks:type_name -> firefly.AssetChunk
|
||||||
|
4, // 2: firefly.ManifestProto.assets:type_name -> firefly.AssetManifestProperty
|
||||||
|
5, // 3: firefly.AssetManifestProperty.asset_data:type_name -> firefly.AssetManifestChunk
|
||||||
|
6, // 4: firefly.AssetManifestChunk.assets:type_name -> firefly.AssetManifest
|
||||||
|
5, // [5:5] is the sub-list for method output_type
|
||||||
|
5, // [5:5] is the sub-list for method input_type
|
||||||
|
5, // [5:5] is the sub-list for extension type_name
|
||||||
|
5, // [5:5] is the sub-list for extension extendee
|
||||||
|
0, // [0:5] is the sub-list for field type_name
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { file_proto_firefly_proto_init() }
|
||||||
|
func file_proto_firefly_proto_init() {
|
||||||
|
if File_proto_firefly_proto != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
type x struct{}
|
||||||
|
out := protoimpl.TypeBuilder{
|
||||||
|
File: protoimpl.DescBuilder{
|
||||||
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
|
RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_firefly_proto_rawDesc), len(file_proto_firefly_proto_rawDesc)),
|
||||||
|
NumEnums: 0,
|
||||||
|
NumMessages: 7,
|
||||||
|
NumExtensions: 0,
|
||||||
|
NumServices: 0,
|
||||||
|
},
|
||||||
|
GoTypes: file_proto_firefly_proto_goTypes,
|
||||||
|
DependencyIndexes: file_proto_firefly_proto_depIdxs,
|
||||||
|
MessageInfos: file_proto_firefly_proto_msgTypes,
|
||||||
|
}.Build()
|
||||||
|
File_proto_firefly_proto = out.File
|
||||||
|
file_proto_firefly_proto_goTypes = nil
|
||||||
|
file_proto_firefly_proto_depIdxs = nil
|
||||||
|
}
|
||||||
@@ -21,9 +21,18 @@ func IsFileIn7z(archivePath, fileInside string) (bool, error) {
|
|||||||
|
|
||||||
lines := strings.Split(out.String(), "\n")
|
lines := strings.Split(out.String(), "\n")
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
if strings.Contains(line, fileInside) {
|
line = strings.TrimSpace(line)
|
||||||
return true, nil
|
if line == "" {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
parts := strings.Fields(line)
|
||||||
|
if len(parts) > 0 {
|
||||||
|
path := parts[len(parts)-1]
|
||||||
|
if path == fileInside {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false, fmt.Errorf("%s not found in %s", fileInside, archivePath)
|
return false, fmt.Errorf("%s not found in %s", fileInside, archivePath)
|
||||||
|
|||||||
@@ -41,13 +41,13 @@ func NewVerifier(gamePath, hdiffPath string) (*Verifier, error) {
|
|||||||
|
|
||||||
func (v *Verifier) VerifyAll() error {
|
func (v *Verifier) VerifyAll() error {
|
||||||
for i, entry := range v.DiffMapEntries {
|
for i, entry := range v.DiffMapEntries {
|
||||||
application.Get().EmitEvent(
|
application.Get().Event.Emit(
|
||||||
"hdiffz:progress", map[string]int{
|
"hdiffz:progress", map[string]int{
|
||||||
"progress": i,
|
"progress": i,
|
||||||
"maxProgress": len(v.DiffMapEntries),
|
"maxProgress": len(v.DiffMapEntries),
|
||||||
})
|
})
|
||||||
if err := check(entry.SourceFileName, entry.SourceFileSize, entry.SourceFileMD5, v.GamePath); err != nil {
|
if err := check(entry.SourceFileName, entry.SourceFileSize, entry.SourceFileMD5, v.GamePath); err != nil {
|
||||||
application.Get().EmitEvent("hdiffz:error", err.Error())
|
application.Get().Event.Emit("hdiffz:error", err.Error())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user