From ed8fbcf70c4c465c0f9753d602c0ea4eb3dd44f3 Mon Sep 17 00:00:00 2001 From: clizia Date: Fri, 10 Jan 2025 23:58:42 +0100 Subject: [PATCH] it is now possible to connect and create a player --- src/main.rs | 77 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6e84946..e92d200 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,50 +1,65 @@ +use std::io::{self, Error}; +use std::net::SocketAddr; + +use crate::lobby::Lobby; +use crate::player::Player; + use anyhow::Result; -use tokio::net::{TcpListener, TcpStream}; use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader}; -use tokio::sync::broadcast; +use tokio::net::{TcpListener, TcpStream}; mod card; mod deck; -mod player; mod lobby; +mod player; + +async fn handle_connection(mut stream: TcpStream, addr: SocketAddr) -> (Option, Option) { + let (mut read, mut write) = stream.split(); + + let mut buf = [0; 1024]; + + let mut name = String::new(); + write.write_all(b"provide name\n").await.expect("failed to write to socket"); + + let n = match read.read(&mut buf).await { + Ok(0) => return (None, None), + Ok(n) => n, + Err(e) => { + eprintln!("failed to read from socket; err: {:?}", e); + return (None, None); + }, + }; + + name = String::from_utf8_lossy(&buf[0..n]).to_string(); + +// if let Err(e) = write.write_all(&buf[0..n]).await { +// eprintln!("failed to write to socket; err = {:?}", e); +// return (None, None); +// } + + let player = Player::new(addr, &name); + + write.write_all(b"your name is\n").await.expect("failed to write to socket"); + write.write_all(name.as_bytes()).await.expect("failed to write to socket"); + + (Some(player), None) +} #[tokio::main] -async fn main() -> Result<(), anyhow::Error> { +async fn main() -> io::Result<()> { let address = "127.0.0.1:8080".to_string(); let listener = TcpListener::bind(&address).await?; - let (tx, rx) = broadcast::channel::(10); + let mut lobbies: Vec = Vec::new(); - while let Ok((mut stream,_)) = listener.accept().await { - let tx = tx.clone(); - let mut rx = rx.resubscribe(); + loop { + let (mut stream, addr) = listener.accept().await?; tokio::spawn(async move { - let (read, mut write) = stream.split(); - let mut reader = BufReader::new(read); - let mut line = String::new(); - - loop { - tokio::select! { - bytes_read = reader.read_line(&mut line) => { - if bytes_read.unwrap() == 0 { - println!("connection closed"); - return; - } - tx.send(line.clone()).unwrap(); - }, - msg = rx.recv() => { - write.write_all(format!("> {}", msg.unwrap()).as_bytes()).await.expect("failed to write data"); - line.clear(); - } - } - } + println!("new connection from: {}", addr); + let (player, lobby) = handle_connection(stream, addr).await; }); } Ok(()) } - -async fn spawn(mut stream: TcpStream) -> Result<(), anyhow::Error> { - todo!() -}