Compare commits

..

21 Commits

Author SHA1 Message Date
SpikeHD
fa38a22117 version bump 2022-08-25 20:19:44 -07:00
SpikeHD
a7914406b4 get ALL mods at once 2022-08-25 20:18:58 -07:00
SpikeHD
57c1a7800c write game path to migoto config autmatically 2022-08-25 20:08:44 -07:00
SpikeHD
9426937a62 cleanup 2022-08-25 19:05:51 -07:00
SpikeHD
96d69d9ff6 bump initial wait for game to 10 seconds 2022-08-25 19:04:08 -07:00
SpikeHD
defc1b43bd fix all sorts of zip stuff 2022-08-25 18:57:24 -07:00
SpikeHD
01fce477ef Merge branch 'main' of github.com:Grasscutters/Cultivation 2022-08-23 23:52:21 -07:00
SpikeHD
2f610ce0af version bump 2022-08-23 23:52:11 -07:00
SpikeHD
d9772d9ffb resource link update 2022-08-23 23:47:52 -07:00
SpikeHD
93097db5cc Merge pull request #58 from Untitled/main
Chinese Simplified Translations Update
2022-08-04 10:55:53 -07:00
SpikeHD
c06aa9f885 Merge pull request #57 from Kimi898246/patch-3
Traditional Chinese | Translation Patches
2022-08-04 10:55:21 -07:00
ChapterII
f7bcad0a90 Update chs.json
Updated translations
2022-08-04 15:04:27 +08:00
Kimi
7120f846f7 Traditional Chinese | Translation Patches
hi
2022-08-04 02:18:21 +08:00
SpikeHD
f6ed37d2e4 Merge pull request #53 from DasIschBims/main
Update de.json
2022-08-02 17:21:54 -07:00
DasIschBims
99b210b3be Update de.json 2022-07-30 13:49:13 +02:00
SpikeHD
7d52766c07 Merge pull request #51 from TotalyNotOndre/patch-1
Update ru.json
2022-07-28 12:18:13 -07:00
Abdul
212d974ac6 Fixed missing separators 2022-07-28 20:23:55 +03:00
SpikeHD
a6e06e3005 revert to 50 per page 2022-07-27 21:52:26 -07:00
Abdul
56c1f2dcc2 Update ru.json
- Added and translated missing localization strings
2022-07-28 03:33:22 +03:00
SpikeHD
a843888cb8 cleanup 2022-07-27 17:01:55 -07:00
SpikeHD
281bfb5cea cheeky key path fix 2022-07-26 22:30:25 -07:00
19 changed files with 268 additions and 83 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "cultivation", "name": "cultivation",
"version": "1.0.5", "version": "1.0.7",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@tauri-apps/api": "^1.0.0-rc.5", "@tauri-apps/api": "^1.0.0-rc.5",

41
src-tauri/Cargo.lock generated
View File

