/*
* This file is part of laurelin/server
* Copyright (C) 2023 Jonni Liljamo <jonni@liljamo.com>
*
* Licensed under GPL-3.0-only.
* See LICENSE for licensing information.
*/
use std::vec;
use bevy_ecs::{
event::EventReader,
system::{Res, ResMut},
};
use laurelin_shared::{
api::{
game::{
all_forming, create, my_games, ResponseAllForming, ResponseCreateGame, ResponseMyGames,
},
user::{self, ResponseInfo},
},
server::{
channels::{CookieRefreshChannel, DataRequestChannel},
messages::{CookieRefresh, DataRequest, DataRequestResponse, DataRequestType},
},
types::game::GamePub,
};
use naia_bevy_server::{events::MessageEvents, Server};
use crate::{Config, Global};
pub(crate) fn message_events(
mut ev: EventReader<MessageEvents>,
mut server: Server,
config: Res<Config>,
mut global: ResMut<Global>,
) {
for events in ev.iter() {
for (user_key, request) in events.read::<DataRequestChannel, DataRequest>() {
match DataRequestType::from_u8(&request.r#type) {
DataRequestType::GameCreate => {
// TODO: handle
let cookie = global.user_to_session_map.get(&user_key).unwrap();
let wrapped = create(&config.api_address, cookie);
let game = match wrapped.response {
ResponseCreateGame::Error(_err) => None, // TODO: handle
ResponseCreateGame::Valid(result) => Some(result),
};
let mut games_pub = vec![];
if let Some(game) = game {
games_pub.push(GamePub::from_game(&game));
}
server.send_message::<DataRequestChannel, DataRequestResponse>(
&user_key,
&DataRequestResponse::new(request.r#type, None, Some(games_pub)),
);
// update cookie
global
.user_to_session_map
.insert(user_key, wrapped.cookie.clone());
server.send_message::<CookieRefreshChannel, CookieRefresh>(
&user_key,
&CookieRefresh::new(&wrapped.cookie),
);
}
DataRequestType::GameAllForming => {
// TODO: handle
let cookie = global.user_to_session_map.get(&user_key).unwrap();
let wrapped = all_forming(&config.api_address, cookie);
let games = match wrapped.response {
ResponseAllForming::Error(_err) => vec![], // TODO: handle
ResponseAllForming::Valid(result) => result,
};
let mut games_pub = vec![];
for game in games {
games_pub.push(GamePub::from_game(&game));
}
server.send_message::<DataRequestChannel, DataRequestResponse>(
&user_key,
&DataRequestResponse::new(request.r#type, None, Some(games_pub)),
);
// update cookie
global
.user_to_session_map
.insert(user_key, wrapped.cookie.clone());
server.send_message::<CookieRefreshChannel, CookieRefresh>(
&user_key,
&CookieRefresh::new(&wrapped.cookie),
);
}
DataRequestType::GameMyGames => {
// TODO: handle
let cookie = global.user_to_session_map.get(&user_key).unwrap();
let wrapped = my_games(&config.api_address, cookie);
let games = match wrapped.response {
ResponseMyGames::Error(_err) => vec![], // TODO: handle
ResponseMyGames::Valid(result) => result,
};
let mut games_pub = vec![];
for game in games {
games_pub.push(GamePub::from_game(&game));
}
server.send_message::<DataRequestChannel, DataRequestResponse>(
&user_key,
&DataRequestResponse::new(request.r#type, None, Some(games_pub)),
);
// update cookie
global
.user_to_session_map
.insert(user_key, wrapped.cookie.clone());
server.send_message::<CookieRefreshChannel, CookieRefresh>(
&user_key,
&CookieRefresh::new(&wrapped.cookie),
);
}
DataRequestType::PubUserDetails => {
// TODO: handle
let cookie = global.user_to_session_map.get(&user_key).unwrap();
let wrapped = user::info(
&config.api_address,
&request.data.unwrap_or("".to_string()),
cookie,
);
let user_details = match wrapped.response {
ResponseInfo::Error(_err) => {
panic!("I can't be bothered to handle this right now.")
}
ResponseInfo::Ok(result) => result,
};
server.send_message::<DataRequestChannel, DataRequestResponse>(
&user_key,
&DataRequestResponse::new(request.r#type, Some(vec![user_details]), None),
);
// update cookie
global
.user_to_session_map
.insert(user_key, wrapped.cookie.clone());
server.send_message::<CookieRefreshChannel, CookieRefresh>(
&user_key,
&CookieRefresh::new(&wrapped.cookie),
);
}
}
}
}
}