From cf4f15f509251954eb5c3d022a65944398ce392c Mon Sep 17 00:00:00 2001 From: clizia Date: Thu, 9 Jan 2025 02:14:48 +0100 Subject: [PATCH] implemented draw and made experimental version of players and lobby --- Cargo.lock | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 + src/card.rs | 6 +- src/deck.rs | 20 +++++-- src/lobby.rs | 30 ++++++++++ src/main.rs | 9 ++- src/player.rs | 18 +++++- 7 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 src/lobby.rs diff --git a/Cargo.lock b/Cargo.lock index 4913528..e13750b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,6 +72,17 @@ version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +[[package]] +name = "async-trait" +version = "0.1.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -99,6 +110,15 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -156,6 +176,35 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "durak-frthistime" version = "0.1.0" @@ -163,6 +212,9 @@ dependencies = [ "anyhow", "clap", "rand", + "serde", + "serde_json", + "sha256", "tokio", ] @@ -176,6 +228,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.3.0-rc.0" @@ -197,12 +259,24 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + [[package]] name = "js-sys" version = "0.3.76" @@ -397,12 +471,74 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.135" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -474,6 +610,12 @@ dependencies = [ "syn", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.14" @@ -486,6 +628,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index 33e5cf3..17e066d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,3 +8,6 @@ rand = "0.9.0-beta.1" clap = "4.5.23" tokio = { version = "1.42.0", features = ["full"] } anyhow = "1.0.95" +serde_json = "1.0.135" +serde = { version = "1.0.217", features = ["derive"] } +sha256 = "1.5.0" diff --git a/src/card.rs b/src/card.rs index 85c0d99..ff1b224 100644 --- a/src/card.rs +++ b/src/card.rs @@ -1,10 +1,12 @@ -#[derive(Debug)] +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Serialize, Deserialize)] pub struct Card { pub suit: Suit, pub value: u8, } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub enum Suit { Hearts, Diamonds, diff --git a/src/deck.rs b/src/deck.rs index b34e17e..4d71bff 100644 --- a/src/deck.rs +++ b/src/deck.rs @@ -1,9 +1,9 @@ -use crate::card::Card; -use crate::card::Suit; - use rand::seq::SliceRandom; use rand::rng; +use crate::card::Card; +use crate::card::Suit; + pub struct Deck { pub deck: Vec, } @@ -41,7 +41,17 @@ impl Deck { self } - pub fn draw(mut self) -> Card { - todo!() + pub fn draw(mut self, n: u8) -> Vec { + if n as usize > self.deck.len() { + let drawn: Vec = self.deck + .drain(0..) + .collect(); + drawn + } else { + let drawn: Vec = self.deck + .drain(0..n as usize) + .collect(); + drawn + } } } diff --git a/src/lobby.rs b/src/lobby.rs new file mode 100644 index 0000000..8b5c283 --- /dev/null +++ b/src/lobby.rs @@ -0,0 +1,30 @@ +use crate::{deck::Deck, player::Player}; + +pub struct Lobby { + players: Vec, + deck: Deck, +} + +impl Lobby { + pub fn new() -> Lobby { + let players: Vec = Vec::new(); + let deck = Deck::new().shuffle(); + + Lobby { + players, + deck, + } + } + + pub fn join_lobby(mut self, player: Player) { + self.players.push(player); + } + + pub fn get_players(self) -> Vec { + self.players + } + + pub fn get_deck(self) -> Deck { + self.deck + } +} diff --git a/src/main.rs b/src/main.rs index 0cf6de4..f47edbd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,13 @@ use anyhow::Result; use tokio::net::{TcpListener, TcpStream}; -use tokio::io::AsyncWriteExt; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; use deck::Deck; mod card; mod deck; mod player; +mod lobby; #[tokio::main] async fn main() -> Result<(), anyhow::Error> { @@ -14,7 +15,11 @@ async fn main() -> Result<(), anyhow::Error> { loop { match listener.accept().await { - Ok((_socket, addr)) => println!("new client: {:?}", addr), + Ok((mut socket, addr)) => { + println!("new client: {:?}", addr); + socket.write_all(b"ciao").await?; + socket.flush().await?; + }, Err(e) => println!("couldn't get client: {:?}", e), } } diff --git a/src/player.rs b/src/player.rs index a4392c9..11d7177 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,20 +1,36 @@ use std::net::SocketAddr; +use serde::{Deserialize, Serialize}; +use sha256::digest; use crate::card::Card; +#[derive(Serialize, Deserialize)] pub struct Player { // addr will change because at this stage i really // don't know what i am doing // it will probably be something like id or playerid // or some other identifier idk pub addr: SocketAddr, + // same goes for id because rn it's just the sha256 of + // the ip + pub id: String, pub name: String, pub hand: Vec, } impl Player { pub fn new(addr: SocketAddr, name: &str) -> Player { - todo!() + let hand_empty: Vec = Vec::new(); + + let to_digest: String = addr.to_string(); + let id = digest(to_digest); + + Player { + addr, + id, + name: name.to_string(), + hand: hand_empty, + } } pub fn get_addr(self) -> SocketAddr {