0.5.4
- implemented core library 1.4.0
This commit is contained in:
parent
f244a20b42
commit
78bb708247
3 changed files with 59 additions and 29 deletions
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "anime-launcher-sdk"
|
name = "anime-launcher-sdk"
|
||||||
version = "0.5.3"
|
version = "0.5.4"
|
||||||
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
@ -10,7 +10,7 @@ edition = "2021"
|
||||||
anime-game-core = { path = "anime-game-core", features = ["genshin", "all"] }
|
anime-game-core = { path = "anime-game-core", features = ["genshin", "all"] }
|
||||||
|
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
dirs = "4.0.0"
|
dirs = "5.0.0"
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
cached = { version = "0.42", features = ["proc_macro"] }
|
cached = { version = "0.42", features = ["proc_macro"] }
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit e0245c40871f585781fd504fb14fd657b26cb4af
|
Subproject commit c0bf96ae96c8b5be37b5dc043d45c6819a23eac2
|
|
@ -7,7 +7,6 @@ use wincompatlib::prelude::*;
|
||||||
|
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
use crate::consts;
|
|
||||||
use super::components::wine::WincompatlibWine;
|
use super::components::wine::WincompatlibWine;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
@ -20,7 +19,7 @@ pub enum LauncherState {
|
||||||
voices: Vec<VersionDiff>
|
voices: Vec<VersionDiff>
|
||||||
},
|
},
|
||||||
|
|
||||||
PatchAvailable(Patch),
|
MainPatchAvailable(UnityPlayerPatch),
|
||||||
|
|
||||||
#[cfg(feature = "components")]
|
#[cfg(feature = "components")]
|
||||||
WineNotInstalled,
|
WineNotInstalled,
|
||||||
|
@ -59,43 +58,48 @@ pub enum StateUpdating {
|
||||||
Patch
|
Patch
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub struct LauncherStateParams<F: Fn(StateUpdating)> {
|
||||||
|
pub wine_prefix: PathBuf,
|
||||||
|
pub game_path: PathBuf,
|
||||||
|
|
||||||
|
pub selected_voices: Vec<VoiceLocale>,
|
||||||
|
|
||||||
|
pub patch_servers: Vec<String>,
|
||||||
|
pub patch_folder: PathBuf,
|
||||||
|
pub use_xlua_patch: bool,
|
||||||
|
|
||||||
|
pub status_updater: F
|
||||||
|
}
|
||||||
|
|
||||||
impl LauncherState {
|
impl LauncherState {
|
||||||
#[tracing::instrument(level = "debug", skip(status), ret)]
|
pub fn get<F: Fn(StateUpdating)>(params: LauncherStateParams<F>) -> anyhow::Result<Self> {
|
||||||
pub fn get<T, F, S>(wine_prefix: T, game_path: T, voices: Vec<VoiceLocale>, patch_servers: Vec<S>, status: F) -> anyhow::Result<Self>
|
|
||||||
where
|
|
||||||
T: Into<PathBuf> + std::fmt::Debug,
|
|
||||||
F: Fn(StateUpdating),
|
|
||||||
S: ToString + std::fmt::Debug
|
|
||||||
{
|
|
||||||
tracing::debug!("Trying to get launcher state");
|
tracing::debug!("Trying to get launcher state");
|
||||||
|
|
||||||
let wine_prefix = wine_prefix.into();
|
|
||||||
let game_path = game_path.into();
|
|
||||||
|
|
||||||
// Check prefix existence
|
// Check prefix existence
|
||||||
if !wine_prefix.join("drive_c").exists() {
|
if !params.wine_prefix.join("drive_c").exists() {
|
||||||
return Ok(Self::PrefixNotExists);
|
return Ok(Self::PrefixNotExists);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check game installation status
|
// Check game installation status
|
||||||
status(StateUpdating::Game);
|
(params.status_updater)(StateUpdating::Game);
|
||||||
|
|
||||||
let game = Game::new(&game_path);
|
let game = Game::new(¶ms.game_path);
|
||||||
let diff = game.try_get_diff()?;
|
let diff = game.try_get_diff()?;
|
||||||
|
|
||||||
Ok(match diff {
|
Ok(match diff {
|
||||||
VersionDiff::Latest(_) | VersionDiff::Predownload { .. } => {
|
VersionDiff::Latest(_) | VersionDiff::Predownload { .. } => {
|
||||||
let mut predownload_voice = Vec::new();
|
let mut predownload_voice = Vec::new();
|
||||||
|
|
||||||
for locale in voices {
|
for locale in params.selected_voices {
|
||||||
let mut voice_package = VoicePackage::with_locale(locale)?;
|
let mut voice_package = VoicePackage::with_locale(locale)?;
|
||||||
|
|
||||||
status(StateUpdating::Voice(voice_package.locale()));
|
(params.status_updater)(StateUpdating::Voice(voice_package.locale()));
|
||||||
|
|
||||||
// Replace voice package struct with the one constructed in the game's folder
|
// Replace voice package struct with the one constructed in the game's folder
|
||||||
// so it'll properly calculate its difference instead of saying "not installed"
|
// so it'll properly calculate its difference instead of saying "not installed"
|
||||||
if voice_package.is_installed_in(&game_path) {
|
if voice_package.is_installed_in(¶ms.game_path) {
|
||||||
voice_package = match VoicePackage::new(get_voice_package_path(&game_path, voice_package.locale())) {
|
voice_package = match VoicePackage::new(get_voice_package_path(¶ms.game_path, voice_package.locale())) {
|
||||||
Some(locale) => locale,
|
Some(locale) => locale,
|
||||||
None => return Err(anyhow::anyhow!("Failed to load {} voice package", voice_package.locale().to_name()))
|
None => return Err(anyhow::anyhow!("Failed to load {} voice package", voice_package.locale().to_name()))
|
||||||
};
|
};
|
||||||
|
@ -113,11 +117,26 @@ impl LauncherState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
status(StateUpdating::Patch);
|
// Check game patch status
|
||||||
|
(params.status_updater)(StateUpdating::Patch);
|
||||||
|
|
||||||
let patch = Patch::try_fetch(patch_servers, consts::PATCH_FETCHING_TIMEOUT)?;
|
let patch = Patch::new(¶ms.patch_folder);
|
||||||
|
|
||||||
|
// Sync local patch folder with remote if needed
|
||||||
|
if patch.is_sync(¶ms.patch_servers)?.is_none() {
|
||||||
|
for server in ¶ms.patch_servers {
|
||||||
|
if let Ok(true) = patch.sync(server) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check UnityPlayer patch
|
||||||
|
let main_patch = patch.unity_player_patch()?;
|
||||||
|
|
||||||
|
if main_patch.is_applied(¶ms.game_path)? {
|
||||||
|
// TODO: add Xlua patch check
|
||||||
|
|
||||||
if patch.is_applied(&game_path)? {
|
|
||||||
if let VersionDiff::Predownload { .. } = diff {
|
if let VersionDiff::Predownload { .. } = diff {
|
||||||
Self::PredownloadAvailable {
|
Self::PredownloadAvailable {
|
||||||
game: diff,
|
game: diff,
|
||||||
|
@ -131,7 +150,7 @@ impl LauncherState {
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
Self::PatchAvailable(patch)
|
Self::MainPatchAvailable(main_patch)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,8 +161,8 @@ impl LauncherState {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "config")]
|
#[cfg(feature = "config")]
|
||||||
#[tracing::instrument(level = "debug", skip(status), ret)]
|
#[tracing::instrument(level = "debug", skip(status_updater), ret)]
|
||||||
pub fn get_from_config<T: Fn(StateUpdating)>(status: T) -> anyhow::Result<Self> {
|
pub fn get_from_config<T: Fn(StateUpdating)>(status_updater: T) -> anyhow::Result<Self> {
|
||||||
tracing::debug!("Trying to get launcher state");
|
tracing::debug!("Trying to get launcher state");
|
||||||
|
|
||||||
let config = crate::config::get()?;
|
let config = crate::config::get()?;
|
||||||
|
@ -187,6 +206,17 @@ impl LauncherState {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Self::get(wine_prefix, config.game.path, voices, config.patch.servers, status)
|
Self::get(LauncherStateParams {
|
||||||
|
wine_prefix,
|
||||||
|
game_path: config.game.path,
|
||||||
|
|
||||||
|
selected_voices: voices,
|
||||||
|
|
||||||
|
patch_servers: config.patch.servers,
|
||||||
|
patch_folder: config.patch.path,
|
||||||
|
use_xlua_patch: false, // TODO
|
||||||
|
|
||||||
|
status_updater
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue