mirror of
https://github.com/Drop-OSS/drop-app.git
synced 2025-11-13 08:12:44 +10:00
@ -1,7 +1,6 @@
|
|||||||
use std::{
|
use std::{
|
||||||
env,
|
env,
|
||||||
sync::Mutex,
|
sync::Mutex,
|
||||||
time::{SystemTime, UNIX_EPOCH},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
|
|||||||
@ -1,9 +1,7 @@
|
|||||||
use std::sync::Mutex;
|
|
||||||
|
|
||||||
use log::info;
|
use log::info;
|
||||||
use tauri::AppHandle;
|
use tauri::AppHandle;
|
||||||
|
|
||||||
use crate::AppState;
|
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn quit(app: tauri::AppHandle) {
|
pub fn quit(app: tauri::AppHandle) {
|
||||||
|
|||||||
@ -4,12 +4,8 @@ use crate::downloads::manifest::{DropDownloadContext, DropManifest};
|
|||||||
use crate::downloads::progress_object::ProgressHandle;
|
use crate::downloads::progress_object::ProgressHandle;
|
||||||
use crate::remote::RemoteAccessError;
|
use crate::remote::RemoteAccessError;
|
||||||
use crate::DB;
|
use crate::DB;
|
||||||
use core::time;
|
|
||||||
use log::{debug, error, info};
|
use log::{debug, error, info};
|
||||||
use rayon::ThreadPoolBuilder;
|
use rayon::ThreadPoolBuilder;
|
||||||
use serde::ser::{Error, SerializeMap};
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use std::borrow::BorrowMut;
|
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
use std::fs::{create_dir_all, File};
|
use std::fs::{create_dir_all, File};
|
||||||
|
|||||||
@ -6,14 +6,11 @@ use crate::DB;
|
|||||||
use log::warn;
|
use log::warn;
|
||||||
use md5::{Context, Digest};
|
use md5::{Context, Digest};
|
||||||
use reqwest::blocking::Response;
|
use reqwest::blocking::Response;
|
||||||
use tauri::utils::acl::Permission;
|
|
||||||
|
|
||||||
use std::fs::{set_permissions, Permissions};
|
use std::fs::{set_permissions, Permissions};
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
use std::os::unix::fs::PermissionsExt;
|
use std::os::unix::fs::PermissionsExt;
|
||||||
use std::thread::sleep;
|
|
||||||
use std::time::Duration;
|
|
||||||
use std::{
|
use std::{
|
||||||
fs::{File, OpenOptions},
|
fs::{File, OpenOptions},
|
||||||
io::{self, BufWriter, Seek, SeekFrom, Write},
|
io::{self, BufWriter, Seek, SeekFrom, Write},
|
||||||
|
|||||||
@ -2,7 +2,6 @@ use std::{
|
|||||||
any::Any,
|
any::Any,
|
||||||
collections::VecDeque,
|
collections::VecDeque,
|
||||||
fmt::Debug,
|
fmt::Debug,
|
||||||
io,
|
|
||||||
sync::{
|
sync::{
|
||||||
mpsc::{SendError, Sender},
|
mpsc::{SendError, Sender},
|
||||||
Arc, Mutex, MutexGuard,
|
Arc, Mutex, MutexGuard,
|
||||||
|
|||||||
@ -8,17 +8,16 @@ use std::{
|
|||||||
thread::{spawn, JoinHandle},
|
thread::{spawn, JoinHandle},
|
||||||
};
|
};
|
||||||
|
|
||||||
use http::version;
|
|
||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
use tauri::{AppHandle, Emitter};
|
use tauri::{AppHandle, Emitter};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::{Database, GameStatus, GameTransientStatus},
|
db::{Database, GameStatus, GameTransientStatus},
|
||||||
library::{
|
library::{
|
||||||
on_game_complete, push_game_update, GameUpdateEvent, QueueUpdateEvent,
|
on_game_complete, push_game_update, QueueUpdateEvent,
|
||||||
QueueUpdateEventQueueData, StatsUpdateEvent,
|
QueueUpdateEventQueueData, StatsUpdateEvent,
|
||||||
},
|
},
|
||||||
state::{GameStatusManager, GameStatusWithTransient},
|
state::GameStatusManager,
|
||||||
DB,
|
DB,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -113,7 +112,7 @@ impl DownloadManagerBuilder {
|
|||||||
DownloadManager::new(terminator, queue, active_progress, command_sender)
|
DownloadManager::new(terminator, queue, active_progress, command_sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_game_status<F: FnOnce(&mut RwLockWriteGuard<'_, Database>, &String) -> ()>(
|
fn set_game_status<F: FnOnce(&mut RwLockWriteGuard<'_, Database>, &String)>(
|
||||||
&self,
|
&self,
|
||||||
id: String,
|
id: String,
|
||||||
setter: F,
|
setter: F,
|
||||||
|
|||||||
@ -1,12 +1,11 @@
|
|||||||
use std::{
|
use std::{
|
||||||
default,
|
|
||||||
fs::File,
|
fs::File,
|
||||||
io::{Read, Write},
|
io::{Read, Write},
|
||||||
path::{Path, PathBuf},
|
path::PathBuf,
|
||||||
sync::Mutex,
|
sync::Mutex,
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::{error, info};
|
use log::error;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_binary::binary_stream::Endian;
|
use serde_binary::binary_stream::Endian;
|
||||||
|
|
||||||
@ -44,15 +43,15 @@ impl StoredManifest {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let manifest = match serde_binary::from_vec::<StoredManifest>(s, Endian::Little) {
|
|
||||||
|
|
||||||
|
match serde_binary::from_vec::<StoredManifest>(s, Endian::Little) {
|
||||||
Ok(manifest) => manifest,
|
Ok(manifest) => manifest,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("{}", e);
|
error!("{}", e);
|
||||||
StoredManifest::new(game_id, game_version, base_path)
|
StoredManifest::new(game_id, game_version, base_path)
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
return manifest;
|
|
||||||
}
|
}
|
||||||
pub fn write(&self) {
|
pub fn write(&self) {
|
||||||
let manifest_raw = match serde_binary::to_vec(&self, Endian::Little) {
|
let manifest_raw = match serde_binary::to_vec(&self, Endian::Little) {
|
||||||
|
|||||||
@ -28,7 +28,6 @@ use library::{
|
|||||||
use log::{debug, info, warn, LevelFilter};
|
use log::{debug, info, warn, LevelFilter};
|
||||||
use log4rs::append::console::ConsoleAppender;
|
use log4rs::append::console::ConsoleAppender;
|
||||||
use log4rs::append::file::FileAppender;
|
use log4rs::append::file::FileAppender;
|
||||||
use log4rs::append::rolling_file::RollingFileAppender;
|
|
||||||
use log4rs::config::{Appender, Root};
|
use log4rs::config::{Appender, Root};
|
||||||
use log4rs::encode::pattern::PatternEncoder;
|
use log4rs::encode::pattern::PatternEncoder;
|
||||||
use log4rs::Config;
|
use log4rs::Config;
|
||||||
@ -43,7 +42,7 @@ use std::{
|
|||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
sync::{LazyLock, Mutex},
|
sync::{LazyLock, Mutex},
|
||||||
};
|
};
|
||||||
use tauri::menu::{Menu, MenuItem, MenuItemBuilder, PredefinedMenuItem};
|
use tauri::menu::{Menu, MenuItem, PredefinedMenuItem};
|
||||||
use tauri::tray::TrayIconBuilder;
|
use tauri::tray::TrayIconBuilder;
|
||||||
use tauri::{AppHandle, Manager, RunEvent, WindowEvent};
|
use tauri::{AppHandle, Manager, RunEvent, WindowEvent};
|
||||||
use tauri_plugin_deep_link::DeepLinkExt;
|
use tauri_plugin_deep_link::DeepLinkExt;
|
||||||
@ -205,7 +204,7 @@ pub fn run() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut app = builder
|
let app = builder
|
||||||
.plugin(tauri_plugin_deep_link::init())
|
.plugin(tauri_plugin_deep_link::init())
|
||||||
.invoke_handler(tauri::generate_handler![
|
.invoke_handler(tauri::generate_handler![
|
||||||
// Core utils
|
// Core utils
|
||||||
@ -346,22 +345,16 @@ pub fn run() {
|
|||||||
|
|
||||||
responder.respond(resp);
|
responder.respond(resp);
|
||||||
})
|
})
|
||||||
.on_window_event(|window, event| match event {
|
.on_window_event(|window, event| if let WindowEvent::CloseRequested { api, .. } = event {
|
||||||
WindowEvent::CloseRequested { api, .. } => {
|
window.hide().unwrap();
|
||||||
window.hide().unwrap();
|
api.prevent_close();
|
||||||
api.prevent_close();
|
|
||||||
}
|
|
||||||
_ => (),
|
|
||||||
})
|
})
|
||||||
.build(tauri::generate_context!())
|
.build(tauri::generate_context!())
|
||||||
.expect("error while running tauri application");
|
.expect("error while running tauri application");
|
||||||
|
|
||||||
app.run(|app_handle, event| match event {
|
app.run(|app_handle, event| if let RunEvent::ExitRequested { code, api, .. } = event {
|
||||||
RunEvent::ExitRequested { code, api, .. } => {
|
if code.is_none() {
|
||||||
if code.is_none() {
|
api.prevent_exit();
|
||||||
api.prevent_exit();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_ => {}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ use urlencoding::encode;
|
|||||||
|
|
||||||
use crate::db::DatabaseImpls;
|
use crate::db::DatabaseImpls;
|
||||||
use crate::db::GameVersion;
|
use crate::db::GameVersion;
|
||||||
use crate::db::{GameStatus, GameTransientStatus};
|
use crate::db::GameStatus;
|
||||||
use crate::downloads::download_manager::{DownloadManagerStatus, GameDownloadStatus};
|
use crate::downloads::download_manager::{DownloadManagerStatus, GameDownloadStatus};
|
||||||
use crate::process::process_manager::Platform;
|
use crate::process::process_manager::Platform;
|
||||||
use crate::remote::RemoteAccessError;
|
use crate::remote::RemoteAccessError;
|
||||||
|
|||||||
@ -3,19 +3,17 @@ use std::{
|
|||||||
fs::{File, OpenOptions},
|
fs::{File, OpenOptions},
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
process::{Child, Command, ExitStatus},
|
process::{Child, Command, ExitStatus},
|
||||||
sync::{Arc, LazyLock, Mutex},
|
sync::{Arc, Mutex},
|
||||||
thread::spawn,
|
thread::spawn,
|
||||||
};
|
};
|
||||||
|
|
||||||
use http::version;
|
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tauri::{AppHandle, Emitter, Manager};
|
use tauri::{AppHandle, Manager};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::{GameStatus, GameTransientStatus, DATA_ROOT_DIR},
|
db::{GameStatus, GameTransientStatus, DATA_ROOT_DIR},
|
||||||
library::push_game_update,
|
library::push_game_update,
|
||||||
process::process_manager,
|
|
||||||
state::GameStatusManager,
|
state::GameStatusManager,
|
||||||
AppState, DB,
|
AppState, DB,
|
||||||
};
|
};
|
||||||
@ -70,7 +68,7 @@ impl ProcessManager<'_> {
|
|||||||
let absolute_exe = install_dir.join(root);
|
let absolute_exe = install_dir.join(root);
|
||||||
|
|
||||||
let args = command_components[1..]
|
let args = command_components[1..]
|
||||||
.into_iter()
|
.iter()
|
||||||
.map(|v| v.to_string())
|
.map(|v| v.to_string())
|
||||||
.collect();
|
.collect();
|
||||||
(absolute_exe, args)
|
(absolute_exe, args)
|
||||||
@ -91,24 +89,21 @@ impl ProcessManager<'_> {
|
|||||||
|
|
||||||
let current_state = db_handle.games.statuses.get(&game_id).cloned();
|
let current_state = db_handle.games.statuses.get(&game_id).cloned();
|
||||||
if let Some(saved_state) = current_state {
|
if let Some(saved_state) = current_state {
|
||||||
match saved_state {
|
if let GameStatus::SetupRequired {
|
||||||
GameStatus::SetupRequired {
|
|
||||||
version_name,
|
version_name,
|
||||||
install_dir,
|
install_dir,
|
||||||
} => {
|
} = saved_state {
|
||||||
if let Some(exit_code) = result.ok() {
|
if let Ok(exit_code) = result {
|
||||||
if exit_code.success() {
|
if exit_code.success() {
|
||||||
db_handle.games.statuses.insert(
|
db_handle.games.statuses.insert(
|
||||||
game_id.clone(),
|
game_id.clone(),
|
||||||
GameStatus::Installed {
|
GameStatus::Installed {
|
||||||
version_name: version_name.to_string(),
|
version_name: version_name.to_string(),
|
||||||
install_dir: install_dir.to_string(),
|
install_dir: install_dir.to_string(),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => (),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drop(db_handle);
|
drop(db_handle);
|
||||||
@ -188,7 +183,7 @@ impl ProcessManager<'_> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let current_time = chrono::offset::Local::now();
|
let current_time = chrono::offset::Local::now();
|
||||||
let mut log_file = OpenOptions::new()
|
let log_file = OpenOptions::new()
|
||||||
.write(true)
|
.write(true)
|
||||||
.truncate(true)
|
.truncate(true)
|
||||||
.read(true)
|
.read(true)
|
||||||
@ -199,7 +194,7 @@ impl ProcessManager<'_> {
|
|||||||
)
|
)
|
||||||
.map_err(|v| v.to_string())?;
|
.map_err(|v| v.to_string())?;
|
||||||
|
|
||||||
let mut error_file = OpenOptions::new()
|
let error_file = OpenOptions::new()
|
||||||
.write(true)
|
.write(true)
|
||||||
.truncate(true)
|
.truncate(true)
|
||||||
.read(true)
|
.read(true)
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::{GameStatus, GameTransientStatus},
|
db::{GameStatus, GameTransientStatus},
|
||||||
@ -23,6 +22,6 @@ impl GameStatusManager {
|
|||||||
return (offline_state, None);
|
return (offline_state, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (None, None);
|
(None, None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user