@@ -26,6 +26,17 @@ dependencies = [
"opaque-debug", "opaque-debug",
] ]
[[package]]
name = "ahash"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
"getrandom 0.2.7",
"once_cell",
"version_check",
]
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "0.7.18" version = "0.7.18"
@@ -725,6 +736,7 @@ dependencies = [
"regex", "regex",
"registry", "registry",
"reqwest", "reqwest",
"rust-ini",
"rustls-pemfile", "rustls-pemfile",
"serde", "serde",
"serde_json", "serde_json",
@@ -888,6 +900,12 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "dlv-list"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257"
[[package]] [[package]]
name = "dtoa" name = "dtoa"
version = "0.4.8" version = "0.4.8"
@@ -1481,6 +1499,9 @@ name = "hashbrown"
version = "0.12.3" version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
dependencies = [
"ahash",
]
[[package]] [[package]]
name = "heck" name = "heck"
@@ -2451,6 +2472,16 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "ordered-multimap"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a"
dependencies = [
"dlv-list",
"hashbrown",
]
[[package]] [[package]]
name = "os_info" name = "os_info"
version = "3.4.0" version = "3.4.0"
@@ -3223,6 +3254,16 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "rust-ini"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df"
dependencies = [
"cfg-if 1.0.0",
"ordered-multimap",
]
[[package]] [[package]]
name = "rustc-serialize" name = "rustc-serialize"
version = "0.3.24" version = "0.3.24"

View File

@@ -61,6 +61,7 @@ regex = "1"
# other # other
file_diff = "1.0.0" file_diff = "1.0.0"
rust-ini = "0.18.0"
[features] [features]
# by default Tauri runs in production mode # by default Tauri runs in production mode

View File

@@ -11,13 +11,21 @@
"files_extracting": "文件解压中:" "files_extracting": "文件解压中:"
}, },
"options": { "options": {
"enabled": "已启用",
"disabled": "已禁用",
"game_path": "选择游戏安装路径",
"game_executable": "选择游戏可执行文件", "game_executable": "选择游戏可执行文件",
"recover_metadata": "紧急情况下恢复元数据文件",
"grasscutter_jar": "选择 Grasscutter JAR 文件", "grasscutter_jar": "选择 Grasscutter JAR 文件",
"java_path": "设置自定义 Java 路径", "toggle_encryption": "启用加密",
"install_certificate": "安装代理证书",
"java_path": "选择自定义 Java 路径",
"grasscutter_with_game": "随游戏自动启动 Grasscutter", "grasscutter_with_game": "随游戏自动启动 Grasscutter",
"language": "语言", "language": "选择语言",
"background": "设置自定义背景(链接或文件)", "background": "设置自定义背景(链接或文件)",
"theme": "设置主题" "theme": "设置主题",
"patch_metadata": "自动修改元数据",
"use_proxy": "使用内置代理"
}, },
"downloads": { "downloads": {
"grasscutter_stable_data": "下载 Grasscutter 稳定版数据", "grasscutter_stable_data": "下载 Grasscutter 稳定版数据",
@@ -28,7 +36,8 @@
"grasscutter_latest": "下载 Grasscutter 开发版", "grasscutter_latest": "下载 Grasscutter 开发版",
"grasscutter_stable_update": "更新 Grasscutter 稳定版", "grasscutter_stable_update": "更新 Grasscutter 稳定版",
"grasscutter_latest_update": "更新 Grasscutter 开发版", "grasscutter_latest_update": "更新 Grasscutter 开发版",
"resources": "下载 Grasscutter 资源" "resources": "下载 Grasscutter 资源",
"game": "下载游戏"
}, },
"download_status": { "download_status": {
"downloading": "下载中", "downloading": "下载中",
@@ -40,10 +49,11 @@
"components": { "components": {
"select_file": "选择文件或文件夹...", "select_file": "选择文件或文件夹...",
"select_folder": "选择文件夹...", "select_folder": "选择文件夹...",
"download": "下载" "download": "下载",
"install": "安装"
}, },
"news": { "news": {
"latest_commits": "最近的PR", "latest_commits": "最近提交",
"latest_version": "最新版本" "latest_version": "最新版本"
}, },
"help": { "help": {
@@ -53,6 +63,17 @@
"gc_dev_jar": "下载最新的 Grasscutter 开发版,包括 JAR 文件和数据。", "gc_dev_jar": "下载最新的 Grasscutter 开发版,包括 JAR 文件和数据。",
"gc_stable_data": "下载当前的 Grasscutter 稳定版数据,不包括 JAR 文件。此选项在更新时有帮助。", "gc_stable_data": "下载当前的 Grasscutter 稳定版数据,不包括 JAR 文件。此选项在更新时有帮助。",
"gc_dev_data": "下载最新的 Grasscutter 开发版数据,不包括 JAR 文件。此选项在更新时有帮助。", "gc_dev_data": "下载最新的 Grasscutter 开发版数据,不包括 JAR 文件。此选项在更新时有帮助。",
"resources": "资源文件在运行 Grasscutter 服务器时是必要的。此选项在已经存在资源文件时不可选。" "resources": "资源文件在运行 Grasscutter 服务器时是必要的。此选项在已经存在资源文件时不可选。",
"emergency_metadata": "在出现意外情况时,自动将元数据恢复至原始版本",
"use_proxy": "使用 Cultivation 的内置代理。除非你使用 Fiddler 等软件,否则应启用此项。",
"patch_metadata": "自动修改和恢复游戏元数据。除非要游玩旧版本/非官方版本,抑或你已经手动修改了元数据,否则应启用此项。"
},
"swag": {
"akebi_name": "Akebi",
"migoto_name": "Migoto",
"reshade_name": "Reshade",
"akebi": "选择 Akebi 可执行文件",
"migoto": "选择 3DMigoto 可执行文件",
"reshade": "选择 Reshade 注入器"
} }
} }

View File

