player gets added to lobby upon lobby creation

This commit is contained in:
clizia 2025-05-13 19:51:53 +02:00
parent 789e3912d3
commit e6968b6c8d
3 changed files with 34 additions and 19 deletions

View file

@ -23,7 +23,7 @@ impl Lobby {
} }
} }
pub fn join_lobby(mut self, player: Player) { pub fn join_lobby(&mut self, player: Player) {
self.players.push(player); self.players.push(player);
} }

View file

@ -34,7 +34,7 @@ impl App {
pub async fn create_player( pub async fn create_player(
State(db): State<AppState>, State(db): State<AppState>,
json_body: Result<Json<Message>, JsonRejection>, json_body: Result<Json<Message>, JsonRejection>,
) -> Result<axum::Json<Message>, StatusCode> { ) -> Result<axum::Json<Message>, String> {
match json_body { match json_body {
Ok(Json(message)) => { Ok(Json(message)) => {
println!("{:?}", message); println!("{:?}", message);
@ -44,7 +44,7 @@ impl App {
.lock().expect("ciao"); .lock().expect("ciao");
if players.contains_key(&player.name) { if players.contains_key(&player.name) {
return Err(StatusCode::UNAVAILABLE_FOR_LEGAL_REASONS) return Err(String::from("player already in db"))
} }
players.insert( players.insert(
@ -55,42 +55,57 @@ impl App {
Ok(Json(Message::new("server", MessageKind::CreatePlayer, &player.name).expect("failed creating message"))) Ok(Json(Message::new("server", MessageKind::CreatePlayer, &player.name).expect("failed creating message")))
} }
Err(_) => Err(StatusCode::UNPROCESSABLE_ENTITY) Err(_) => Err(String::from("failed parsing json message"))
} }
} }
pub async fn create_lobby( pub async fn create_lobby(
State(db): State<AppState>, State(db): State<AppState>,
json_body: Result<Json<Message>, JsonRejection>, json_body: Result<Json<Message>, JsonRejection>,
) -> Result<axum::Json<Message>, StatusCode> { ) -> Result<axum::Json<Message>, String> {
match json_body { match json_body {
Ok(Json(message)) => { Ok(Json(message)) => {
println!("{:?}", message); println!("{:?}", message);
let lobby: Lobby = Lobby::new(); let mut lobby: Lobby = Lobby::new();
let mut lobbies = db.lobbies let mut lobbies = db.lobbies
.lock().expect("ciao"); .lock()
.expect("failed to lock lobbies db");
if lobbies.contains_key(&lobby.id) { if lobbies.contains_key(&lobby.id) {
return Err(StatusCode::UNAVAILABLE_FOR_LEGAL_REASONS) return Err(String::from("lobby already in db"))
} }
let players = db.players
.lock()
.expect("failed to lock player db");
let player_bytes = players.get(&message.content);
let player: Player = if let None = player_bytes {
return Err(String::from("player not found or not yet created"));
} else {
Player::from(serde_json::from_slice(player_bytes.unwrap()).expect("failed"))
};
lobby.join_lobby(player);
lobbies.insert( lobbies.insert(
lobby.get_id(), lobby.get_id(),
Bytes::copy_from_slice(lobby.encode().expect(&StatusCode::EXPECTATION_FAILED.to_string()).as_ref()) Bytes::copy_from_slice(lobby.encode().expect("failed copying lobby from bytes slice").as_ref())
); );
println!("{:?}", lobbies); println!("{:?}", lobbies);
Ok(Json(Message::new("server", MessageKind::CreateLobby, &lobby.id).expect("failed creating message"))) Ok(Json(Message::new("server", MessageKind::CreateLobby, &lobby.id).expect("failed creating message")))
}, },
Err(_) => Err(StatusCode::UNPROCESSABLE_ENTITY), Err(_) => Err(String::from("failed to parse json message")),
} }
} }
pub async fn delete_player( pub async fn delete_player(
State(db): State<AppState>, State(db): State<AppState>,
Path(player_id): Path<String> Path(player_id): Path<String>
) -> Result<axum::response::Json<Message>, StatusCode> { ) -> Result<axum::response::Json<Message>, String> {
{ {
let mut players = db.players let mut players = db.players
.lock().expect("ciao"); .lock().expect("ciao");
@ -101,7 +116,7 @@ impl App {
println!("{:?}", players); println!("{:?}", players);
Ok(Json(Message::new("server", MessageKind::DeletePlayer, "user deleted").expect("a"))) Ok(Json(Message::new("server", MessageKind::DeletePlayer, "user deleted").expect("a")))
}, },
false => Err(StatusCode::NOT_FOUND), false => Err(String::from("player not found")),
} }
} }
@ -110,7 +125,7 @@ impl App {
pub async fn delete_lobby( pub async fn delete_lobby(
State(db): State<AppState>, State(db): State<AppState>,
Path(lobby_id): Path<String> Path(lobby_id): Path<String>
) -> Result<axum::response::Json<Message>, StatusCode> { ) -> Result<axum::response::Json<Message>, String> {
{ {
let mut lobbies = db.lobbies let mut lobbies = db.lobbies
.lock().expect("ciao"); .lock().expect("ciao");
@ -121,7 +136,7 @@ impl App {
println!("{:?}", lobbies); println!("{:?}", lobbies);
Ok(Json(Message::new("server", MessageKind::DeleteLobby, "lobby deleted").expect("a"))) Ok(Json(Message::new("server", MessageKind::DeleteLobby, "lobby deleted").expect("a")))
}, },
false => Err(StatusCode::NOT_FOUND), false => Err(String::from("lobby not found in db")),
} }
} }
@ -130,7 +145,7 @@ impl App {
pub async fn join_lobby( pub async fn join_lobby(
State(db): State<AppState>, State(db): State<AppState>,
Path(lobby_id): Path<String> Path(lobby_id): Path<String>
) -> Result<axum::response::Json<Message>, StatusCode> { ) -> Result<axum::response::Json<Message>, String> {
todo!() todo!()
} }

View file

@ -89,9 +89,9 @@ async fn handle_key_event(mut client: &mut Client, key_event: KeyEvent) {
} }
}, },
KeyCode::Char('2') => { KeyCode::Char('2') => {
if client.lobby != None { if client.lobby != None || client.user == None {
client.popup_title = "Error".to_string(); client.popup_title = "Error".to_string();
client.popup_content = "lobby already_created".to_string(); client.popup_content = "lobby already_created or player not yet created".to_string();
client.popup = true; client.popup = true;
} else { } else {
let addr = client.addr.clone(); let addr = client.addr.clone();
@ -99,7 +99,7 @@ async fn handle_key_event(mut client: &mut Client, key_event: KeyEvent) {
let message = Message::new( let message = Message::new(
"", "",
MessageKind::CreateLobby, MessageKind::CreateLobby,
"" &client.user_name,
).unwrap(); ).unwrap();
Client::send(&mut client, message, &addr, &path).await.unwrap(); Client::send(&mut client, message, &addr, &path).await.unwrap();