From 61f388361167ebe826d6f1c090cc1400d516fedd Mon Sep 17 00:00:00 2001 From: clizia Date: Tue, 4 Mar 2025 15:23:27 +0100 Subject: [PATCH] puoi cancellarti ora --- src/bin/client.rs | 43 ++++++++++++++++++++++++++++++++----------- src/message.rs | 2 ++ src/router.rs | 28 +++++++++++++++++++++++++--- src/server.rs | 1 + 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index b129785..02c02ce 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -5,7 +5,7 @@ use clap::builder::NonEmptyStringValueParser; use lib::{client::Client, message::{Message, MessageKind}, message_read::MessageReader, player::Player}; use crossterm::{ cursor, event::{self, poll, Event as TermEvent, KeyCode, KeyModifiers}, execute, queue, style, terminal::{ - disable_raw_mode, enable_raw_mode, Clear, ClearType, EnableLineWrap + disable_raw_mode, enable_raw_mode, Clear, ClearType, EnableLineWrap, EnterAlternateScreen } }; @@ -24,6 +24,22 @@ fn create_message_player(player: &Player) -> anyhow::Result anyhow::Result<()> { + let player_id = &player.name; + let response = client + .get([&addr, "/delete/", &player_id].concat()) + .send().await; + + if let Err(e) = &response { + println!("{e}\n"); + return Ok(()) + } + + println!("{}", response?.text().await?); + + Ok(()) +} + async fn send_player(player: &Player, client: reqwest::Client, addr: &str) -> anyhow::Result<()> { let player_message = create_message_player(&player)?; let response = client @@ -37,21 +53,28 @@ async fn send_player(player: &Player, client: reqwest::Client, addr: &str) -> an return Ok(()) } + println!("{}", response?.text().await?); + Ok(()) } async fn handle_terminal(player: &Player, stdout: &mut Stdout, client: reqwest::Client, addr: &str) -> anyhow::Result<()> { 'handler: loop { - for line in HELP.split('\n') { - queue!(stdout, style::Print(line), cursor::MoveToNextLine(1))?; - } - stdout.flush()?; - while let Ok(_event_happened) = poll(Duration::from_millis(2)) { match event::read().expect("diomerds") { TermEvent::Key(key) => { match (key.code, key.modifiers) { (KeyCode::Char('c'), KeyModifiers::CONTROL) => break 'handler, - (KeyCode::Char('1'), KeyModifiers::NONE) => send_player(&player, client.clone(), addr).await?, + (KeyCode::Char('h'), KeyModifiers::NONE) => { + for line in HELP.split('\n') { + println!("{line}") + } + }, + (KeyCode::Char('1'), KeyModifiers::NONE) => { + send_player(&player, client.clone(), addr).await?; + }, + (KeyCode::Char('2'), KeyModifiers::NONE) => { + delete_player(&player, client.clone(), addr).await?; + }, (_, _) => println!("{:?}\n", key), } }, @@ -65,9 +88,6 @@ async fn handle_terminal(player: &Player, stdout: &mut Stdout, client: reqwest:: #[tokio::main] pub async fn main() -> anyhow::Result<()> { - // let mut client = Client::connect("127.0.0.1", 8080).await?; - // let local_address = client.stream.local_addr()?; - let mut stdout = std::io::stdout(); enable_raw_mode()?; @@ -77,6 +97,7 @@ pub async fn main() -> anyhow::Result<()> { EnableLineWrap, cursor::Show, cursor::EnableBlinking, + EnterAlternateScreen, )?; let player = Player::new()?; @@ -84,7 +105,7 @@ pub async fn main() -> anyhow::Result<()> { let addr = "http://127.0.0.1:8080"; let client = reqwest::Client::new(); - println!("{}", HELP); + // println!("{}", HELP); handle_terminal(&player, &mut stdout, client.clone(), &addr).await?; disable_raw_mode()?; diff --git a/src/message.rs b/src/message.rs index 6dadb34..4b08157 100644 --- a/src/message.rs +++ b/src/message.rs @@ -15,6 +15,8 @@ pub enum MessageKind { Move, CreatePlayer, CreateLobby, + DeletePlayer, + DeleteLobby, } impl Message { diff --git a/src/router.rs b/src/router.rs index c424bdb..f553e2f 100644 --- a/src/router.rs +++ b/src/router.rs @@ -1,9 +1,7 @@ use anyhow::Result; use axum::{ body::Bytes, extract::{ - rejection::JsonRejection, - Json, - State, + rejection::JsonRejection, Json, Path, State }, http::StatusCode, Router @@ -45,6 +43,10 @@ impl App { let mut players = db.players .lock().expect("ciao"); + if players.contains_key(&player.name) { + return Err(StatusCode::UNAVAILABLE_FOR_LEGAL_REASONS) + } + players.insert( player.get_name(), Bytes::copy_from_slice(player.encode().expect("failed encoding player").as_ref()) @@ -58,6 +60,26 @@ impl App { } } + pub async fn delete_player( + State(db): State, + Path(player_id): Path + ) -> Result, StatusCode> { + { + let mut players = db.players + .lock().expect("ciao"); + + match players.contains_key(&player_id) { + true => { + players.remove(&player_id); + println!("{:?}", players); + Ok(Json(Message::new("server", MessageKind::DeletePlayer, "user deleted").expect("a"))) + }, + false => Err(StatusCode::NOT_FOUND), + } + } + + } + pub async fn create_lobby( State(db): State, json_body: Result, JsonRejection>, diff --git a/src/server.rs b/src/server.rs index 2f26503..de06f39 100644 --- a/src/server.rs +++ b/src/server.rs @@ -31,6 +31,7 @@ impl Server { .route("/echo", post(App::echo)) .route("/create/player", post(App::create_player)) .route("/create/lobby", post(App::create_lobby)) + .route("/delete/{player-id}", get(App::delete_player)) .with_state(app.db); axum::serve(listener, router).await.unwrap();