@@ -13,14 +13,19 @@
"options": { "options": {
"enabled": "已啟用", "enabled": "已啟用",
"disabled": "未啟用", "disabled": "未啟用",
"game_path": "選擇遊戲安裝路徑",
"game_executable": "選擇遊戲執行檔", "game_executable": "選擇遊戲執行檔",
"recover_metadata": "緊急恢復Metadata",
"grasscutter_jar": "選擇伺服器JAR檔案", "grasscutter_jar": "選擇伺服器JAR檔案",
"toggle_encryption": "設定加密", "toggle_encryption": "設定加密",
"java_path": "設定自定義Java路徑", "install_certificate": "安裝代理憑證",
"java_path": "選擇自定義Java路徑",
"grasscutter_with_game": "伴隨遊戲一起啟動Grasscutter", "grasscutter_with_game": "伴隨遊戲一起啟動Grasscutter",
"language": "語言", "language": "語言",
"background": "設定自定義背景(網址或檔案)", "background": "選擇自定義背景(網址或檔案)",
"theme": "設定主題" "theme": "選擇主題",
"patch_metadata": "自動修補Metadata",
"use_proxy": "使用內建代理伺服器"
}, },
"downloads": { "downloads": {
"grasscutter_stable_data": "下載Grasscutter穩定版數據Data", "grasscutter_stable_data": "下載Grasscutter穩定版數據Data",
@@ -31,7 +36,8 @@
"grasscutter_latest": "下載Grasscutter開發板", "grasscutter_latest": "下載Grasscutter開發板",
"grasscutter_stable_update": "更新Grasscutter穩定版", "grasscutter_stable_update": "更新Grasscutter穩定版",
"grasscutter_latest_update": "更新Grasscutter開發板", "grasscutter_latest_update": "更新Grasscutter開發板",
"resources": "下載Grasscutter資源Resources" "resources": "下載Grasscutter資源Resources",
"game": "下載遊戲"
}, },
"download_status": { "download_status": {
"downloading": "下載中", "downloading": "下載中",
@@ -43,7 +49,8 @@
"components": { "components": {
"select_file": "選擇檔案或資料夾...", "select_file": "選擇檔案或資料夾...",
"select_folder": "選擇資料夾...", "select_folder": "選擇資料夾...",
"download": "下載" "download": "下載",
"install": "安裝"
}, },
"news": { "news": {
"latest_commits": "最近的PR", "latest_commits": "最近的PR",
@@ -51,11 +58,23 @@
}, },
"help": { "help": {
"port_help_text": "確保這是Dispatch伺服器端口不是遊戲伺服器端口。 大部分伺服器的端口都是443。", "port_help_text": "確保這是Dispatch伺服器端口不是遊戲伺服器端口。 大部分伺服器的端口都是443。",
"game_help_text": "不需要另外一個遊戲備份來使用Grasscutter。這是給想要降級到2.6或者還沒安裝遊戲的人使用的。", "game_help_text": "不需要另外一個遊戲備份來使用Grasscutter。這是給想要降級到2.6或者還沒安裝遊戲的人使用的。",
"gc_stable_jar": "下載當前的Grasscutter穩定版本包括JAR答案還有資料文件。", "gc_stable_jar": "下載當前的Grasscutter穩定版本包括JAR答案還有資料文件。",
"gc_dev_jar": "下載當前的Grasscutter穩定版本資料文件其中不會附帶JAR文件。這個選項在更新時很有用。", "gc_dev_jar": "下載當前的Grasscutter穩定版本資料文件其中不會附帶JAR文件。這個選項在更新時很有用。",
"gc_stable_data": "下載當前最新的Grasscutter開發版本資料文件其中不會附帶JAR文件。這個選項在更新時很有用。", "gc_stable_data": "下載當前最新的Grasscutter開發版本資料文件其中不會附帶JAR文件。這個選項在更新時很有用。",
"gc_dev_data": "下載當前最新的Grasscutter開發版本的資料文件其中不會附帶JAR文件。這個選項在更新時很有用。", "gc_dev_data": "下載當前最新的Grasscutter開發版本的資料文件其中不會附帶JAR文件。這個選項在更新時很有用。",
"resources": "資源文件在架設一個Grasscutter伺服器時是必要的。 這個選項會在你已經有裡面有檔案的資源資料夾時不可選。" "encryption": "在正常情況下,此選項應該被關閉。",
"resources": "資源文件在架設一個Grasscutter伺服器時是必要的。 這個選項會在您已經有裡面有檔案的資源資料夾時不可選。",
"emergency_metadata": "一旦有東西出了問題此選項可以把您的Metadata恢復成官方版本。",
"use_proxy": "使用Cultivation內建的代理伺服器。此選項應該被啟用除非你使用其他的代理伺服器。",
"patch_metadata": "自動修補和恢復Metadata。除非您的遊戲版本是舊的或者是非官方的此選項應該被啟用。"
},
"swag": {
"akebi_name": "Akebi",
"migoto_name": "Migoto",
"reshade_name": "Reshade",
"akebi": "選擇Akebi執行檔",
"migoto": "選擇3DMigoto執行檔",
"reshade": "選擇Reshade注入器"
} }
} }

View File

