This commit is contained in:
2025-11-12 23:19:23 +01:00
parent b66a2764fe
commit 5e340df9d8
2 changed files with 52 additions and 98 deletions
@@ -7,7 +7,7 @@ use std::{
use eyre::bail;
use lanspread_compat::eti::get_games;
use lanspread_db::db::{Game, GameDB};
use lanspread_peer::{EtiGamesLoader, PeerCommand, PeerEvent, start_peer_with_eti_loader};
use lanspread_peer::{PeerCommand, PeerEvent, start_peer};
use tauri::{AppHandle, Emitter as _, Manager};
use tauri_plugin_shell::{ShellExt, process::Command};
use tokio::sync::{RwLock, mpsc::UnboundedSender};
@@ -521,33 +521,39 @@ pub fn run() {
};
if !games_folder.is_empty() {
// Create ETI games loader that can access the Tauri resource
let app_handle_for_loader = app_handle_clone.clone();
let eti_games_loader: EtiGamesLoader = Arc::new(move || {
let app_handle = app_handle_for_loader.clone();
// Use tokio's block_in_place to call async function from sync context
tokio::task::block_in_place(move || {
tokio::runtime::Handle::current().block_on(async move {
// Resolve the game.db resource path
match app_handle.path().resolve("game.db", tauri::path::BaseDirectory::Resource) {
Ok(game_db_path) => {
get_games(&game_db_path).await
}
Err(e) => {
log::error!("Failed to resolve game.db resource: {e}");
Err(eyre::eyre!("Failed to resolve game.db resource: {e}"))
}
}
})
})
});
// Load ETI games from the game.db resource - this MUST succeed
let game_db_path = match app_handle_clone.path().resolve("game.db", tauri::path::BaseDirectory::Resource) {
Ok(path) => path,
Err(e) => {
log::error!("Failed to resolve game.db resource: {e}");
panic!("game.db resource is mandatory - cannot continue");
}
};
let eti_games = match get_games(&game_db_path).await {
Ok(games) => {
log::info!("Loaded {} ETI games from game.db", games.len());
games
}
Err(e) => {
log::error!("Failed to load ETI games: {e}");
panic!("game.db resource is mandatory - cannot continue");
}
};
// Convert ETI games to GameDB and store in state
let games: Vec<Game> = eti_games.into_iter().map(Into::into).collect();
{
let state = app_handle_clone.state::<LanSpreadState>();
*state.games.write().await = GameDB::from(games);
}
// Only start peer system when we have a valid games directory
match start_peer_with_eti_loader(games_folder, tx_peer_event_clone, Some(eti_games_loader)) {
match start_peer(games_folder, tx_peer_event_clone) {
Ok(peer_ctrl) => {
let state = app_handle_clone.state::<LanSpreadState>();
*state.peer_ctrl.write().await = Some(peer_ctrl);
log::info!("Peer system initialized successfully with games directory and ETI loader");
log::info!("Peer system initialized successfully with games directory");
// Start peer discovery and request games from other peers
request_games(state);