Compare commits

..

14 Commits

Author SHA1 Message Date
SpikeHD
6db219e32e Merge pull request #109 from Drevoed/chore/bump-deps
chore: bump rust deps
2022-11-17 20:09:08 -08:00
Kirill
5bd4f3ff6e chore: bump rust deps
Bump rust dependencies and apply cargo fmt/clippy fixes
2022-11-17 23:41:08 +03:00
SpikeHD
6206b6762a cleanup 2022-10-01 16:12:32 -07:00
SpikeHD
258c656815 Merge pull request #97 from pfyy/main
make passwordKey.txt use CRLF
2022-10-01 15:55:02 -07:00
pfyy
68404f5e39 make passwordKey.txt use CRLF 2022-10-01 11:28:00 +08:00
SpikeHD
8c75541939 Merge pull request #95 from pfyy/main
fix proxy uri (add query)
2022-09-30 14:36:33 -07:00
pfyy
aa32782179 fix proxy uri (add query) 2022-09-27 19:36:39 +08:00
Magix
2cda891f02 THE GREATEST CULTIVATION UPDATE OF ALL TIME
part one of removing deprecated code
2022-09-24 00:08:12 -04:00
SpikeHD
9c8ed852d1 Merge branch 'main' of github.com:Grasscutters/Cultivation 2022-09-18 17:54:20 -07:00
SpikeHD
e75f65ab56 --no-admin and fix migoto setting 2022-09-18 17:54:05 -07:00
SpikeHD
bdeda36043 Merge pull request #92 from Grasscutters/dependabot/cargo/src-tauri/tauri-1.0.6
Bump tauri from 1.0.4 to 1.0.6 in /src-tauri
2022-09-16 23:57:04 -07:00
dependabot[bot]
151e7c3919 Bump tauri from 1.0.4 to 1.0.6 in /src-tauri
Bumps [tauri](https://github.com/tauri-apps/tauri) from 1.0.4 to 1.0.6.
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](https://github.com/tauri-apps/tauri/compare/tauri-v1.0.4...tauri-v1.0.6)

---
updated-dependencies:
- dependency-name: tauri
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-16 19:33:19 +00:00
SpikeHD
e6365b5592 Merge pull request #91 from trollerr/patch-1
Vietnamese Translations Update
2022-09-12 09:14:46 -07:00
Trollerr
ed76a086b6 Vietnamese Translations Update 2022-09-12 13:09:15 +07:00
23 changed files with 797 additions and 892 deletions

4
.gitattributes vendored
View File

@@ -1 +1,3 @@
* text=auto eol=lf
* text=auto eol=lf
src-tauri/keys/* binary

1
.gitignore vendored
View File

@@ -10,6 +10,7 @@
# production
/build
.idea
# misc
.DS_Store

8
.idea/.gitignore generated vendored
View File

@@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

14
.idea/cultivation.iml generated
View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src-tauri/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
<excludeFolder url="file://$MODULE_DIR$/src-tauri/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

7
.idea/discord.xml generated
View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="PROJECT_FILES" />
<option name="description" value="" />
</component>
</project>

View File

@@ -1,40 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="HtmlUnknownBooleanAttribute" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="HttpUrlsUsage" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredUrls">
<list>
<option value="http://localhost" />
<option value="http://127.0.0.1" />
<option value="http://0.0.0.0" />
<option value="http://www.w3.org/" />
<option value="http://json-schema.org/draft" />
<option value="http://java.sun.com/" />
<option value="http://xmlns.jcp.org/" />
<option value="http://javafx.com/javafx/" />
<option value="http://javafx.com/fxml" />
<option value="http://maven.apache.org/xsd/" />
<option value="http://maven.apache.org/POM/" />
<option value="http://www.springframework.org/schema/" />
<option value="http://www.springframework.org/tags" />
<option value="http://www.springframework.org/security/tags" />
<option value="http://www.thymeleaf.org" />
<option value="http://www.jboss.org/j2ee/schema/" />
<option value="http://www.jboss.com/xml/ns/" />
<option value="http://www.ibm.com/webservices/xsd" />
<option value="http://activemq.apache.org/schema/" />
<option value="http://schema.cloudfoundry.org/spring/" />
<option value="http://schemas.xmlsoap.org/" />
<option value="http://cxf.apache.org/schemas/" />
<option value="http://primefaces.org/ui" />
<option value="http://tiles.apache.org/" />
<option value="http://api.grasscutter.io" />
<option value="http://api.grasscutters.xyz" />
</list>
</option>
</inspection_tool>
<inspection_tool class="JSIgnoredPromiseFromCall" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
</profile>
</component>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/cultivation.iml" filepath="$PROJECT_DIR$/.idea/cultivation.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@@ -27,7 +27,7 @@
"test": "react-scripts test",
"eject": "react-scripts eject",
"tauri": "tauri",
"start:dev": "tauri dev",
"start:dev": "tauri dev -- -- --no-admin",
"format": "cargo fmt --manifest-path ./src-tauri/Cargo.toml --all && yarn prettier --write --cache --loglevel warn .",
"lint": "cargo clippy --manifest-path ./src-tauri/Cargo.toml --no-default-features && yarn tsc --noEmit && yarn eslint src",
"lint:fix": "cargo clippy --manifest-path ./src-tauri/Cargo.toml --no-default-features --fix --allow-dirty && yarn tsc --noEmit && yarn eslint --fix src",

1388
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -12,33 +12,33 @@ rust-version = "1.57"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
tauri-build = { version = "1.0.0-rc.8", features = [] }
tauri-build = { version = "1.2.0", features = [] }
cc = "1.0"
[target.'cfg(windows)'.dependencies]
is_elevated = "0.1.2"
registry = "1.2.1"
registry = "1.2.2"
[target.'cfg(unix)'.dependencies]
sudo = "0.6.0"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "1.0.0-rc.9", features = ["api-all"] }
tauri = { version = "1.2.0", features = ["api-all"] }
# Access system process info.
sysinfo = "0.24.6"
sysinfo = "0.26.7"
# ZIP-archive library.
zip-extract = "0.1.1"
unrar = "0.4.4"
zip = "0.6.2"
zip = "0.6.3"
# For creating a "global" downloads list.
once_cell = "1.13.0"
once_cell = "1.16.0"
# Program opener.
open = "3.0.2"
open = "3.0.3"
duct = "0.13.5"
# Serialization.
@@ -46,15 +46,15 @@ serde_json = "1"
# Dependencies for the HTTP(S) proxy.
http = "0.2"
hudsucker = "0.17.2"
tracing = "0.1.21"
tokio-rustls = "0.23.0"
tokio-tungstenite = "0.17.0"
tokio = { version = "1.18.2", features = ["signal"] }
rustls-pemfile = "1.0.0"
reqwest = { version = "0.11.3", features = ["stream"] }
futures-util = "0.3.14"
rcgen = { version = "0.9", features = ["x509-parser"] }
hudsucker = "0.18.0"
tracing = "0.1.37"
tokio-rustls = "0.23.4"
tokio-tungstenite = "0.17.2"
tokio = { version = "1.21.2", features = ["signal"] }
rustls-pemfile = "1.0.1"
reqwest = { version = "0.11.13", features = ["stream"] }
futures-util = "0.3.25"
rcgen = { version = "0.10", features = ["x509-parser"] }
# metadata stuff
regex = "1"

View File

@@ -1,7 +1,7 @@
<RSAKeyValue>
<Exponent>AQAB</Exponent>
<Modulus>yytg/H9lz7Lm0XcA8LMqIyXPVNApYTcSepT4VDLB4qqqFC3s
/Huv8vN7zA/P4uoREIu8KMenADFk7uwrZSxoMWwJgn6A7sbAt1cqAaUXB
9J4NzhL0x3AFTiHEQbw86hRvm2VGkbA5sWnr0NZw8SGBBY+EODwNIt51G
dBA7eoUQU=</Modulus>
<RSAKeyValue>
<Exponent>AQAB</Exponent>
<Modulus>yytg/H9lz7Lm0XcA8LMqIyXPVNApYTcSepT4VDLB4qqqFC3s
/Huv8vN7zA/P4uoREIu8KMenADFk7uwrZSxoMWwJgn6A7sbAt1cqAaUXB
9J4NzhL0x3AFTiHEQbw86hRvm2VGkbA5sWnr0NZw8SGBBY+EODwNIt51G
dBA7eoUQU=</Modulus>
</RSAKeyValue>

View File

@@ -14,18 +14,21 @@
"enabled": "Bật",
"disabled": "Tắt",
"game_path": "Đường dẫn cài game",
"game_command": "Lệnh khởi chạy game",
"game_executable": "Tập tin thực thi game",
"recover_metadata": "Khôi phục Metadata khẩn cấp",
"recover_metadata": "Khôi phục metadata khẩn cấp",
"grasscutter_jar": "Tập tin JAR Grasscutter",
"toggle_encryption": "Bật/tắt mã hóa",
"install_certificate": "Cài chứng chỉ proxy",
"java_path": "Đường dẫn Java tùy chỉnh",
"grasscutter_with_game": "Tự động chạy Grasscutter cùng với game",
"language": "Chọn ngôn ngữ",
"language": "Ngôn ngữ",
"background": "Hình nền tùy chỉnh (liên kết hoặc tập tin hình ảnh)",
"theme": "Giao diện",
"patch_metadata": "Tự động sửa Metadata",
"use_proxy": "Sử dụng proxy nội bộ"
"patch_metadata": "Tự động vá metadata",
"use_proxy": "Sử dụng proxy nội bộ",
"wipe_login": "Tẩy sạch cache đăng nhập",
"horny_mode": "Chế độ hứng tình"
},
"downloads": {
"grasscutter_stable_data": "Tải dữ liệu Grasscutter bản ổn định",
@@ -40,17 +43,17 @@
"game": "Tải game"
},
"download_status": {
"downloading": "Đang tải xuống",
"downloading": "Đang tải",
"extracting": "Đang giải nén",
"error": "Lỗi",
"finished": "Hoàn thành",
"finished": "Đã hoàn thành",
"stopped": "Đã dừng"
},
"components": {
"select_file": "Chọn tập tin hoặc thư mục...",
"select_folder": "Chọn thư mục...",
"download": "Tải xuống",
"install": "Cài đặt"
"download": "Tải",
"install": "Cài"
},
"news": {
"latest_commits": "Thay Đổi Gần Đây",
@@ -62,11 +65,19 @@
"gc_stable_jar": "Tải xuống phiên bản ổn định của Grasscutter, bao gồm tập tin jar và các tệp dữ liệu.",
"gc_dev_jar": "Tải xuống phiên bản phát triển mới nhất của Grasscutter, bao gồm tập tin jar và các tệp dữ liệu.",
"gc_stable_data": "Tải xuống tệp dữ liệu phiên bản ổn định hiện hành của Grasscutter. Bản này không đi kèm với tập tin jar, hữu dụng khi muốn cập nhật.",
"gc_dev_data": "Tải xuống tệp dữ liệu phiên bản mới nhất của Grasscutter. Bản này không đi kèm với tập tin jar, hữu dụng khi muốn cập nhật.",
"resources": "Chúng được yêu cầu để chạy máy chủ Grasscutter. Nút này sẽ có màu xám nếu bạn đã có sẵn một thư mục tài nguyên có nội dung bên trong"
"gc_dev_data": "Tải xuống tệp dữ liệu phiên bản mới nhất của Grasscutter. Bản này không đi kèm với tập tin jar, hữu dụng khi muốn cập nhật.",
"encryption": "Mục này nên được tắt.",
"resources": "Tài nguyên được yêu cầu để chạy máy chủ Grasscutter. Nút này sẽ có màu xám nếu bạn đã có sẵn một thư mục tài nguyên (resources) có nội dung bên trong",
"emergency_metadata": "Trong trường hợp gặp vấn đề, khôi phục lại metadata về phiên bản chính thức mới nhất.",
"use_proxy": "Sử dụng proxy nội bộ của Cultivation. Nên bật tùy chọn này trừ khi bạn đang sử dụng một ứng dụng khác, như Fiddler",
"patch_metadata": "Tự động vá và sửa lại metadata của game. Tùy chọn này nên được bật trừ khi bạn đang sử dụng phiên bản cũ, phiên bản không chính thức hoặc bạn đã tự vá metadata rồi."
},
"swag": {
"akebi_name": "Akebi",
"migoto_name": "Migoto",
"reshade_name": "Reshade",
"akebi": "Tập tin thực thi Akebi",
"migoto": "Tập tin thực thi 3dMigoto"
"migoto": "Tập tin thực thi 3dMigoto",
"reshade": "Tập tin inject Reshade"
}
}

View File

@@ -1,6 +1,3 @@
use std::process::exit;
use std::process::Command;
#[cfg(windows)]
pub fn reopen_as_admin() {
let install = std::env::current_exe().unwrap();

View File

@@ -17,9 +17,9 @@ pub fn rename(path: String, new_name: String) {
new_path = path.replace('\\', "/");
}
let path_replaced = &path.replace(&new_path.split('/').last().unwrap(), &new_name);
let path_replaced = &path.replace(new_path.split('/').last().unwrap(), &new_name);
match fs::rename(&path, &path_replaced) {
match fs::rename(&path, path_replaced) {
Ok(_) => {
println!("Renamed {} to {}", &path, path_replaced);
}
@@ -68,7 +68,7 @@ pub fn copy_file(path: String, new_path: String) -> bool {
}
// Copy old to new
match std::fs::copy(&path_buf, format!("{}/{}", new_path, filename)) {
match std::fs::copy(path_buf, format!("{}/{}", new_path, filename)) {
Ok(_) => true,
Err(e) => {
println!("Failed to copy file: {}", e);
@@ -98,7 +98,7 @@ pub fn copy_file_with_new_name(path: String, new_path: String, new_name: String)
new_path_buf.push(new_name);
// Copy old to new
match std::fs::copy(&path_buf, &new_path_buf) {
match std::fs::copy(path_buf, &new_path_buf) {
Ok(_) => true,
Err(e) => {
println!("Failed to copy file: {}", e);
@@ -147,7 +147,7 @@ pub fn write_file(path: String, contents: String) {
let path_buf = PathBuf::from(&path);
// Create file if it exists, otherwise just open and rewrite
let mut file = match fs::File::create(&path_buf) {
let mut file = match fs::File::create(path_buf) {
Ok(file) => file,
Err(e) => {
println!("Failed to open file: {}", e);

View File

@@ -9,7 +9,7 @@ pub async fn get_lang(window: tauri::Window, lang: String) -> String {
let lang_path: PathBuf = [&install_location(), "lang", &format!("{}.json", lang)]
.iter()
.collect();
match std::fs::read_to_string(&lang_path) {
match std::fs::read_to_string(lang_path) {
Ok(x) => x,
Err(e) => {
emit_lang_err(window, format!("Failed to read language file: {}", e));

View File

@@ -2,6 +2,7 @@
all(not(debug_assertions), target_os = "windows"),
windows_subsystem = "windows"
)]
#![deny(clippy::all, unused)]
use file_helpers::dir_exists;
use once_cell::sync::Lazy;
@@ -13,9 +14,9 @@ use tauri::api::path::data_dir;
use tauri::async_runtime::block_on;
use std::thread;
use structs::APIQuery;
use sysinfo::{System, SystemExt};
#[cfg(windows)]
use crate::admin::reopen_as_admin;
mod admin;
@@ -25,7 +26,6 @@ mod gamebanana;
mod lang;
mod metadata_patcher;
mod proxy;
mod structs;
mod system_helpers;
mod unzip;
mod web;
@@ -42,7 +42,7 @@ fn has_arg(args: &[String], arg: &str) -> bool {
async fn arg_handler(args: &[String]) {
if has_arg(args, "--proxy") {
let mut pathbuf = tauri::api::path::data_dir().unwrap();
let mut pathbuf = data_dir().unwrap();
pathbuf.push("cultivation");
pathbuf.push("ca");
@@ -51,17 +51,20 @@ async fn arg_handler(args: &[String]) {
}
fn main() {
if !is_elevated() {
let args: Vec<String> = std::env::args().collect();
if !is_elevated() && !has_arg(&args, "--no-admin") {
println!("===============================================================================");
println!("You running as a non-elevated user. Some stuff will almost definitely not work.");
println!("===============================================================================");
#[cfg(windows)]
reopen_as_admin();
}
// Setup datadir/cultivation just in case something went funky and it wasn't made
if !dir_exists(data_dir().unwrap().join("cultivation").to_str().unwrap()) {
fs::create_dir_all(&data_dir().unwrap().join("cultivation")).unwrap();
fs::create_dir_all(data_dir().unwrap().join("cultivation")).unwrap();
}
// Always set CWD to the location of the executable.
@@ -69,8 +72,6 @@ fn main() {
exe_path.pop();
std::env::set_current_dir(&exe_path).unwrap();
let args: Vec<String> = std::env::args().collect();
block_on(arg_handler(&args));
// For disabled GUI
@@ -87,7 +88,6 @@ fn main() {
connect,
disconnect,
req_get,
get_bg_file,
is_game_running,
get_theme_list,
system_helpers::run_command,
@@ -251,54 +251,3 @@ async fn get_theme_list(data_dir: String) -> Vec<HashMap<String, String>> {
themes
}
#[tauri::command]
// TODO: Replace with downloading the background file & saving it.
async fn get_bg_file(bg_path: String, appdata: String) -> String {
let copy_loc = appdata;
let query = web::query("https://api.grasscutter.io/cultivation/query").await;
let response_data: APIQuery = match serde_json::from_str(&query) {
Ok(data) => data,
Err(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();
}
};
let file_name = response_data.bg_file.to_string();
// First we see if the file already exists in our local bg folder.
if file_helpers::dir_exists(format!("{}\\bg\\{}", copy_loc, file_name).as_str()) {
return format!("{}\\{}", copy_loc, response_data.bg_file.as_str());
}
// Now we check if the bg folder, which is one directory above the game_path, exists.
let bg_img_path = format!("{}\\{}", &bg_path, &file_name);
// If it doesn't, then we do not have backgrounds to grab.
if !file_helpers::dir_exists(&bg_path) {
return "".to_string();
}
// BG folder does exist, lets see if the image exists.
if !file_helpers::dir_exists(&bg_img_path) {
// Image doesn't exist
return "".to_string();
}
// The image exists, lets copy it to our local '\bg' folder.
let bg_img_path_local = format!("{}\\bg\\{}", copy_loc, file_name.as_str());
match std::fs::copy(bg_img_path, bg_img_path_local) {
Ok(_) => {
// Copy was successful, lets return true.
format!("{}\\{}", copy_loc, response_data.bg_file)
}
Err(e) => {
// Copy failed, lets return false
println!("Failed to copy background image: {}", e);
"".to_string()
}
}
}

View File

@@ -39,7 +39,7 @@ pub fn patch_metadata(metadata_folder: &str) -> bool {
let mut file = match OpenOptions::new()
.create(true)
.write(true)
.open(&(metadata_folder.to_owned() + "\\global-metadata-patched.dat"))
.open(metadata_folder.to_owned() + "\\global-metadata-patched.dat")
{
Ok(file) => file,
Err(e) => {

View File

@@ -52,12 +52,13 @@ impl HttpHandler for ProxyHandler {
mut request: Request<Body>,
) -> RequestOrResponse {
let uri = request.uri().to_string();
let uri_path = request.uri().path();
let uri_path_and_query = request.uri().path_and_query().unwrap().as_str();
if uri.contains("hoyoverse.com") || uri.contains("mihoyo.com") || uri.contains("yuanshen.com") {
// Create new URI.
let new_uri =
Uri::from_str(format!("{}{}", SERVER.lock().unwrap(), uri_path).as_str()).unwrap();
Uri::from_str(format!("{}{}", SERVER.lock().unwrap(), uri_path_and_query).as_str())
.unwrap();
// Set request URI to the new one.
*request.uri_mut() = new_uri;
}

View File

@@ -1,8 +0,0 @@
#![allow(non_snake_case)]
use serde::Deserialize;
#[derive(Deserialize)]
pub(crate) struct APIQuery {
pub bg_file: String,
}

View File

@@ -27,7 +27,7 @@ pub fn run_program_relative(path: String, args: Option<String>) {
open::that(format!("{} {}", &path, args.unwrap_or_else(|| "".into()))).unwrap_or(());
// Restore the original working directory
std::env::set_current_dir(&cwd).unwrap();
std::env::set_current_dir(cwd).unwrap();
}
#[tauri::command]
@@ -52,7 +52,7 @@ pub fn run_command(program: &str, args: Vec<&str>, relative: Option<bool>) {
cmd(prog, args).run().unwrap();
// Restore the original working directory
std::env::set_current_dir(&cwd).unwrap();
std::env::set_current_dir(cwd).unwrap();
});
}
@@ -115,7 +115,7 @@ pub fn set_migoto_target(path: String, migoto_path: String) -> bool {
// Set options
conf
.with_section(Some("Loader"))
.set("target", pathbuf.to_str().unwrap());
.set("target", pathbuf.file_name().unwrap().to_str().unwrap());
// Write file
match conf.write_to_file(&migoto_pathbuf) {

View File

@@ -5,7 +5,6 @@ import DownloadHandler from '../utils/download'
import { getConfigOption } from '../utils/configuration'
import { getTheme, loadTheme } from '../utils/themes'
import { convertFileSrc, invoke } from '@tauri-apps/api/tauri'
import { dataDir } from '@tauri-apps/api/path'
import { Main } from './Main'
import { Mods } from './Mods'
@@ -28,10 +27,6 @@ class App extends React.Component<Readonly<unknown>, IState> {
}
async componentDidMount() {
const game_exe = await getConfigOption('game_install_path')
const game_path = game_exe?.substring(0, game_exe.replace(/\\/g, '/').lastIndexOf('/')) || ''
const root_path = game_path?.substring(0, game_path.replace(/\\/g, '/').lastIndexOf('/')) || ''
// Load a theme if it exists
const theme = await getConfigOption('theme')
if (theme && theme !== 'default') {
@@ -42,23 +37,7 @@ class App extends React.Component<Readonly<unknown>, IState> {
// Get custom bg AFTER theme is loaded !! important !!
const custom_bg = await getConfigOption('customBackground')
if (!custom_bg || !/png|jpg|jpeg$/.test(custom_bg)) {
if (game_path) {
// Get the bg by invoking, then set the background to that bg.
const bgLoc: string = await invoke('get_bg_file', {
bgPath: root_path,
appdata: await dataDir(),
})
bgLoc &&
this.setState(
{
bgFile: bgLoc,
},
this.forceUpdate
)
}
} else {
if (custom_bg) {
const isUrl = /^http(s)?:\/\//gm.test(custom_bg)
if (!isUrl) {

View File

@@ -83,7 +83,13 @@ export class ModList extends React.Component<IProps, IState> {
<div className="ModListInner">
{this.props.mode === 'installed'
? this.state.installedList?.map((mod) => (
<ModTile path={mod.path} mod={mod.info} key={mod.info.name} onClick={this.downloadMod} />
<ModTile
horny={this.state.horny}
path={mod.path}
mod={mod.info}
key={mod.info.name}
onClick={this.downloadMod}
/>
))
: this.state.modList?.map((mod: ModData) => (
<ModTile horny={this.state.horny} mod={mod} key={mod.id} onClick={this.downloadMod} />