@@ -13,14 +13,17 @@
"options": { "options": {
"enabled": "Aktiviert", "enabled": "Aktiviert",
"disabled": "Deaktiviert", "disabled": "Deaktiviert",
"game_path": "Spielpfad",
"game_executable": "Spiel Datei auswählen", "game_executable": "Spiel Datei auswählen",
"recover_metadata": "Notfall Wiederherstellung der Metadaten",
"grasscutter_jar": "Grasscuter JAR auswählen", "grasscutter_jar": "Grasscuter JAR auswählen",
"toggle_encryption": "Verschlüsselung umschalten", "toggle_encryption": "Verschlüsselung umschalten",
"java_path": "Benutzerdefinierten Java Pfad setzen", "java_path": "Benutzerdefinierten Java Pfad setzen",
"grasscutter_with_game": "Grasscutter automatisch mit dem Spiel starten", "grasscutter_with_game": "Grasscutter automatisch mit dem Spiel starten",
"language": "Sprache auswählen", "language": "Sprache auswählen",
"background": "Benutzerdefinierten Hintergrund festlegen (link oder bild)", "background": "Benutzerdefinierten Hintergrund festlegen (link oder bild)",
"theme": "Theme auswählen" "theme": "Theme auswählen",
"patch_metadata": "Metadaten automatisch patchen"
}, },
"downloads": { "downloads": {
"grasscutter_stable_data": "Stabile Grasscutter Daten herunterladen", "grasscutter_stable_data": "Stabile Grasscutter Daten herunterladen",
@@ -31,7 +34,8 @@
"grasscutter_latest": "Aktuellste Grasscutter Version herunterladen", "grasscutter_latest": "Aktuellste Grasscutter Version herunterladen",
"grasscutter_stable_update": "Stabile Grasscutter Version aktualisieren", "grasscutter_stable_update": "Stabile Grasscutter Version aktualisieren",
"grasscutter_latest_update": "Aktuellste Grasscutter Version aktualisieren", "grasscutter_latest_update": "Aktuellste Grasscutter Version aktualisieren",
"resources": "Grasscutter Ressourcen herunterladen" "resources": "Grasscutter Ressourcen herunterladen",
"game": "Spiel herunterladen"
}, },
"download_status": { "download_status": {
"downloading": "Lädt herunter", "downloading": "Lädt herunter",
@@ -43,7 +47,8 @@
"components": { "components": {
"select_file": "Datei oder Ordner auswählen...", "select_file": "Datei oder Ordner auswählen...",
"select_folder": "Ordner auswählen...", "select_folder": "Ordner auswählen...",
"download": "Herunterladen" "download": "Herunterladen",
"install": "Installieren"
}, },
"news": { "news": {
"latest_commits": "Letzte Commits", "latest_commits": "Letzte Commits",
@@ -56,6 +61,17 @@
"gc_dev_jar": "Laden Sie die neueste Grasscutter-Entwicklungsversion herunter, welche eine Jar-Datei und Datendateien enthält.", "gc_dev_jar": "Laden Sie die neueste Grasscutter-Entwicklungsversion herunter, welche eine Jar-Datei und Datendateien enthält.",
"gc_stable_data": "Laden Sie die stabilen Grasscutter Daten herunter, welche keine Jar-Datei enthalten. Dies ist nützlich zum Aktualisieren.", "gc_stable_data": "Laden Sie die stabilen Grasscutter Daten herunter, welche keine Jar-Datei enthalten. Dies ist nützlich zum Aktualisieren.",
"gc_dev_data": "Laden Sie die neuesten Grasscutter-Entwicklungsdateien herunter, welche keine Jar-Datei enthält. Dies ist nützlich zum Aktualisieren.", "gc_dev_data": "Laden Sie die neuesten Grasscutter-Entwicklungsdateien herunter, welche keine Jar-Datei enthält. Dies ist nützlich zum Aktualisieren.",
"resources": "Diese werden auch benötigt, um einen Grasscutter-Server auszuführen. Diese Schaltfläche ist grau, wenn Sie einen bestehenden Ressourcenordner mit Inhalten haben" "resources": "Diese werden auch benötigt, um einen Grasscutter-Server auszuführen. Diese Schaltfläche ist grau, wenn Sie einen bestehenden Ressourcenordner mit Inhalten haben",
"emergency_metadata": "Im Fall, dass etwas schief laufen sollte, kannst du deine Metadaten auf die letzte offizielle Version zurücksetzen",
"use_proxy": "Nutze den internen Proxy von Cultivation. Du solltest dies aktivieren, es sei denn du nutzt Programme wie Fiddler",
"patch_metadata": "Patche und aktualisiere deine Metadaten automatisch. Solange du nicht mit einer alten/nicht offiziellen Version spielst oder deine Metadaten manuell gepatcht hast, sollte dies aktiviert sein."
},
"swag": {
"akebi_name": "Akebi",
"migoto_name": "Migoto",
"reshade_name": "Reshade",
"akebi": "Akebi.exe festlegen",
"migoto": "Migoto.exe festlegen",
"reshade": "Reshade injector festlegen"
} }
} }

View File

