diff --git a/Cargo.lock b/Cargo.lock
index 3a7078c..15f5f2a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -7,6 +7,9 @@ name = "CraftX"
version = "0.1.0"
dependencies = [
"dirs",
+ "rand 0.9.0",
+ "serde",
+ "serde_json",
"tokio",
"winit",
"wry",
@@ -841,6 +844,18 @@ dependencies = [
"wasi 0.11.0+wasi-snapshot-preview1",
]
+[[package]]
+name = "getrandom"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.13.3+wasi-0.2.2",
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "gimli"
version = "0.31.1"
@@ -2147,6 +2162,17 @@ dependencies = [
"rand_core 0.6.4",
]
+[[package]]
+name = "rand"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
+dependencies = [
+ "rand_chacha 0.9.0",
+ "rand_core 0.9.3",
+ "zerocopy 0.8.23",
+]
+
[[package]]
name = "rand_chacha"
version = "0.2.2"
@@ -2167,6 +2193,16 @@ dependencies = [
"rand_core 0.6.4",
]
+[[package]]
+name = "rand_chacha"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.9.3",
+]
+
[[package]]
name = "rand_core"
version = "0.5.1"
@@ -2185,6 +2221,15 @@ dependencies = [
"getrandom 0.2.15",
]
+[[package]]
+name = "rand_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
+dependencies = [
+ "getrandom 0.3.1",
+]
+
[[package]]
name = "rand_hc"
version = "0.2.0"
@@ -2272,6 +2317,12 @@ version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
+[[package]]
+name = "ryu"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
[[package]]
name = "same-file"
version = "1.0.6"
@@ -2352,6 +2403,18 @@ dependencies = [
"syn 2.0.100",
]
+[[package]]
+name = "serde_json"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+dependencies = [
+ "itoa 1.0.15",
+ "memchr",
+ "ryu",
+ "serde",
+]
+
[[package]]
name = "serde_spanned"
version = "0.6.8"
@@ -2894,6 +2957,15 @@ version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+[[package]]
+name = "wasi"
+version = "0.13.3+wasi-0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
+dependencies = [
+ "wit-bindgen-rt",
+]
+
[[package]]
name = "wasm-bindgen"
version = "0.2.100"
@@ -3581,6 +3653,15 @@ dependencies = [
"memchr",
]
+[[package]]
+name = "wit-bindgen-rt"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
+dependencies = [
+ "bitflags 2.9.0",
+]
+
[[package]]
name = "write16"
version = "1.0.0"
diff --git a/Cargo.toml b/Cargo.toml
index 1abd903..3601a06 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,3 +8,6 @@ winit = "0.30.9"
wry = "0.50.4"
tokio = { version = "1", features = ["full"] }
dirs = "6.0.0"
+rand = "0.9.0"
+serde = { version = "1.0.219", features = ["derive"] }
+serde_json = "1.0"
\ No newline at end of file
diff --git a/src/config.rs b/src/config.rs
index 2ac7d77..8d0d344 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -6,7 +6,6 @@ pub struct LauncherConfig {
}
impl LauncherConfig {
-
pub fn set_portable(&mut self, is_portable: bool) {
self.is_portable = is_portable;
}
@@ -17,10 +16,18 @@ impl LauncherConfig {
false => get_absolute_launcher_dir()
}
}
+
+ pub fn config_path(&self) -> PathBuf {
+ let mut p = self.launcher_dir();
+ p.push("config.toml");
+ p
+ }
}
-fn get_relative_launcher_dir() -> PathBuf {
- std::env::current_dir().unwrap()
+pub fn get_relative_launcher_dir() -> PathBuf {
+ let mut p = std::env::current_dir().unwrap();
+ p.push("xcraft");
+ p
}
fn get_absolute_launcher_dir() -> PathBuf {
diff --git a/src/launcher.rs b/src/launcher.rs
new file mode 100644
index 0000000..19fa603
--- /dev/null
+++ b/src/launcher.rs
@@ -0,0 +1,44 @@
+use crate::config::LauncherConfig;
+
+
+#[derive(Default)]
+pub struct Launcher {
+ pub config: LauncherConfig
+}
+
+impl Launcher {
+
+ pub fn is_portable(&self) -> bool {
+ crate::config::get_relative_launcher_dir().exists()
+ }
+
+ pub fn is_config_exist(&self) -> bool {
+ self.config.config_path().exists()
+ }
+
+ pub fn init_dirs(&self) {
+ let root = self.config.launcher_dir();
+ std::fs::create_dir_all(&root);
+ // instances assets libraries config.toml servers credentials
+ let mut instances = root.clone();
+ instances.push("instances");
+
+ let mut assets = root.clone();
+ assets.push("assets");
+
+ let mut libraries = root.clone();
+ libraries.push("libraries");
+
+ let mut servers = root.clone();
+ servers.push("servers");
+
+ let mut credentials = root.clone();
+ credentials.push("credentials");
+
+ std::fs::create_dir_all(&instances);
+ std::fs::create_dir_all(&assets);
+ std::fs::create_dir_all(&libraries);
+ std::fs::create_dir_all(&servers);
+ std::fs::create_dir_all(&credentials);
+ }
+}
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index 9d65881..28d190b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,8 @@
use std::sync::{Arc, Mutex};
use config::LauncherConfig;
+use launcher::Launcher;
+use serde::{Deserialize, Serialize};
use tokio::runtime::Runtime;
use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender};
use winit::application::ApplicationHandler;
@@ -11,15 +13,17 @@ use winit::window::{Window, WindowId};
use winit::event_loop::ActiveEventLoop;
use wry::dpi::LogicalSize;
use wry::http::{Request, Response};
-use wry::{WebView, WebViewBuilder, WebViewBuilderExtWindows};
+use wry::{RequestAsyncResponder, WebView, WebViewBuilder, WebViewBuilderExtWindows};
mod config;
+mod launcher;
+mod util;
-static SENDER: Mutex