From ae44805a2eb483761a4fe33ebbd0452101672efc Mon Sep 17 00:00:00 2001 From: JakePIXL Date: Thu, 26 Oct 2023 12:46:26 -0400 Subject: [PATCH] Project cleanup (#7) * re/moved funcs from world handler & search * fixed function calls on refresh * cleaned up function names to make more sense --- teller/src/handlers/backup.rs | 8 +- teller/src/handlers/config/instance.rs | 55 +++++-- teller/src/handlers/player.rs | 40 ++--- teller/src/handlers/search/backups.rs | 16 +- teller/src/handlers/search/worlds.rs | 61 +------ teller/src/handlers/snapshot.rs | 9 +- teller/src/handlers/world.rs | 154 +----------------- teller/src/lib.rs | 4 - .../src-tauri/src/backend/backup_handler.rs | 16 +- .../src-tauri/src/backend/folder_handler.rs | 4 +- .../src-tauri/src/backend/world_handler.rs | 15 +- .../src/lib/modals/backup_modal.svelte | 2 +- teller_desktop/src/lib/world_list_item.svelte | 2 +- .../src/routes/local/+layout.svelte | 93 ++++++----- .../local/vaults/[vaultName]/+page.svelte | 21 ++- .../[categoryName]/[pathName]/+page.svelte | 22 ++- .../[worldId]/player/[playerId]/+page.svelte | 5 +- 17 files changed, 184 insertions(+), 343 deletions(-) diff --git a/teller/src/handlers/backup.rs b/teller/src/handlers/backup.rs index e5abc89..41df260 100644 --- a/teller/src/handlers/backup.rs +++ b/teller/src/handlers/backup.rs @@ -17,7 +17,7 @@ use tokio::io::AsyncSeek; use tokio::io::AsyncWrite; use crate::handlers::config::backup::get_backup_config; -use crate::handlers::search::worlds::world_path_from_id; +use crate::handlers::search::worlds::get_world_path_by_id; use crate::types::backup::BackupMetadata; use super::config::get_config_folder; @@ -150,7 +150,7 @@ pub async fn create_backup_from_id( vaults: Option>, ) -> Result { info!("Creating backup for world id: {}", world_id); - match world_path_from_id(world_id, category, instance).await { + match get_world_path_by_id(world_id, category, instance).await { Ok(world_path) => { let world_backup_path = match create_world_backup(world_path.clone()).await { Ok(backup_path) => backup_path, @@ -259,7 +259,7 @@ pub async fn create_backup_from_id( } } -pub async fn grab_backup_metadata(backup_path: PathBuf) -> Result { +pub async fn get_backup_meta_from_path(backup_path: PathBuf) -> Result { let mut zip = match ZipFileReader::with_tokio(File::open(backup_path.clone()).await.unwrap()).await { Ok(zip) => zip, @@ -437,7 +437,7 @@ pub async fn delete_backup( Ok(()) } -pub async fn delete_all_backups(world_id: &str, vault: Option<&str>) -> Result<(), String> { +pub async fn delete_world_backups(world_id: &str, vault: Option<&str>) -> Result<(), String> { let backup_settings = get_backup_config().await?; let vault_path = match vault { diff --git a/teller/src/handlers/config/instance.rs b/teller/src/handlers/config/instance.rs index ce6491e..8f4bed9 100644 --- a/teller/src/handlers/config/instance.rs +++ b/teller/src/handlers/config/instance.rs @@ -1,5 +1,6 @@ use std::{ env, + ops::Add, path::{Path, PathBuf}, }; @@ -12,20 +13,48 @@ pub fn get_minecraft_save_location() -> Option { let os = env::consts::OS; match os { - "windows" => Some(PathBuf::from(format!( - "{}\\.minecraft\\saves", - env::var("APPDATA").unwrap() - ))), - "macos" => Some(PathBuf::from(format!( - "{}/Library/Application Support/minecraft/saves", - env::var("HOME").unwrap() - ))), - "linux" => Some(PathBuf::from(format!( - "{}/.minecraft/saves", - env::var("HOME").unwrap() - ))), - _ => None, + "windows" => { + let java_path = PathBuf::from(format!( + "{}\\.minecraft\\saves", + env::var("APPDATA").unwrap() + )); + + if java_path.exists() { + return Some(java_path); + } else { + let bedrock_path = PathBuf::from(format!( + "{}\\LocalState\\games\\com.mojang\\minecraftWorlds", + env::var("LOCALAPPDATA") + .unwrap() + .add("\\Packages\\Microsoft.MinecraftUWP_8wekyb3d8bbwe") + )); + + if bedrock_path.exists() { + return Some(bedrock_path); + } + } + } + "macos" => { + let path = PathBuf::from(format!( + "{}/Library/Application Support/minecraft/saves", + env::var("HOME").unwrap() + )); + + if path.exists() { + return Some(path); + } + } + "linux" => { + let path = PathBuf::from(format!("{}/.minecraft/saves", env::var("HOME").unwrap())); + + if path.exists() { + return Some(path); + } + } + _ => (), } + + None } pub fn get_local_directories_config>( diff --git a/teller/src/handlers/player.rs b/teller/src/handlers/player.rs index 56b3f06..307b217 100644 --- a/teller/src/handlers/player.rs +++ b/teller/src/handlers/player.rs @@ -1,5 +1,6 @@ use log::info; use serde_json::{json, Value}; +use tokio::fs; use uuid::Uuid; use std::{collections::HashMap, path::PathBuf}; @@ -12,7 +13,7 @@ use crate::{ types::player::{Item, PlayerData}, }; -pub async fn fetch_player_data_from_uuid( +pub async fn get_player_meta_from_uuid( client: reqwest::Client, player_uuid_str: String, ) -> Result { @@ -74,7 +75,7 @@ pub async fn fetch_player_data_from_uuid( } } -pub async fn fetch_players_meta_data( +pub async fn get_players_meta_from_uuids( player_data_list: Vec, ) -> Result, String> { let mut player_data_map: HashMap = HashMap::new(); @@ -83,7 +84,7 @@ pub async fn fetch_players_meta_data( for player_data in player_data_list { let player_uuid = player_data.id; let client = client.clone(); - match fetch_player_data_from_uuid(client, player_uuid.clone()).await { + match get_player_meta_from_uuid(client, player_uuid.clone()).await { Ok(player) => { player_data_map.insert(player_uuid, player); } @@ -228,10 +229,7 @@ pub fn grab_player_from_uuid(player_uuid: String, path: &PathBuf) -> Result Result, Box> { +pub async fn get_player_data(path: &PathBuf, game_type: GameType) -> Result, String> { match game_type { GameType::Bedrock => { info!("Fetching Bedrock player data"); @@ -252,10 +250,8 @@ pub async fn get_player_data( info!("Fetching player data for: {:?}", uuid); let player_meta = json!({ - "username": "Remote Player", "id": uuid.strip_prefix("player_server_").unwrap_or(uuid), "avatar": player_avatar, - "meta": {} }); players.push(player_meta); @@ -263,10 +259,8 @@ pub async fn get_player_data( } let local_player_data = json!({ - "username": "Local Player", "id": player_uuid, "avatar": player_avatar, - "meta": {} }); players.push(local_player_data); @@ -320,16 +314,14 @@ pub async fn get_player_data( }; let player_meta = json!({ - "username": "Local Player", "id": player_uuid, "avatar": player_avatar, - "meta": {} }); return Ok(vec![player_meta]); } - let player_data = match std::fs::read_dir(&player_data_path) { + let mut player_data = match fs::read_dir(&player_data_path).await { Ok(data) => data, Err(e) => { return Err(format!("Failed to read player data: {:?}", e).into()); @@ -338,14 +330,11 @@ pub async fn get_player_data( let mut all_players: Vec = Vec::new(); - for player in player_data { - let player = match player { - Ok(player) => player, - Err(e) => { - return Err(format!("Failed to read player data: {:?}", e).into()); - } - }; - + while let Some(player) = player_data + .next_entry() + .await + .map_err(|e| format!("Failed to read player data: {:?}", e))? + { let player = player.path(); if !player.is_file() @@ -355,12 +344,6 @@ pub async fn get_player_data( } let player_uuid = player.file_stem().unwrap().to_str().unwrap().to_string(); - // let player_meta = match fetch_player_data_from_uuid(client, player_uuid).await { - // Ok(data) => data, - // Err(e) => { - // return Err(format!("Failed to fetch player data: {:?}", e).into()); - // } - // }; let player_avatar = format!( "https://crafthead.net/avatar/{}?scale=32&overlay=false", @@ -368,7 +351,6 @@ pub async fn get_player_data( ); let player_meta = json!({ - "username": "Remote Player", "id": player_uuid, "avatar": player_avatar, "meta": {} diff --git a/teller/src/handlers/search/backups.rs b/teller/src/handlers/search/backups.rs index c66eced..5ee42a4 100644 --- a/teller/src/handlers/search/backups.rs +++ b/teller/src/handlers/search/backups.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use tokio::fs; use crate::{ - handlers::{backup::grab_backup_metadata, config::backup::get_backup_config}, + handlers::{backup::get_backup_meta_from_path, config::backup::get_backup_config}, types::{ backup::{BackupMetadata, SnapshotInfo}, world::WorldData, @@ -41,7 +41,7 @@ fn find_newest_backup(files: &[fs::DirEntry]) -> Option { newest_file } -pub async fn fetch_backups_list(vault: &str) -> Result, String> { +pub async fn grab_local_backup_list(vault: &str) -> Result, String> { let backup_settings = get_backup_config().await?; let local_backups_path = if let Some(vault_path) = backup_settings.vaults.get(vault) { @@ -71,7 +71,7 @@ pub async fn fetch_backups_list(vault: &str) -> Result, String> { let newest_backup = find_newest_backup(&all_backups); if let Some(newest_backup) = newest_backup { - let metadata = grab_backup_metadata(newest_backup).await; + let metadata = get_backup_meta_from_path(newest_backup).await; if metadata.is_ok() { let world_data = metadata.unwrap(); backups.push(world_data.entry); @@ -85,7 +85,7 @@ pub async fn fetch_backups_list(vault: &str) -> Result, String> { Ok(backups) } -pub async fn fetch_backups_for_world( +pub async fn grab_world_backups( world_id: &str, selected_vault: Option<&str>, ) -> Result, String> { @@ -140,7 +140,7 @@ pub async fn fetch_backups_for_world( Ok(backups) } -pub async fn fetch_metadata_for_world( +pub async fn get_world_metadata_from_id( world_id: &str, selected_vault: Option<&str>, ) -> Result { @@ -161,12 +161,12 @@ pub async fn fetch_metadata_for_world( .map_err(|e| format!("Failed to read backups directory: {}", e))?; match find_newest_backup(&files) { - Some(newest_backup) => return grab_backup_metadata(newest_backup).await, + Some(newest_backup) => return get_backup_meta_from_path(newest_backup).await, None => Err("No backups found".to_string()), } } -pub async fn fetch_metadata_for_backup( +pub async fn grab_backup_metadata( world_id: &str, selected_vault: Option<&str>, backup_id: &str, @@ -186,7 +186,7 @@ pub async fn fetch_metadata_for_backup( let backup_path = world_path.join(format!("{}.chunkvault-snapshot", backup_id)); if backup_path.exists() { - return grab_backup_metadata(backup_path).await; + return get_backup_meta_from_path(backup_path).await; } else { return Err("Backup does not exist".to_string()); } diff --git a/teller/src/handlers/search/worlds.rs b/teller/src/handlers/search/worlds.rs index 9570627..006c841 100644 --- a/teller/src/handlers/search/worlds.rs +++ b/teller/src/handlers/search/worlds.rs @@ -97,62 +97,7 @@ pub async fn fetch_worlds_from_instance( Ok(worlds_list) } -// pub fn world_path_from_id(world_id: &str, category: Option<&str>) -> Result { -// let config_dir = get_config_folder(); - -// info!("Searching for world: {}", world_id); - -// let mut paths: Vec = Vec::new(); - -// match get_local_directories_config(&config_dir) { -// Ok(config) => { -// if let Some(category) = category { -// if category == "default" { -// match get_minecraft_save_location() { -// Some(path) => paths.push(path), -// None => {} -// }; -// } else if let Some(vault_entries) = config.categories.get(category) { -// for (_, path) in vault_entries.paths.iter() { -// paths.push(path.clone()); -// } -// } -// } -// } -// Err(_e) => {} -// }; - -// for save_location in paths { -// let world_folders = match std::fs::read_dir(&save_location) { -// Ok(folders) => folders, -// Err(_) => continue, -// }; - -// for entry in world_folders { -// if let Ok(world_folder) = entry { -// let world_folder = world_folder.path(); - -// if !world_folder.is_dir() { -// continue; -// } - -// let vault_id = match get_vault_id(&world_folder) { -// Ok(id) => id, -// Err(_) => continue, -// }; - -// if vault_id == world_id { -// info!("Found world: {world_id}"); -// return Ok(world_folder); -// } -// } -// } -// } - -// Err("Could not find world".to_string()) -// } - -pub async fn world_path_from_id( +pub async fn get_world_path_by_id( world_id: &str, category: Option<&str>, instance: Option<&str>, @@ -217,12 +162,12 @@ pub async fn world_path_from_id( Err("Could not find world".to_string()) } -pub async fn grab_world_by_id( +pub async fn get_world_by_id( world_id: &str, category: Option<&str>, instance: Option<&str>, ) -> Result { - match world_path_from_id(world_id, category, instance).await { + match get_world_path_by_id(world_id, category, instance).await { Ok(path) => { let game_type = is_minecraft_world(&path.clone()); match process_world_data(&path, game_type).await { diff --git a/teller/src/handlers/snapshot.rs b/teller/src/handlers/snapshot.rs index 90f8f59..3f985b3 100644 --- a/teller/src/handlers/snapshot.rs +++ b/teller/src/handlers/snapshot.rs @@ -3,12 +3,13 @@ use std::{path::PathBuf, str::FromStr}; use log::info; use crate::handlers::{ - backup::grab_backup_metadata, search::directories::get_directory_by_name, world::new_vault_id, + backup::get_backup_meta_from_path, search::directories::get_directory_by_name, + world::new_vault_id, }; use super::{ backup::extract_world_backup, config::backup::get_backup_config, - search::worlds::world_path_from_id, + search::worlds::get_world_path_by_id, }; pub async fn snapshot_to_world( @@ -36,12 +37,12 @@ pub async fn snapshot_to_world( if backup_path.exists() { for instance in instances { - let mut world_path = match world_path_from_id(world_id, None, Some(&instance)).await { + let mut world_path = match get_world_path_by_id(world_id, None, Some(&instance)).await { Ok(path) => path.to_owned(), Err(_) => { let instance_path = get_directory_by_name(&instance, None).unwrap(); - let metadata = grab_backup_metadata(backup_path.clone()).await?; + let metadata = get_backup_meta_from_path(backup_path.clone()).await?; instance_path.join(&metadata.entry.name) } diff --git a/teller/src/handlers/world.rs b/teller/src/handlers/world.rs index a4a1890..6972dbd 100644 --- a/teller/src/handlers/world.rs +++ b/teller/src/handlers/world.rs @@ -3,14 +3,13 @@ use std::path::PathBuf; use chrono::NaiveDateTime; use commandblock::nbt::{read_from_file, Compression, Endian, NbtValue}; use log::{error, info}; -use serde_json::{json, Value}; +use serde_json::Value; use tokio::{fs, io::AsyncWriteExt}; -use uuid::Uuid; use crate::{ handlers::{ - player::get_steve_image, - search::worlds::{is_minecraft_world, world_path_from_id}, + player::get_player_data, + search::worlds::{get_world_path_by_id, is_minecraft_world}, }, types::world::{GameRules, WorldData, WorldLevelData}, utils::{calculate_dir_size, encode_image_to_base64}, @@ -359,149 +358,6 @@ pub async fn process_world_data( } } -pub async fn get_player_data(path: &PathBuf, game_type: GameType) -> Result, String> { - match game_type { - GameType::Bedrock => { - info!("Fetching Bedrock player data"); - - let player_uuid = "~local_player".to_string(); - let player_avatar = get_steve_image(); - - let db_path = path.join("db").to_str().unwrap().to_string(); - - let mut db_reader = commandblock::db::DbReader::new(&db_path, 0); - - let remote_player_data = db_reader.parse_remote_players(); - - let mut players: Vec = Vec::new(); - - if remote_player_data.is_some() { - for (uuid, _) in remote_player_data.unwrap().iter() { - info!("Fetching player data for: {:?}", uuid); - - let player_meta = json!({ - "id": uuid.strip_prefix("player_server_").unwrap_or(uuid), - "avatar": player_avatar, - }); - - players.push(player_meta); - } - } - - let local_player_data = json!({ - "id": player_uuid, - "avatar": player_avatar, - }); - - players.push(local_player_data); - - Ok(players) - } - GameType::Java => { - info!("Fetching Java player data"); - - let player_data_path = path.join("playerdata"); - - if !player_data_path.exists() { - let level_dat_path = path.join("level.dat"); - - let level_data = read_dat_file(level_dat_path, game_type)?; - - let level_data = parse_world_data(level_data, game_type)?; - - let player_data = match level_data.get("Player") { - Some(data) => data, - None => return Err("Could not find Player in level.dat".into()), - }; - - let player_uuid = match player_data.get("UUID") { - Some(player_uuid_values) => { - let d1 = player_uuid_values[0].as_i64().unwrap_or_default() as u32; // Your most significant 32-bit value - let d2 = player_uuid_values[1].as_i64().unwrap_or_default() as u32; // Your second most significant 32-bit value - let d3 = player_uuid_values[2].as_i64().unwrap_or_default() as u32; // Your second least significant 32-bit value - let d4 = player_uuid_values[3].as_i64().unwrap_or_default() as u32; // Your least significant 32-bit value - - // Concatenate the four integers into a single 128-bit value - let uuid_int = ((d1 as u128) << 96) - | ((d2 as u128) << 64) - | ((d3 as u128) << 32) - | d4 as u128; - - // Create a UUID from the 128-bit value - let player_uuid = Uuid::from_u128(uuid_int).to_string(); - - player_uuid - } - None => "~local_player".to_string(), - }; - - let player_avatar = match player_uuid.contains("~local_player") { - true => get_steve_image(), - false => format!( - "https://crafthead.net/avatar/{}?scale=32&overlay=false", - player_uuid - ), - }; - - let player_meta = json!({ - "id": player_uuid, - "avatar": player_avatar, - }); - - return Ok(vec![player_meta]); - } - - let mut player_data = match fs::read_dir(&player_data_path).await { - Ok(data) => data, - Err(e) => { - return Err(format!("Failed to read player data: {:?}", e).into()); - } - }; - - let mut all_players: Vec = Vec::new(); - - while let Some(player) = player_data - .next_entry() - .await - .map_err(|e| format!("Failed to read player data: {:?}", e))? - { - let player = player.path(); - - if !player.is_file() - || player.extension().and_then(std::ffi::OsStr::to_str) != Some("dat") - { - continue; - } - - let player_uuid = player.file_stem().unwrap().to_str().unwrap().to_string(); - - let player_avatar = format!( - "https://crafthead.net/avatar/{}?scale=32&overlay=false", - player_uuid - ); - - let player_meta = json!({ - "id": player_uuid, - "avatar": player_avatar, - "meta": {} - }); - - // let player_meta = match fetch_player_data_from_uuid(player_uuid) { - // Ok(data) => data, - // Err(e) => { - // return Err(format!("Failed to fetch player data: {:?}", e).into()); - // } - // }; - - all_players.push(player_meta); - } - - Ok(all_players) - } - GameType::None => Err("Game type not specified".into()), - } -} - pub fn parse_game_rules( game_data: &serde_json::Value, game_type: GameType, @@ -853,12 +709,12 @@ pub async fn parse_world_entry_data(path: PathBuf) -> Result Ok(world_data) } -pub async fn delete_world( +pub async fn delete_world_by_id( world_id: &str, category: Option<&str>, instance: Option<&str>, ) -> Result<(), String> { - let world_path = world_path_from_id(world_id, category, instance).await?; + let world_path = get_world_path_by_id(world_id, category, instance).await?; if !world_path.exists() { error!("World does not exist: {:?}", world_path); diff --git a/teller/src/lib.rs b/teller/src/lib.rs index 120a1fb..beda6cb 100644 --- a/teller/src/lib.rs +++ b/teller/src/lib.rs @@ -1,7 +1,3 @@ pub mod handlers; pub mod types; pub mod utils; - -// mod backup; -// pub mod configuration; -// pub mod world; diff --git a/teller_desktop/src-tauri/src/backend/backup_handler.rs b/teller_desktop/src-tauri/src/backend/backup_handler.rs index 0a65093..0e3d3ac 100644 --- a/teller_desktop/src-tauri/src/backend/backup_handler.rs +++ b/teller_desktop/src-tauri/src/backend/backup_handler.rs @@ -70,7 +70,7 @@ async fn create_backup_from_id( #[tauri::command] async fn grab_local_backup_list(vault: &str) -> Result, String> { - teller::handlers::search::backups::fetch_backups_list(vault).await + teller::handlers::search::backups::grab_local_backup_list(vault).await } #[tauri::command] @@ -78,7 +78,7 @@ async fn grab_world_metadata( world_id: &str, selected_vault: Option<&str>, ) -> Result { - teller::handlers::search::backups::fetch_metadata_for_world(world_id, selected_vault).await + teller::handlers::search::backups::get_world_metadata_from_id(world_id, selected_vault).await } #[tauri::command] @@ -86,7 +86,7 @@ async fn grab_world_backups( world_id: &str, selected_vault: Option<&str>, ) -> Result, String> { - teller::handlers::search::backups::fetch_backups_for_world(world_id, selected_vault).await + teller::handlers::search::backups::grab_world_backups(world_id, selected_vault).await } #[tauri::command] @@ -95,12 +95,8 @@ async fn grab_backup_metadata( selected_vault: Option<&str>, backup_id: &str, ) -> Result { - teller::handlers::search::backups::fetch_metadata_for_backup( - world_id, - selected_vault, - backup_id, - ) - .await + teller::handlers::search::backups::grab_backup_metadata(world_id, selected_vault, backup_id) + .await } #[tauri::command] @@ -114,7 +110,7 @@ async fn delete_backup_from_id( #[tauri::command] async fn delete_world_backups(world_id: &str, selected_vault: Option<&str>) -> Result<(), String> { - teller::handlers::backup::delete_all_backups(world_id, selected_vault).await + teller::handlers::backup::delete_world_backups(world_id, selected_vault).await } #[tauri::command] diff --git a/teller_desktop/src-tauri/src/backend/folder_handler.rs b/teller_desktop/src-tauri/src/backend/folder_handler.rs index 762929f..d5da30e 100644 --- a/teller_desktop/src-tauri/src/backend/folder_handler.rs +++ b/teller_desktop/src-tauri/src/backend/folder_handler.rs @@ -7,7 +7,7 @@ use tauri::{ }; use teller::{ handlers::search::worlds::{ - fetch_worlds_from_instance, recursive_world_search, world_path_from_id, + fetch_worlds_from_instance, get_world_path_by_id, recursive_world_search, }, types::world::WorldData, }; @@ -50,7 +50,7 @@ async fn open_world_in_explorer( category: Option<&str>, instance: Option<&str>, ) -> Result<(), String> { - let path = world_path_from_id(world_id, category, instance).await?; + let path = get_world_path_by_id(world_id, category, instance).await?; if path.is_dir() { match tauri::api::shell::open(&handle.shell_scope(), &path.to_string_lossy(), None) diff --git a/teller_desktop/src-tauri/src/backend/world_handler.rs b/teller_desktop/src-tauri/src/backend/world_handler.rs index deecbdc..d7db18b 100644 --- a/teller_desktop/src-tauri/src/backend/world_handler.rs +++ b/teller_desktop/src-tauri/src/backend/world_handler.rs @@ -5,10 +5,7 @@ use std::{ use serde_json::Value; use teller::{ - handlers::{ - player::{fetch_player_data_from_uuid, fetch_players_meta_data, grab_player_from_uuid}, - search::worlds::{grab_world_by_id, world_path_from_id}, - }, + handlers::player::grab_player_from_uuid, types::{player::PlayerData, world::WorldLevelData}, }; @@ -36,7 +33,7 @@ pub async fn get_world_by_id( category: Option<&str>, instance: Option<&str>, ) -> Result { - grab_world_by_id(world_id, category, instance).await + teller::handlers::search::worlds::get_world_by_id(world_id, category, instance).await } #[tauri::command] @@ -45,19 +42,19 @@ async fn get_world_path_by_id( category: Option<&str>, instance: Option<&str>, ) -> Result { - world_path_from_id(world_id, category, instance).await + teller::handlers::search::worlds::get_world_path_by_id(world_id, category, instance).await } #[tauri::command] async fn get_player_meta_from_uuids( player_data_list: Vec, ) -> Result, String> { - fetch_players_meta_data(player_data_list).await + teller::handlers::player::get_players_meta_from_uuids(player_data_list).await } #[tauri::command] async fn get_player_meta_from_uuid(player_uuid: String) -> Result { - fetch_player_data_from_uuid(reqwest::Client::new(), player_uuid).await + teller::handlers::player::get_player_meta_from_uuid(reqwest::Client::new(), player_uuid).await } #[tauri::command] @@ -74,5 +71,5 @@ async fn delete_world_by_id( category: Option<&str>, instance: Option<&str>, ) -> Result<(), String> { - teller::handlers::world::delete_world(world_id, category, instance).await + teller::handlers::world::delete_world_by_id(world_id, category, instance).await } diff --git a/teller_desktop/src/lib/modals/backup_modal.svelte b/teller_desktop/src/lib/modals/backup_modal.svelte index 1ea4e38..a3d98e7 100644 --- a/teller_desktop/src/lib/modals/backup_modal.svelte +++ b/teller_desktop/src/lib/modals/backup_modal.svelte @@ -57,7 +57,7 @@

You are about to create a backup of {worldName}.

-

Select backup locations:

+

Select backup locations:

    {#each locations as location (location.id)}
  • diff --git a/teller_desktop/src/lib/world_list_item.svelte b/teller_desktop/src/lib/world_list_item.svelte index 90d6c30..fc65c98 100644 --- a/teller_desktop/src/lib/world_list_item.svelte +++ b/teller_desktop/src/lib/world_list_item.svelte @@ -67,7 +67,7 @@
    -
    +

    {world.name}

    diff --git a/teller_desktop/src/routes/local/+layout.svelte b/teller_desktop/src/routes/local/+layout.svelte index f04faa1..f80b171 100644 --- a/teller_desktop/src/routes/local/+layout.svelte +++ b/teller_desktop/src/routes/local/+layout.svelte @@ -4,14 +4,12 @@ import { goto } from '$app/navigation'; import Icon from '@iconify/svelte'; import { invoke } from '@tauri-apps/api/tauri'; - import { WebviewWindow } from '@tauri-apps/api/window'; import { listen } from '@tauri-apps/api/event'; - import type { CurrentDir } from '$lib/types/navigation'; import { activeItem, currentDir, currentVault } from '$lib/stores/navigation'; import { SvelteToast, toast } from '@zerodevx/svelte-toast'; import { Modals, closeModal, openModal } from 'svelte-modals'; - import DirectoriesModal from '$lib/modals/directories_modal.svelte'; import SettingsModal from '$lib/modals/settings_modal.svelte'; + import type { CurrentDir } from '$lib/types/navigation'; import type { DirectorySettings } from '$lib/types/config'; import type { BackupSettings } from '$lib/types/backups'; import type { ToastEvent } from '$lib/types/events'; @@ -24,28 +22,11 @@ let localVaults: Record; - invoke('plugin:config|get_save_folders').then((result) => { - if (result) { - save_paths = result as DirectorySettings; - - let tempPaths: string[] = []; - for (let category in save_paths.categories) { - tempPaths = Object.keys(save_paths.categories[category].paths); - } - paths = tempPaths; - } else { - console.log(result); - } - }); + let activeTab = 'local'; - invoke('plugin:config|get_backup_settings').then((result) => { - if (result) { - let backupSettings = result as BackupSettings; - localVaults = backupSettings.vaults as Record; - } else { - console.log(result); - } - }); + const switchTab = (tab: string) => { + activeTab = tab; + }; onMount(() => { sideBar = document.querySelector('.side-bar'); @@ -62,7 +43,6 @@ console.log(result); } }); - console.log('Event received: saves_config_updated'); }); listen('error', (event) => { @@ -81,13 +61,50 @@ }); }); + invoke('plugin:config|get_save_folders').then((result) => { + if (result) { + save_paths = result as DirectorySettings; + + let tempPaths: string[] = []; + for (let category in save_paths.categories) { + tempPaths = Object.keys(save_paths.categories[category].paths); + } + paths = tempPaths; + } else { + toast.push('Failed to get save folders', { + theme: { + '--toastBackground': '#EF4444', + '--toastProgressBackground': '#F87171', + '--toastProgressText': '#fff', + '--toastColor': '#fff' + } + }); + } + }); + + invoke('plugin:config|get_backup_settings').then((result) => { + if (result) { + let backupSettings = result as BackupSettings; + localVaults = backupSettings.vaults as Record; + } else { + toast.push('Failed to fetch settings', { + theme: { + '--toastBackground': '#EF4444', + '--toastProgressBackground': '#F87171', + '--toastProgressText': '#fff', + '--toastColor': '#fff' + } + }); + } + }); + const toggleSideBar = () => { if (sideBar) { sideBar.classList.toggle('collapse'); } }; - async function handleItemClick(item: CurrentDir) { + async function handleLocationChange(item: CurrentDir) { if (item?.type === 'world') { currentDir.set(item); await goto(`/local/worlds/${item.category}/${item.path}`); @@ -98,17 +115,7 @@ activeItem.set(item); } - function handleSettingsClick() { - openModal(SettingsModal); - } - const options = {}; - - let activeTab = 'local'; - - const switchTab = (tab: string) => { - activeTab = tab; - };
    @@ -116,10 +123,10 @@

    ChunkVault

    - v0.1 +
    - @@ -135,7 +142,7 @@
  • - + {#if refresh} +
    + +

    Refreshing...

    +
    + {:else} + + {/if}
    {/if} diff --git a/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/+page.svelte b/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/+page.svelte index b1b5019..fb2cd31 100644 --- a/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/+page.svelte +++ b/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/+page.svelte @@ -19,9 +19,12 @@ let loading = true; let error = false; + let refresh = false; + let timer: NodeJS.Timeout; - function handleWorldListUpdate() { + function handleWorldListUpdate(isRefresh?: boolean) { + refresh = isRefresh || false; invoke('plugin:config|get_folder_path', { dirName: $page.params.pathName, category: $page.params.categoryName @@ -53,6 +56,7 @@ }) .finally(() => { loading = false; + refresh = false; }); }); } @@ -169,13 +173,23 @@ -
    - + {#if refresh} +
    + +

    Refreshing...

    +
    + {:else} + + {/if}
    {:else}
    diff --git a/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/[worldId]/player/[playerId]/+page.svelte b/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/[worldId]/player/[playerId]/+page.svelte index 94cadcc..825a0db 100644 --- a/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/[worldId]/player/[playerId]/+page.svelte +++ b/teller_desktop/src/routes/local/worlds/[categoryName]/[pathName]/[worldId]/player/[playerId]/+page.svelte @@ -22,7 +22,6 @@ world_path = world_res; if (world_path) { - console.log(world_path); const player_res = await invoke('plugin:world_handler|get_player_from_uuid', { playerUuid: $page.params.playerId, path: world_path @@ -38,7 +37,9 @@ } catch (err) { console.log(err); error = true; - // goto('/local'); + goto( + `/local/worlds/${$page.params.categoryName}/${$page.params.pathName}/${$page.params.worldId}` + ); } finally { loading = false; }