From 16ab71df5564ce21177d7bf903f71a3994a33d4b Mon Sep 17 00:00:00 2001 From: MathieuG-P Date: Sun, 15 May 2022 15:14:02 +0200 Subject: [PATCH] =?UTF-8?q?r=C3=A9arganisation=20du=20back=20en=20services?= =?UTF-8?q?,=20mise=20de=20depot=20downloader=20dans=20les=20assets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .erb/configs/.eslintrc | 5 +- .eslintrc.js | 6 +- .../DepotDownloader.deps.json | 0 .../depot-downloader/DepotDownloader.dll | Bin 102381 -> 102382 bytes .../depot-downloader/DepotDownloader.exe | Bin .../depot-downloader/DepotDownloader.pdb | Bin .../DepotDownloader.runtimeconfig.json | 0 .../depot-downloader/SteamKit2.dll | Bin .../depot-downloader/protobuf-net.Core.dll | Bin .../depot-downloader/protobuf-net.dll | Bin package-lock.json | 351 ++++++++++++++---- package.json | 2 + src/main/constants.ts | 3 + src/main/ipcs/bs-download-ipcs.ts | 7 +- src/main/ipcs/bs-launcher-ipcs.ts | 36 ++ src/main/ipcs/bs-version-ipcs.ts | 8 + src/main/ipcs/custom-ipcs.ts | 1 + src/main/ipcs/window-controls-ipcs.ts | 8 +- src/main/main.ts | 7 +- src/main/services/bs-installer.service.ts | 29 ++ .../services/bs-version-manager.service.ts | 38 ++ src/main/services/steam.service.ts | 62 ++++ src/main/services/utils.service.ts | 46 +++ src/main/utils.ts | 4 - src/renderer/index.tsx | 10 +- tsconfig.json | 3 +- 26 files changed, 534 insertions(+), 92 deletions(-) rename {src/extraResources => assets}/depot-downloader/DepotDownloader.deps.json (100%) rename {src/extraResources => assets}/depot-downloader/DepotDownloader.dll (80%) rename {src/extraResources => assets}/depot-downloader/DepotDownloader.exe (100%) rename {src/extraResources => assets}/depot-downloader/DepotDownloader.pdb (100%) rename {src/extraResources => assets}/depot-downloader/DepotDownloader.runtimeconfig.json (100%) rename {src/extraResources => assets}/depot-downloader/SteamKit2.dll (100%) rename {src/extraResources => assets}/depot-downloader/protobuf-net.Core.dll (100%) rename {src/extraResources => assets}/depot-downloader/protobuf-net.dll (100%) create mode 100644 src/main/constants.ts create mode 100644 src/main/ipcs/bs-launcher-ipcs.ts create mode 100644 src/main/ipcs/bs-version-ipcs.ts create mode 100644 src/main/services/bs-installer.service.ts create mode 100644 src/main/services/bs-version-manager.service.ts create mode 100644 src/main/services/steam.service.ts create mode 100644 src/main/services/utils.service.ts delete mode 100644 src/main/utils.ts diff --git a/.erb/configs/.eslintrc b/.erb/configs/.eslintrc index 97b04b45..12060680 100644 --- a/.erb/configs/.eslintrc +++ b/.erb/configs/.eslintrc @@ -4,6 +4,9 @@ "global-require": "off", "import/no-dynamic-require": "off", "prettier/prettier": 0, - "import/prefer-default-export": "off" + "import/prefer-default-export": "off", + "no-empty-function": "off", + "@typescript-eslint/no-empty-function": "off", + "@angular-eslint/no-empty-lifecycle-method": "off" } } diff --git a/.eslintrc.js b/.eslintrc.js index 8072be9d..9455e816 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,7 +7,11 @@ module.exports = { // Since React 17 and typescript 4.1 you can safely disable the rule 'react/react-in-jsx-scope': 'off', 'prettier/prettier': 0, - "import/prefer-default-export": "off" + "global-require": 0 + "import/prefer-default-export": "off", + "no-empty-function": "off", + "@typescript-eslint/no-empty-function": "off", + "@angular-eslint/no-empty-lifecycle-method": "off" }, parserOptions: { ecmaVersion: 2020, diff --git a/src/extraResources/depot-downloader/DepotDownloader.deps.json b/assets/depot-downloader/DepotDownloader.deps.json similarity index 100% rename from src/extraResources/depot-downloader/DepotDownloader.deps.json rename to assets/depot-downloader/DepotDownloader.deps.json diff --git a/src/extraResources/depot-downloader/DepotDownloader.dll b/assets/depot-downloader/DepotDownloader.dll similarity index 80% rename from src/extraResources/depot-downloader/DepotDownloader.dll rename to assets/depot-downloader/DepotDownloader.dll index 073638d55fe5812778ea24b789275fbcd6bc5ab7..93041c3776e17aa573b97416866bf2b1958e0608 100644 GIT binary patch delta 3469 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 CRf44e delta 3318 zcmZ`+32>9g72dbTGL{cy$&zdxwk%t=e8{IPUl3yq*bavc1`OpiH!dJ$#Z??IHw@)+ zU+Evt3@$e`K!1XnhT)i&Ha(J1(l8APn39l5pb$bDpiMB{)rILyHKX0P-}k+@Z{NSW zzx3cu#r-!G+ZJk-X~h3&7(~cW2qVW5FMiqnQxhoL4>!>>9SD#fes&*_QJ6w=a4cki z3Rggza5;9Adk0pGph;u~XF_&f`;68YIc)xElaV@OyO@?8S7=O1LE-)|>&_t-vYT$A-NM z;)x57v%0N3fPE8hyh(h5bf?YDgcmW&0~Tu8+!)=`j&Z(D02PwuvE0Vu-FX{E4P{(V|DwBQ)2#^5^&B|vRCk+ zb61~D)&Qc&aj{!gY$$faLcCaPF@KdBN@5gG!p^S(g?k~NIJ>#e zO9vydsbmM;l8%o`9?+}lc)PT<(vm?uS@!Svr1pRDCP%^YeaN>xkiG(8wW1wvU(RQC zDA-sZHVJo^4TS0PKgzCz)43V4T-g*(f0u#Lg9g%@88~u~livgD2d$>Ruw(S#7W!*D zE*UI2KDQH(yNS=Rd@^rxhr~s*5agaBX70}$N0AT5zBL7oM=yH};7kbW;gRLTac7M) zo@Bl>M$(W#{y%0B_-lX}NfLhRRYgu4&|mnnI8{uF$({5b^o z&~}BuWl>zaJb^#2fc_q*?DND;zz>L`Clgm3U}D_WFIJIu754~WoYMNJm`H6=99t#=i7Qth zbt6Y?IDhSAA!`xmF+y_VdHk{97fSSZ|L4hJ8b zG5FZlm*5O}DE@Jq#as_4O$ z2y^e?``pfWcr~zC%x_BoBi6N5)7cfcrR}0{X;`5zdf`IC+y_D~gn2@-_*yE(c3UiB z5oW}lEB;N-R^axPo56&stID+2zQp7G6?a}rTkE-0mmkGmkzZSt+beNyUqVtxHgGT9gB{b3z)zYPE&`J~f zLxp14P~s+D>6=Q>NEiFV##kIrYRE#;Oclz8yfK|0^!_lbv+S2-y=j$^TcYLu~y1WJ!6$a1?4+E%(-cr3!YI$@c?HVg- tzZv-dA!0ujwxvBqNAGq>YuCamNwo=%cSfv(uOn!5Q73GI2hg71`@b3JRxtno diff --git a/src/extraResources/depot-downloader/DepotDownloader.exe b/assets/depot-downloader/DepotDownloader.exe similarity index 100% rename from src/extraResources/depot-downloader/DepotDownloader.exe rename to assets/depot-downloader/DepotDownloader.exe diff --git a/src/extraResources/depot-downloader/DepotDownloader.pdb b/assets/depot-downloader/DepotDownloader.pdb similarity index 100% rename from src/extraResources/depot-downloader/DepotDownloader.pdb rename to assets/depot-downloader/DepotDownloader.pdb diff --git a/src/extraResources/depot-downloader/DepotDownloader.runtimeconfig.json b/assets/depot-downloader/DepotDownloader.runtimeconfig.json similarity index 100% rename from src/extraResources/depot-downloader/DepotDownloader.runtimeconfig.json rename to assets/depot-downloader/DepotDownloader.runtimeconfig.json diff --git a/src/extraResources/depot-downloader/SteamKit2.dll b/assets/depot-downloader/SteamKit2.dll similarity index 100% rename from src/extraResources/depot-downloader/SteamKit2.dll rename to assets/depot-downloader/SteamKit2.dll diff --git a/src/extraResources/depot-downloader/protobuf-net.Core.dll b/assets/depot-downloader/protobuf-net.Core.dll similarity index 100% rename from src/extraResources/depot-downloader/protobuf-net.Core.dll rename to assets/depot-downloader/protobuf-net.Core.dll diff --git a/src/extraResources/depot-downloader/protobuf-net.dll b/assets/depot-downloader/protobuf-net.dll similarity index 100% rename from src/extraResources/depot-downloader/protobuf-net.dll rename to assets/depot-downloader/protobuf-net.dll diff --git a/package-lock.json b/package-lock.json index 9ffcc0ce..8a01b84e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { + "@node-steam/vdf": "^2.2.0", "electron-debug": "^3.2.0", "electron-log": "^4.4.6", "electron-updater": "^4.6.5", @@ -16,6 +17,7 @@ "react-dom": "^18.0.0", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", + "regedit": "^5.1.1", "tailwind-scrollbar-hide": "^1.1.7" }, "devDependencies": { @@ -1469,6 +1471,15 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/@node-steam/vdf": { + "version": "2.2.0", + "resolved": "https://npm.zone51.tf/@node-steam%2fvdf/-/vdf-2.2.0.tgz", + "integrity": "sha512-YCfIPsIpyrtOP5AdsarjPqjTElVFrXJlWedWNzjCaIeam06v9ebYgApRAcw9b93awNDboTEiHFMnCvlJJHqKcA==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5128,7 +5139,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { @@ -5736,16 +5746,20 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://npm.zone51.tf/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "license": "MIT", "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/defined": { @@ -7183,32 +7197,35 @@ } }, "node_modules/es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "version": "1.20.0", + "resolved": "https://npm.zone51.tf/es-abstract/-/es-abstract-1.20.0.tgz", + "integrity": "sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.1", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9039,6 +9056,25 @@ "dev": true, "license": "MIT" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://npm.zone51.tf/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -9046,6 +9082,16 @@ "dev": true, "license": "MIT" }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://npm.zone51.tf/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -9378,9 +9424,9 @@ } }, "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://npm.zone51.tf/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "license": "MIT", "funding": { @@ -9397,6 +9443,19 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://npm.zone51.tf/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -9810,6 +9869,12 @@ ], "license": "BSD-3-Clause" }, + "node_modules/if-async": { + "version": "3.7.4", + "resolved": "https://npm.zone51.tf/if-async/-/if-async-3.7.4.tgz", + "integrity": "sha1-VYaN6wCT08Z79xZudFNT+5vLIaI=", + "license": "MIT" + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -9946,7 +10011,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -10007,7 +10071,7 @@ }, "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "resolved": "https://npm.zone51.tf/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "license": "MIT", @@ -10033,7 +10097,7 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "resolved": "https://npm.zone51.tf/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "license": "MIT", @@ -10234,7 +10298,7 @@ }, "node_modules/is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "resolved": "https://npm.zone51.tf/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "license": "MIT", @@ -14694,6 +14758,18 @@ "node": ">=8" } }, + "node_modules/regedit": { + "version": "5.1.1", + "resolved": "https://npm.zone51.tf/regedit/-/regedit-5.1.1.tgz", + "integrity": "sha512-NJ2OZ14czryt3RiQyMM/nptaiu0bF1CT+YVw0PBziMrLJyq8pdmIAvupi9E+NPWJLDJtyHDoKs5g5wcbP8ANIg==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "if-async": "^3.7.4", + "stream-slicer": "0.0.6", + "through2": "^0.6.3" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -15777,6 +15853,12 @@ "node": ">= 0.6" } }, + "node_modules/stream-slicer": { + "version": "0.0.6", + "resolved": "https://npm.zone51.tf/stream-slicer/-/stream-slicer-0.0.6.tgz", + "integrity": "sha1-+GsqxcJEC3oKh7cfM2ZcB4gEYTg=", + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15854,28 +15936,30 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://npm.zone51.tf/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://npm.zone51.tf/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16343,6 +16427,40 @@ "dev": true, "license": "MIT" }, + "node_modules/through2": { + "version": "0.6.5", + "resolved": "https://npm.zone51.tf/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://npm.zone51.tf/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://npm.zone51.tf/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://npm.zone51.tf/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "license": "MIT" + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -16772,15 +16890,15 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://npm.zone51.tf/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { @@ -17679,7 +17797,7 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "resolved": "https://npm.zone51.tf/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "license": "MIT", @@ -17833,7 +17951,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4" @@ -18936,6 +19053,11 @@ "integrity": "sha512-OZx2PxHtJDc9NOHGR3T0ZtX1WYl5qH/xmiH3sKSmcd3o+vPMG1kVUYbZrMxH3fVKpkkkrQpwETCIDRXcMXAWTw==", "dev": true }, + "@node-steam/vdf": { + "version": "2.2.0", + "resolved": "https://npm.zone51.tf/@node-steam%2fvdf/-/vdf-2.2.0.tgz", + "integrity": "sha512-YCfIPsIpyrtOP5AdsarjPqjTElVFrXJlWedWNzjCaIeam06v9ebYgApRAcw9b93awNDboTEiHFMnCvlJJHqKcA==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -21569,8 +21691,7 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { "version": "7.0.1", @@ -21979,12 +22100,13 @@ "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://npm.zone51.tf/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "defined": { @@ -23025,31 +23147,34 @@ } }, "es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "version": "1.20.0", + "resolved": "https://npm.zone51.tf/es-abstract/-/es-abstract-1.20.0.tgz", + "integrity": "sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.1", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" } }, "es-module-lexer": { @@ -24299,12 +24424,30 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://npm.zone51.tf/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://npm.zone51.tf/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -24537,9 +24680,9 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://npm.zone51.tf/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -24548,6 +24691,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://npm.zone51.tf/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -24822,6 +24974,11 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, + "if-async": { + "version": "3.7.4", + "resolved": "https://npm.zone51.tf/if-async/-/if-async-3.7.4.tgz", + "integrity": "sha1-VYaN6wCT08Z79xZudFNT+5vLIaI=" + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -24914,8 +25071,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -24960,7 +25116,7 @@ }, "is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "resolved": "https://npm.zone51.tf/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { @@ -24978,7 +25134,7 @@ }, "is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "resolved": "https://npm.zone51.tf/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { @@ -25094,7 +25250,7 @@ }, "is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "resolved": "https://npm.zone51.tf/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { @@ -28124,6 +28280,17 @@ "strip-indent": "^3.0.0" } }, + "regedit": { + "version": "5.1.1", + "resolved": "https://npm.zone51.tf/regedit/-/regedit-5.1.1.tgz", + "integrity": "sha512-NJ2OZ14czryt3RiQyMM/nptaiu0bF1CT+YVw0PBziMrLJyq8pdmIAvupi9E+NPWJLDJtyHDoKs5g5wcbP8ANIg==", + "requires": { + "debug": "^4.1.0", + "if-async": "^3.7.4", + "stream-slicer": "0.0.6", + "through2": "^0.6.3" + } + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -28896,6 +29063,11 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stream-slicer": { + "version": "0.0.6", + "resolved": "https://npm.zone51.tf/stream-slicer/-/stream-slicer-0.0.6.tgz", + "integrity": "sha1-+GsqxcJEC3oKh7cfM2ZcB4gEYTg=" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -28957,23 +29129,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://npm.zone51.tf/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://npm.zone51.tf/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "strip-ansi": { @@ -29290,6 +29464,38 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "through2": { + "version": "0.6.5", + "resolved": "https://npm.zone51.tf/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://npm.zone51.tf/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://npm.zone51.tf/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://npm.zone51.tf/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -29569,14 +29775,14 @@ "dev": true }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://npm.zone51.tf/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, @@ -30208,7 +30414,7 @@ }, "which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "resolved": "https://npm.zone51.tf/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { @@ -30313,8 +30519,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 9d26306a..e643c8d6 100644 --- a/package.json +++ b/package.json @@ -233,6 +233,7 @@ "webpack-merge": "^5.8.0" }, "dependencies": { + "@node-steam/vdf": "^2.2.0", "electron-debug": "^3.2.0", "electron-log": "^4.4.6", "electron-updater": "^4.6.5", @@ -241,6 +242,7 @@ "react-dom": "^18.0.0", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", + "regedit": "^5.1.1", "tailwind-scrollbar-hide": "^1.1.7" }, "devEngines": { diff --git a/src/main/constants.ts b/src/main/constants.ts new file mode 100644 index 00000000..dfe276d9 --- /dev/null +++ b/src/main/constants.ts @@ -0,0 +1,3 @@ +export const BS_EXECUTABLE = "Beat Saber.exe"; +export const BS_APP_ID = "620980"; +export const BS_DEPOT = "620981"; diff --git a/src/main/ipcs/bs-download-ipcs.ts b/src/main/ipcs/bs-download-ipcs.ts index ea3e713e..253aba39 100644 --- a/src/main/ipcs/bs-download-ipcs.ts +++ b/src/main/ipcs/bs-download-ipcs.ts @@ -12,7 +12,7 @@ import { ipcMain } from 'electron'; import path from 'path'; import { ChildProcessWithoutNullStreams, spawn } from 'child_process'; -import { createFolderIfNotExist } from '../utils'; +import { UtilsService } from '../services/utils.service'; export interface InitDownloadInfoInterface { @@ -26,14 +26,15 @@ export interface InitDownloadInfoInterface { } const DEPOT_DOWNLOADER_EXE = 'DepotDownloader.exe'; -const DEPOT_DOWNLOADER_PATH = path.join(path.dirname(__dirname), '..', 'extraResources', 'depot-downloader', DEPOT_DOWNLOADER_EXE); let PROCESS: ChildProcessWithoutNullStreams; ipcMain.on('bs-download.start', async (event, args: InitDownloadInfoInterface) => { + const DEPOT_DOWNLOADER_PATH = path.join(UtilsService.getInstance().getAssetsPath(), 'depot-downloader', DEPOT_DOWNLOADER_EXE); + console.log(UtilsService.getInstance().getAssetsPath()); console.log(DEPOT_DOWNLOADER_PATH); console.log(args.cwd); - createFolderIfNotExist(args.cwd); + UtilsService.getInstance().createFolderIfNotExist(args.cwd); PROCESS = spawn(DEPOT_DOWNLOADER_PATH, [`-app ${args.app}`, `-depot ${args.depot}`, `-manifest ${args.manifest}`, `-username ${args.username}`, `-dir ${args.folder}`, args.stay ? `-remember-password` : ''], {shell: true, cwd: args.cwd}); PROCESS.stdout.on('data', data => { diff --git a/src/main/ipcs/bs-launcher-ipcs.ts b/src/main/ipcs/bs-launcher-ipcs.ts new file mode 100644 index 00000000..8af2ef1f --- /dev/null +++ b/src/main/ipcs/bs-launcher-ipcs.ts @@ -0,0 +1,36 @@ +import { ipcMain } from 'electron'; +import path from "path"; +import { spawn } from 'child_process'; +import { UtilsService } from '../services/utils.service' +import { SteamService } from '../services/steam.service'; +import { BSVersionManagerService } from '../services/bs-version-manager.service'; +import { BSInstallerService } from '../services/bs-installer.service' +import { BS_EXECUTABLE, BS_APP_ID } from '../constants'; + +ipcMain.on('test-launch', async () => { + console.log("steam "+ UtilsService.getInstance().taskRunning('steam.exe')); + console.log(await SteamService.getInstance().getSteamGameFolder()); + console.log(BSInstallerService.getInstance().getBSInstallationFolder()); + console.log((await BSVersionManagerService.getInstance().loadBsVersions())); + return; + + const BS_EXE = "Beat Saber.exe" + const BS_PATH = path.join('C:', 'Users', 'Mathieu', 'Desktop', 'BSLegacyLauncher', 'Beat Saber') + let a = spawn(`\"${path.join(BS_PATH, BS_EXE)}\"`, ["-vrmode oculus", "--verbose"], { shell: true, cwd: BS_PATH, env: {...process.env ,"SteamAppId": "620980"}}); + a.stdout.on('data', data => console.log(data.toString())); + a.stderr.on('data', data => console.log(data.toString())); + a.on('message', m => console.log(m)); + a.on('error', err => console.log(err)); + a.on('exit', e => console.log(e)); + a.on('disconnect', (d: any) => console.log(d)) + console.log('oui'); +}); + +ipcMain.on('bs-launch.steam', async (event, args) => { + const steamService = SteamService.getInstance(); + if(!steamService.isGameInstalled(BS_APP_ID)){ event.reply('bs-launch.not-installed'); } + const beatSaberSteamFolder = path.join(await steamService.getSteamPath(), "Beat Saber"); + const beatSaberSteamExe = path.join(beatSaberSteamFolder, BS_EXECUTABLE); + const spawnProcess = spawn(`\"${beatSaberSteamExe}\"`, [], {shell: true, cwd: beatSaberSteamFolder, env: {...process.env, "SteamAppId": "620980"}}); + +}) diff --git a/src/main/ipcs/bs-version-ipcs.ts b/src/main/ipcs/bs-version-ipcs.ts new file mode 100644 index 00000000..80cc4d28 --- /dev/null +++ b/src/main/ipcs/bs-version-ipcs.ts @@ -0,0 +1,8 @@ +import { ipcMain } from 'electron'; +import { BSVersionManagerService } from '../services/bs-version-manager.service' + +ipcMain.on('bs-version.request', async (event, args) => { + + + +}); diff --git a/src/main/ipcs/custom-ipcs.ts b/src/main/ipcs/custom-ipcs.ts index d65a9fbf..8c1b02ed 100644 --- a/src/main/ipcs/custom-ipcs.ts +++ b/src/main/ipcs/custom-ipcs.ts @@ -1,2 +1,3 @@ import './bs-download-ipcs'; import './window-controls-ipcs'; +import './bs-launcher-ipcs'; diff --git a/src/main/ipcs/window-controls-ipcs.ts b/src/main/ipcs/window-controls-ipcs.ts index 092cd841..05a1fe34 100644 --- a/src/main/ipcs/window-controls-ipcs.ts +++ b/src/main/ipcs/window-controls-ipcs.ts @@ -1,19 +1,19 @@ import { ipcMain } from 'electron'; import { getMainWindow } from '../main'; -ipcMain.on('window.close', () => { +ipcMain.on('window.close', async () => { getMainWindow()?.close(); }); -ipcMain.on('window.maximize', () => { +ipcMain.on('window.maximize', async () => { getMainWindow()?.maximize(); }); -ipcMain.on('window.minimize', () => { +ipcMain.on('window.minimize', async () => { getMainWindow()?.minimize(); }); -ipcMain.on('window.reset', () => { +ipcMain.on('window.reset', async () => { console.log('aaaaaa'); getMainWindow()?.restore(); }); diff --git a/src/main/main.ts b/src/main/main.ts index 3549e453..9f56dd67 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -15,6 +15,7 @@ import log from 'electron-log'; import MenuBuilder from './menu'; import { resolveHtmlPath } from './util'; import './ipcs/custom-ipcs'; +import { UtilsService } from './services/utils.service'; export default class AppUpdater { constructor() { @@ -66,9 +67,9 @@ const createWindow = async () => { await installExtensions(); } - const RESOURCES_PATH = app.isPackaged - ? path.join(process.resourcesPath, 'assets') - : path.join(__dirname, '../../assets'); + const RESOURCES_PATH = app.isPackaged ? path.join(process.resourcesPath, 'assets') : path.join(__dirname, '../../assets'); + + UtilsService.getInstance().setAssetsPath(RESOURCES_PATH); const getAssetPath = (...paths: string[]): string => { return path.join(RESOURCES_PATH, ...paths); diff --git a/src/main/services/bs-installer.service.ts b/src/main/services/bs-installer.service.ts new file mode 100644 index 00000000..b9dca5e5 --- /dev/null +++ b/src/main/services/bs-installer.service.ts @@ -0,0 +1,29 @@ +import path from "path"; +import { BSVersionManagerService } from "./bs-version-manager.service"; +import { UtilsService } from "./utils.service"; + +export class BSInstallerService{ + + private static readonly INSTALLATION_FOLDER = "BSManager"; + + private static instance: BSInstallerService; + + private readonly utils: UtilsService = UtilsService.getInstance(); + + private installationFolder: string; + + private constructor(){ + this.installationFolder = path.join(this.utils.getUserDocumentsFolder(), BSInstallerService.INSTALLATION_FOLDER) + } + + public static getInstance(){ + if(!BSInstallerService.instance){ BSInstallerService.instance = new BSInstallerService(); } + return BSInstallerService.instance; + } + + public getBSInstallationFolder(): string{ return this.installationFolder; } + + + + +} diff --git a/src/main/services/bs-version-manager.service.ts b/src/main/services/bs-version-manager.service.ts new file mode 100644 index 00000000..bd750607 --- /dev/null +++ b/src/main/services/bs-version-manager.service.ts @@ -0,0 +1,38 @@ +import { get } from 'https' + +export class BSVersionManagerService{ + + private static readonly REMOTE_BS_VERSIONS_URL: string = "https://raw.githubusercontent.com/Zagrios/bs-manager/master/dynamic-resources/bs-versions.json" + + private static instance: BSVersionManagerService; + + private bsVersions: BSVersion[] = []; + + private constructor(){} + + public static getInstance(): BSVersionManagerService{ + if(!BSVersionManagerService.instance){ BSVersionManagerService.instance = new BSVersionManagerService() } + return BSVersionManagerService.instance; + } + + public loadBsVersions(): Promise{ + return new Promise((resolve, reject) => { + let body = '' + get(BSVersionManagerService.REMOTE_BS_VERSIONS_URL, (res) => { + res.on('data', chunk => body += chunk); + res.on('end', () => { + this.bsVersions = JSON.parse(body); + resolve(this.bsVersions); + }); + res.on('error', (err) => reject(err)) + }) + }) + } + + public getVersionDetailFromVersionNumber(version: string): BSVersion{ + return this.bsVersions.find(v => v.BSVersion === version); + } + +} + +export interface BSVersion { BSVersion: string, BSManifest: string, ReleaseURL: string, year: string } diff --git a/src/main/services/steam.service.ts b/src/main/services/steam.service.ts new file mode 100644 index 00000000..e87f0693 --- /dev/null +++ b/src/main/services/steam.service.ts @@ -0,0 +1,62 @@ +import { UtilsService } from "./utils.service"; +import regedit from 'regedit' +import path from "path"; +import { parse } from "@node-steam/vdf"; +import { readFile } from "fs/promises"; + +export class SteamService{ + + private static instance: SteamService; + + private readonly utils: UtilsService = UtilsService.getInstance(); + + private steamPath: string = ''; + + private constructor(){} + + public static getInstance(){ + if(!SteamService.instance){ SteamService.instance = new SteamService(); } + return SteamService.instance; + } + + public steamRunning(): boolean{ + return this.utils.taskRunning('steam.exe'); + } + + public async getSteamPath(): Promise{ + if(this.steamPath !== ''){ return this.steamPath; } + const [win32Res, win64Res] = await Promise.all([ + regedit.promisified.list(['HKLM\\SOFTWARE\\Valve\\Steam']), + regedit.promisified.list(['HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam']) + ]); + const [win32, win64] = [win32Res["HKLM\\SOFTWARE\\Valve\\Steam"], win64Res["HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam"]]; + let res = '' + if(win64.values.InstallPath.value){ res = win64.values.InstallPath.value as string; } + else if(win32.values.InstallPath.value){ res = win32.values.InstallPath.value as string; } + this.steamPath = res; + return this.steamPath; + } + + public async getSteamGameFolder(): Promise{ + const steamFolder = await this.getSteamPath(); + return path.join(steamFolder, 'common'); + } + + public async isGameInstalled(gameId: string): Promise{ + const steamPath = await this.getSteamPath(); + let libraryFolders: any = path.join(steamPath, 'steamapps', 'libraryfolders.vdf'); + + if(!this.utils.pathExist(libraryFolders)){ return false; } + libraryFolders = parse(await readFile(libraryFolders, {encoding: 'utf-8'})); + + if(!libraryFolders.libraryfolders){ return false; } + libraryFolders = libraryFolders.libraryfolders + + for(const libKey in Object.keys(libraryFolders)){ + if(!libraryFolders[libKey]["apps"]){ continue; } + if(libraryFolders[libKey]["apps"][gameId]){ return true }; + } + return false; + } + +} diff --git a/src/main/services/utils.service.ts b/src/main/services/utils.service.ts new file mode 100644 index 00000000..eff6e15b --- /dev/null +++ b/src/main/services/utils.service.ts @@ -0,0 +1,46 @@ +import { existsSync, mkdirSync } from "fs"; +import { spawnSync } from "child_process"; +import { homedir } from "os"; +import path from "path"; + +export class UtilsService{ + + private static instance: UtilsService; + + private assetsPath: string = ''; + + private constructor(){} + + public static getInstance(){ + if(!this.instance){ UtilsService.instance = new UtilsService(); } + return UtilsService.instance; + } + + public setAssetsPath(path: string): void{ this.assetsPath = path; } + public getAssetsPath(): string{ return this.assetsPath; } + + //à supprimer + public folderExist(path: string): boolean{ return existsSync(path); } + + public pathExist(path: string): boolean{ return existsSync(path); } + + public createFolderIfNotExist(path: string): void{ + if(!this.folderExist(path)){ mkdirSync(path); } + } + + public taskRunning(task: string): boolean{ + const tasks = spawnSync('tasklist').stdout.toString(); + return tasks.includes(task); + } + + public getUserFolder(){ return homedir(); } + + public getUserDocumentsFolder(): string{ + return path.join(this.getUserFolder(), 'Documents'); + } + + + + + +} diff --git a/src/main/utils.ts b/src/main/utils.ts deleted file mode 100644 index 106f2317..00000000 --- a/src/main/utils.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function createFolderIfNotExist(path: string){ - const [existsSync, mkdirSync] = [require('fs').existsSync, require('fs').mkdirSync]; - if (!existsSync(path)){ mkdirSync(path); } -} \ No newline at end of file diff --git a/src/renderer/index.tsx b/src/renderer/index.tsx index 5ed9a5e5..bcd48b6a 100644 --- a/src/renderer/index.tsx +++ b/src/renderer/index.tsx @@ -1,5 +1,5 @@ import { createRoot } from 'react-dom/client'; -import { InitDownloadInfoInterface } from 'main/ipcs/bs-download-ipcs'; +import { InitDownloadInfoInterface } from '../main/ipcs/bs-download-ipcs'; import App from './App'; import 'tailwindcss/tailwind.css'; import './index.css' @@ -8,8 +8,14 @@ const container = document.getElementById('root')!; const root = createRoot(container); root.render(); +// setTimeout(() => { +// window.electron.ipcRenderer.sendMessage('bs-download.start', {app: '620980', depot: '620981', manifest: '6222769774084748916', stay: true, username: 'lekilleur618', folder: 'test2', cwd: 'C:\\test'} as InitDownloadInfoInterface); +// }, 5000); + +// window.electron.ipcRenderer.on('bs-download.ask-password', () => console.log('omg popup password')); + setTimeout(() => { - window.electron.ipcRenderer.sendMessage('bs-download.start', {app: '620980', depot: '620981', manifest: '6222769774084748916', stay: true, username: 'lekilleur618', folder: 'test2', cwd: 'C:\\test'} as InitDownloadInfoInterface); + window.electron.ipcRenderer.sendMessage('test-launch', null); }, 5000); window.electron.ipcRenderer.on('bs-download.ask-password', () => console.log('omg popup password')); diff --git a/tsconfig.json b/tsconfig.json index 2b1c9873..65e3579b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,8 @@ "allowSyntheticDefaultImports": true, "resolveJsonModule": true, "allowJs": true, - "outDir": "release/app/dist" + "outDir": "release/app/dist", + "strictNullChecks": false }, "exclude": ["test", "release/build", "release/app/dist", ".erb/dll"] }