diff --git a/python/admin.py b/python/admin.py index cc0573d..781bc1a 100644 --- a/python/admin.py +++ b/python/admin.py @@ -1,12 +1,16 @@ +import random import socket SERVER_IP = "127.0.0.1" PORT = 5901 +input = random.randint(1, 1000) + # Manually set the starting "input" for the first team s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((SERVER_IP, PORT)) # Using "0" as the ID for the very first team's source -s.send("ADMIN SET 0 80".encode()) # Sets the first clue as 80 +s.send(f"ADMIN SET 0 {input}".encode()) # Sets the first clue as 80 +print(f"Input of {input} Set") print(s.recv(1024).decode()) s.close() diff --git a/python/team.py b/python/team.py index 65a6a8f..377c0ae 100644 --- a/python/team.py +++ b/python/team.py @@ -12,7 +12,7 @@ while True: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((SERVER_IP, PORT)) s.send(f"GET {PREV_ID}".encode()) - input = s.recv(1024).decode().strip() + input = s.recv(1024).decode().strip() # Clue is called input in the code s.close() if input != "-1": # -1 Means Clue Is Not Yet Sent diff --git a/src/main.rs b/src/main.rs index fd75308..419316b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,7 +33,6 @@ async fn handle_connection(mut socket: TcpStream, db: Db) -> std::io::Result<()> let mut buf = [0; 1024]; let n = socket.read(&mut buf).await?; - // Connection closed if n == 0 { return Ok(()); } @@ -46,25 +45,29 @@ async fn handle_connection(mut socket: TcpStream, db: Db) -> std::io::Result<()> } match parts[0].to_uppercase().as_str() { - // Teams submit their solution: PUT [team_id] [value] "PUT" => { if parts.len() == 3 { let team_id = parts[1].to_string(); - let val = parts[2].to_string(); + let val_str = parts[2]; - let mut data = db.write().await; // Async lock - data.insert(team_id.clone(), val.clone()); - - socket.write_all(b"ACK\n").await?; - println!("[LOG] Team {} submitted solution: {}", team_id, val); + // Validate if the value is an integer + if val_str.parse::().is_ok() { + let mut data = db.write().await; + data.insert(team_id.clone(), val_str.to_string()); + socket.write_all(b"ACK\n").await?; + println!("[LOG] Team {} submitted solution: {}", team_id, val_str); + } else { + // Send error but don't stop the server + socket.write_all(b"ERR_NOT_AN_INT\n").await?; + println!("[WARN] Team {} tried to send non-int: {}", team_id, val_str); + } } } - // Teams request previous solution: GET [prev_team_id] "GET" => { if parts.len() == 2 { let target_id = parts[1]; - let data = db.read().await; // Async lock + let data = db.read().await; let response = data .get(target_id) @@ -75,17 +78,20 @@ async fn handle_connection(mut socket: TcpStream, db: Db) -> std::io::Result<()> } } - // Admin override: ADMIN SET [team_id] [value] "ADMIN" => { if parts.len() == 4 && parts[1].to_uppercase() == "SET" { let team_id = parts[2].to_string(); - let val = parts[3].to_string(); + let val_str = parts[3]; - let mut data = db.write().await; - data.insert(team_id.clone(), val.clone()); - - socket.write_all(b"ADMIN_OK\n").await?; - println!("[ADMIN] Manual set: Team {} -> {}", team_id, val); + if val_str.parse::().is_ok() { + let mut data = db.write().await; + data.insert(team_id.clone(), val_str.to_string()); + socket.write_all(b"ADMIN_OK\n").await?; + println!("[ADMIN] Manual set: Team {} -> {}", team_id, val_str); + } else { + socket.write_all(b"ADMIN_ERR_NOT_AN_INT\n").await?; + println!("[ADMIN] Manual set failed: {} is not an int", val_str); + } } }