aboutsummaryrefslogtreecommitdiff
path: root/client/src/plugin_client.rs
blob: d998f75c8454786b7efcc0120db90f443724da88 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use std::sync::{Arc, Mutex};
use bevy::input::common_conditions::input_just_pressed;
use bevy::log::info;
use bevy::prelude::{App, Commands, Component, IntoScheduleConfigs, KeyCode, Plugin, PreStartup, Query, ResMut, Startup, Update};
use bevy_tokio_tasks::TokioTasksRuntime;
use nogamepads::entry_mutex;
use nogamepads_core::data::controller::controller_data::ControllerData;
use nogamepads_core::data::controller::controller_runtime::ControllerRuntime;
use nogamepads_core::data::player::player_data::Player;
use nogamepads_core::service::tcp_network::pad_client::pad_client_service::PadClientNetwork;

#[derive(Component)]
struct ClientComponent {
    pad_client: Arc<Mutex<ControllerRuntime>>,
}

pub struct PadClientPlugin;
impl Plugin for PadClientPlugin {
    fn build(&self, app: &mut App) {
        app.add_systems(PreStartup, client_init);
        app.add_systems(Startup, client_start);
        app.add_systems(Update, client_exit.run_if(input_just_pressed(KeyCode::Escape)));
    }
}

fn client_init(
    mut commands: Commands
) {
    let mut controller_data = ControllerData::default();
    controller_data.bind_player(
        Player::register(
            env!("TEST_PLAYER_ACCOUNT").to_string(),
            env!("TEST_PLAYER_PASSWORD").to_string())
    );

    let runtime = controller_data.runtime();

    commands.spawn(
        ClientComponent {
            pad_client: Arc::clone(&runtime),
        }
    );
}

fn client_start(
    client_components: Query<&mut ClientComponent>,
    runtime: ResMut<TokioTasksRuntime>
) {
    for client_component in client_components.iter() {
        let client_runtime = Arc::clone(&client_component.pad_client);
        let network = PadClientNetwork::build(client_runtime);
        let entry = network.build_entry();

        runtime.spawn_background_task(|_ctx| async move {
            entry.await;
            info!("Client finished.")
        });
    }
}

fn client_exit(
    client_components: Query<&mut ClientComponent>
){
    for client_component in client_components.iter() {
        entry_mutex!(client_component.pad_client, |guard| {
            guard.close();
        })
    }
}