@@ -13,14 +13,19 @@
"options": { "options": {
"enabled": "Включено", "enabled": "Включено",
"disabled": "Выключено", "disabled": "Выключено",
"game_path": "Установить путь к файлам игры",
"game_executable": "Установить исполняемый файл игры", "game_executable": "Установить исполняемый файл игры",
"recover_metadata": "Принудительное восстановление Метаданных",
"grasscutter_jar": "Установить Grasscutter JAR", "grasscutter_jar": "Установить Grasscutter JAR",
"toggle_encryption": "Переключить шифрование", "toggle_encryption": "Переключить шифрование",
"install_certificate": "Установить сертификат для работы Прокси",
"java_path": "Установить пользовательский путь Java", "java_path": "Установить пользовательский путь Java",
"grasscutter_with_game": "Автоматически запускать Grasscutter вместе с игрой", "grasscutter_with_game": "Автоматически запускать Grasscutter вместе с игрой",
"language": "Установить язык", "language": "Установить язык",
"background": "Установить свой фон (ссылка или файл)", "background": "Установить свой фон (ссылка или файл)",
"theme": "Установить тему" "theme": "Установить тему",
"patch_metadata": "Автоматический патч Метаданных при запуске",
"use_proxy": "Использовать встроенный Прокси"
}, },
"downloads": { "downloads": {
"grasscutter_stable_data": "Скачать стабильные данные Grasscutter", "grasscutter_stable_data": "Скачать стабильные данные Grasscutter",
@@ -31,7 +36,8 @@
"grasscutter_latest": "Скачать последнюю версию Grasscutter", "grasscutter_latest": "Скачать последнюю версию Grasscutter",
"grasscutter_stable_update": "Обновить стабильную версию Grasscutter", "grasscutter_stable_update": "Обновить стабильную версию Grasscutter",
"grasscutter_latest_update": "Обновить последнюю версию Grasscutter", "grasscutter_latest_update": "Обновить последнюю версию Grasscutter",
"resources": "Скачать ресурсы Grasscutter" "resources": "Скачать ресурсы Grasscutter",
"game": "Скачать Игру"
}, },
"download_status": { "download_status": {
"downloading": "Скачивание", "downloading": "Скачивание",
@@ -43,7 +49,8 @@
"components": { "components": {
"select_file": "Выберите файл или папку...", "select_file": "Выберите файл или папку...",
"select_folder": "Выберите папку...", "select_folder": "Выберите папку...",
"download": "Скачать" "download": "Скачать",
"install": "Установить"
}, },
"news": { "news": {
"latest_commits": "Последние коммиты", "latest_commits": "Последние коммиты",
@@ -56,6 +63,18 @@
"gc_dev_jar": "Скачать последнюю версию для разработки Grasscutter, которая содержит jar файл и данные.", "gc_dev_jar": "Скачать последнюю версию для разработки Grasscutter, которая содержит jar файл и данные.",
"gc_stable_data": "Скачать стабильные данные Grasscutter, в которой нету jar файла. Это полезно для обновления.", "gc_stable_data": "Скачать стабильные данные Grasscutter, в которой нету jar файла. Это полезно для обновления.",
"gc_dev_data": "Скачать последнюю версию для разработки Grasscutter, в которой нету jar файла. Это полезно для обновления.", "gc_dev_data": "Скачать последнюю версию для разработки Grasscutter, в которой нету jar файла. Это полезно для обновления.",
"resources": "Это необходимо для запуска сервера Grasscutter. Эта кнопка будет серой, если у Вас уже есть не пустая папка с ресурсами." "encryption": "Обычно это должно быть выключено.",
"resources": "Это необходимо для запуска сервера Grasscutter. Эта кнопка будет серой, если у Вас уже есть не пустая папка с ресурсами.",
"emergency_metadata": "Если что-то пошло не так, восстановит Метаданные до последней официальной версии.",
"use_proxy": "Использовать встроенный Прокси. Отключите если используете Fiddler или подобную программу",
"patch_metadata": "Патчит и восстанавливает Метаданные автоматически. Если вы не играете на старых/модифицированых версиях, или сами в ручную патчите Метаданные, эта опция должна быть включена."
},
"swag": {
"akebi_name": "Akebi",
"migoto_name": "Migoto",
"reshade_name": "Reshade",
"akebi": "Путь к исполняемому файлу Akebi",
"migoto": "Путь к исполняемому файлу 3DMigoto ",
"reshade": "Путь к инжектору Reshade"
} }
} }

View File

@@ -18,7 +18,14 @@ pub fn rename(path: String, new_name: String) {
let path_replaced = &path.replace(&new_path.split('/').last().unwrap(), &new_name); let path_replaced = &path.replace(&new_path.split('/').last().unwrap(), &new_name);
fs::rename(path, &path_replaced).unwrap(); match fs::rename(&path, &path_replaced) {
Ok(_) => {
println!("Renamed {} to {}", &path, path_replaced);
}
Err(e) => {
println!("Error: {}", e);
}
};
} }
#[tauri::command] #[tauri::command]

