/* * This file is part of laurelin_client * Copyright (C) 2023 Jonni Liljamo * * Licensed under GPL-3.0-only. * See LICENSE for licensing information. */ use crate::{api::game::Game, game_status::GameStatus, plugins::game::GameData}; use bevy::{ prelude::*, tasks::{AsyncComputeTaskPool, Task}, }; use futures_lite::future; #[derive(Component)] pub struct ParseGameStatus(Task); #[derive(Clone)] pub struct ParseGameStatusEvent { pub game: Game, } pub fn start_call(mut commands: Commands, mut start_ev_r: EventReader) { for ev in start_ev_r.iter() { let thread_pool = AsyncComputeTaskPool::get(); let ev = ev.clone(); let task = thread_pool.spawn(async move { GameStatus::new(&ev.game) }); commands.spawn(ParseGameStatus(task)); } } pub fn handle_call( mut commands: Commands, mut tasks: Query<(Entity, &mut ParseGameStatus)>, mut game_data: ResMut, ) { if let Ok((entity, mut task)) = tasks.get_single_mut() { if let Some(response) = future::block_on(future::poll_once(&mut task.0)) { game_data.game_status = Some(response); game_data.parsing_data = false; // remove the task commands.entity(entity).remove::(); commands.entity(entity).despawn_recursive(); } } }