View File

@@ -15,11 +15,11 @@ pub async fn get_download_links(mod_id: String) -> String {
} }
#[tauri::command] #[tauri::command]
pub async fn list_submissions(mode: String) -> String { pub async fn list_submissions(mode: String, page: String) -> String {
let res = web::query( let res = web::query(
format!( format!(
"{}/apiv9/Util/Game/Submissions?_idGameRow=8552&_nPage=1&_nPerpage=50&_sMode={}", "{}/apiv9/Util/Game/Submissions?_idGameRow=8552&_nPage={}&_nPerpage=50&_sMode={}",
SITE_URL, mode SITE_URL, page, mode
) )
.as_str(), .as_str(),
) )

View File

@@ -24,6 +24,11 @@ mod web;
static WATCH_GAME_PROCESS: Lazy<Mutex<String>> = Lazy::new(|| Mutex::new(String::new())); static WATCH_GAME_PROCESS: Lazy<Mutex<String>> = Lazy::new(|| Mutex::new(String::new()));
fn main() { fn main() {
// Always set CWD to the location of the executable.
let mut exe_path = std::env::current_exe().unwrap();
exe_path.pop();
std::env::set_current_dir(&exe_path).unwrap();
tauri::Builder::default() tauri::Builder::default()
.invoke_handler(tauri::generate_handler![ .invoke_handler(tauri::generate_handler![
enable_process_watcher, enable_process_watcher,
@@ -40,6 +45,7 @@ fn main() {
system_helpers::open_in_browser, system_helpers::open_in_browser,
system_helpers::install_location, system_helpers::install_location,
system_helpers::is_elevated, system_helpers::is_elevated,
system_helpers::set_migoto_target,
proxy::set_proxy_addr, proxy::set_proxy_addr,
proxy::generate_ca_files, proxy::generate_ca_files,
unzip::unzip, unzip::unzip,
@@ -88,6 +94,9 @@ fn enable_process_watcher(window: tauri::Window, process: String) {
println!("Starting process watcher..."); println!("Starting process watcher...");
thread::spawn(move || { thread::spawn(move || {
// Initial sleep for 8 seconds, since running 20 different injectors or whatever can take a while
std::thread::sleep(std::time::Duration::from_secs(10));
let mut system = System::new_all(); let mut system = System::new_all();
loop { loop {
@@ -189,7 +198,8 @@ async fn get_bg_file(bg_path: String, appdata: String) -> String {
let response_data: APIQuery = match serde_json::from_str(&query) { let response_data: APIQuery = match serde_json::from_str(&query) {
Ok(data) => data, Ok(data) => data,
Err(e) => { Err(e) => {
println!("Failed to parse response: {}", e); println!("Failed to get bg file response: {}", e);
println!("^ please stop reporting this as an error it's so annoying LMFAO");
return "".to_string(); return "".to_string();
} }
}; };

View File

@@ -111,7 +111,12 @@ fn replace_keys(data: &[u8]) -> Vec<u8> {
fn replace_rsa_key(old_data: &str, to_replace: &str, file_name: &str) -> String { fn replace_rsa_key(old_data: &str, to_replace: &str, file_name: &str) -> String {
// Read dispatch key file // Read dispatch key file
unsafe { unsafe {
let mut new_key_file = match File::open(&("keys/".to_owned() + file_name)) { // Get key folder from exe path
let mut exe_path = std::env::current_exe().unwrap();
exe_path.pop();
let key_folder = exe_path.to_str().unwrap().to_string();
let mut new_key_file = match File::open(format!("{}/keys/{}", key_folder, file_name)) {
Ok(file) => file, Ok(file) => file,
Err(e) => { Err(e) => {
println!("Failed to open keys/{}: {}", file_name, e); println!("Failed to open keys/{}: {}", file_name, e);
@@ -140,6 +145,5 @@ fn encrypt_metadata(old_data: &[u8]) -> Vec<u8> {
} }
fn do_vecs_match<T: PartialEq>(a: &Vec<T>, b: &Vec<T>) -> bool { fn do_vecs_match<T: PartialEq>(a: &Vec<T>, b: &Vec<T>) -> bool {
let matching = a.iter().zip(b.iter()).filter(|&(a, b)| a == b).count(); a == b
matching == a.len() && matching == b.len()
} }

View File

@@ -1,4 +1,6 @@
use duct::cmd; use duct::cmd;
use ini::Ini;
use std::path::PathBuf;
#[tauri::command] #[tauri::command]
pub fn run_program(path: String, args: Option<String>) { pub fn run_program(path: String, args: Option<String>) {
@@ -88,6 +90,43 @@ pub fn install_location() -> String {
return exe_path.to_str().unwrap().to_string(); return exe_path.to_str().unwrap().to_string();
} }
#[tauri::command]
pub fn set_migoto_target(path: String, migoto_path: String) -> bool {
let pathbuf = PathBuf::from(path);
let mut migoto_pathbuf = PathBuf::from(migoto_path);
migoto_pathbuf.pop();
migoto_pathbuf.push("d3dx.ini");
let mut conf = match Ini::load_from_file(&migoto_pathbuf) {
Ok(c) => {
println!("Loaded migoto ini");
c
}
Err(e) => {
println!("Error loading migoto config: {}", e);
return false;
}
};
// Set options
conf
.with_section(Some("Loader"))
.set("target", pathbuf.to_str().unwrap());
// Write file
match conf.write_to_file(&migoto_pathbuf) {
Ok(_) => {
println!("Wrote config!");
true
}
Err(e) => {
println!("Error writing config: {}", e);
false
}
}
}
#[cfg(windows)] #[cfg(windows)]
#[tauri::command] #[tauri::command]
pub fn is_elevated() -> bool { pub fn is_elevated() -> bool {

View File

@@ -63,28 +63,17 @@ pub fn unzip(
println!("Is rar file? {}", zipfile.ends_with(".rar")); println!("Is rar file? {}", zipfile.ends_with(".rar"));
let mut name = "".into(); let name;
let success;
// If file ends in zip, OR is unknown, extract as zip, otherwise extract as rar // If file ends in zip, OR is unknown, extract as zip, otherwise extract as rar
if zipfile.ends_with(".rar") { if zipfile.ends_with(".rar") {
extract_rar( success = extract_rar(&zipfile, &f, &full_path, top_level.unwrap_or(true));
&window,
&zipfile,
&f,
&full_path,
top_level.unwrap_or(false),
);
let archive = Archive::new(zipfile.clone()); let archive = Archive::new(zipfile.clone());
name = archive.list().unwrap().next().unwrap().unwrap().filename; name = archive.list().unwrap().next().unwrap().unwrap().filename;
} else { } else {
extract_zip( success = extract_zip(&zipfile, &f, &full_path, top_level.unwrap_or(true));
&window,
&zipfile,
&f,
&full_path,
top_level.unwrap_or(false),
);
// Get the name of the inenr file in the zip file // Get the name of the inenr file in the zip file
let mut zip = zip::ZipArchive::new(&f).unwrap(); let mut zip = zip::ZipArchive::new(&f).unwrap();
@@ -92,6 +81,14 @@ pub fn unzip(
name = file.name().to_string().clone(); name = file.name().to_string().clone();
} }
if !success {
let mut res_hash = std::collections::HashMap::new();
res_hash.insert("path".to_string(), zipfile.to_string());
window.emit("download_error", &res_hash).unwrap();
}
// If the contents is a jar file, emit that we have extracted a new jar file // If the contents is a jar file, emit that we have extracted a new jar file
if name.ends_with(".jar") { if name.ends_with(".jar") {
window window
@@ -129,13 +126,7 @@ pub fn unzip(
}); });
} }
fn extract_rar( fn extract_rar(rarfile: &String, _f: &File, full_path: &path::PathBuf, _top_level: bool) -> bool {
window: &tauri::Window,
rarfile: &String,
_f: &File,
full_path: &path::PathBuf,
_top_level: bool,
) {
let archive = Archive::new(rarfile.clone()); let archive = Archive::new(rarfile.clone());
let mut open_archive = archive let mut open_archive = archive
@@ -148,41 +139,29 @@ fn extract_rar(
"Extracted rar file to: {}", "Extracted rar file to: {}",
full_path.to_str().unwrap_or("Error") full_path.to_str().unwrap_or("Error")
); );
true
} }
Err(e) => { Err(e) => {
println!("Failed to extract rar file: {}", e); println!("Failed to extract rar file: {}", e);
let mut res_hash = std::collections::HashMap::new(); false
res_hash.insert("error".to_string(), e.to_string());
res_hash.insert("path".to_string(), rarfile.to_string());
window.emit("download_error", &res_hash).unwrap();
} }
} }
} }
fn extract_zip( fn extract_zip(_zipfile: &String, f: &File, full_path: &path::PathBuf, top_level: bool) -> bool {
window: &tauri::Window,
zipfile: &String,
f: &File,
full_path: &path::PathBuf,
top_level: bool,
) {
match zip_extract::extract(f, full_path, top_level) { match zip_extract::extract(f, full_path, top_level) {
Ok(_) => { Ok(_) => {
println!( println!(
"Extracted zip file to: {}", "Extracted zip file to: {}",
full_path.to_str().unwrap_or("Error") full_path.to_str().unwrap_or("Error")
); );
true
} }
Err(e) => { Err(e) => {
println!("Failed to extract zip file: {}", e); println!("Failed to extract zip file: {}", e);
let mut res_hash = std::collections::HashMap::new(); false
res_hash.insert("error".to_string(), e.to_string());
res_hash.insert("path".to_string(), zipfile.to_string());
window.emit("download_error", &res_hash).unwrap();
} }
}; }
} }

View File

@@ -7,7 +7,7 @@
}, },
"package": { "package": {
"productName": "Cultivation", "productName": "Cultivation",
"version": "1.0.5" "version": "1.0.7"
}, },
"tauri": { "tauri": {
"allowlist": { "allowlist": {

View File

@@ -17,7 +17,7 @@ const STABLE_REPO_DOWNLOAD = 'https://github.com/Grasscutters/Grasscutter/archiv
const DEV_REPO_DOWNLOAD = 'https://github.com/Grasscutters/Grasscutter/archive/refs/heads/development.zip' const DEV_REPO_DOWNLOAD = 'https://github.com/Grasscutters/Grasscutter/archive/refs/heads/development.zip'
const STABLE_DOWNLOAD = 'https://nightly.link/Grasscutters/Grasscutter/workflows/build/stable/Grasscutter.zip' const STABLE_DOWNLOAD = 'https://nightly.link/Grasscutters/Grasscutter/workflows/build/stable/Grasscutter.zip'
const DEV_DOWNLOAD = 'https://nightly.link/Grasscutters/Grasscutter/workflows/build/development/Grasscutter.zip' const DEV_DOWNLOAD = 'https://nightly.link/Grasscutters/Grasscutter/workflows/build/development/Grasscutter.zip'
const RESOURCES_DOWNLOAD = 'https://gitlab.com/yukiz/GrasscutterResources/-/archive/2.8/GrasscutterResources-2.8.zip' const RESOURCES_DOWNLOAD = 'https://gitlab.com/yukiz/GrasscutterResources/-/archive/3.0/GrasscutterResources-3.0.zip'
interface IProps { interface IProps {
closeFn: () => void closeFn: () => void

View File

@@ -151,6 +151,12 @@ export default class Options extends React.Component<IProps, IState> {
this.setState({ this.setState({
migoto_path: value, migoto_path: value,
}) })
// Set game exe in Migoto ini
invoke('set_migoto_target', {
path: this.state.game_install_path,
migotoPath: value,
})
} }
setReshade(value: string) { setReshade(value: string) {

View File

@@ -78,13 +78,16 @@ export default class DownloadHandler {
// Extraction events // Extraction events
listen('extract_start', ({ payload }) => { listen('extract_start', ({ payload }) => {
// Find the download that is no extracting and set it's status as such // Find the download that is no extracting and set it's status as such
const index = this.downloads.findIndex((download) => download.path === payload) // @ts-expect-error Too lazy to make an interface for payloads rn
const index = this.downloads.findIndex((download) => download.path === payload.file)
this.downloads[index].status = 'extracting' this.downloads[index].status = 'extracting'
}) })
listen('extract_end', ({ payload }) => { listen('extract_end', ({ payload }) => {
console.log(payload)
// Find the download that is no extracting and set it's status as such // Find the download that is no extracting and set it's status as such
const index = this.downloads.findIndex((download) => download.path === payload) // @ts-expect-error Too lazy to make an interface for payloads rn
const index = this.downloads.findIndex((download) => download.path === payload.file)
this.downloads[index].status = 'finished' this.downloads[index].status = 'finished'
}) })
} }

View File

@@ -118,13 +118,30 @@ interface ModDownload {
} }
export async function getMods(mode: string) { export async function getMods(mode: string) {
const resp = JSON.parse( let modList: GamebananaResponse[] = []
await invoke('list_submissions', { let hadMods = true
mode, let page = 1
})
)
return formatGamebananaData(resp) while (hadMods) {
const resp = JSON.parse(
await invoke('list_submissions', {
mode,
page: '' + page,
})
)
if (resp.length === 0) hadMods = false
modList = [...modList, ...resp]
page++
console.log(page)
console.log(resp)
}
console.log(modList)
return formatGamebananaData(modList)
} }
export async function formatGamebananaData(obj: GamebananaResponse[]) { export async function formatGamebananaData(obj: GamebananaResponse[]) {

View File

@@ -21,6 +21,9 @@ export function unzip(
}) })
listen('extract_end', ({ payload }) => { listen('extract_end', ({ payload }) => {
console.log(payload)
console.log(file)
// @ts-expect-error Payload is an object // @ts-expect-error Payload is an object
if (payload?.file === file) { if (payload?.file === file) {
resolve(payload as UnzipPayload) resolve(payload as UnzipPayload)