added error handling, random input etc
This commit is contained in:
@@ -1,12 +1,16 @@
|
|||||||
|
import random
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
SERVER_IP = "127.0.0.1"
|
SERVER_IP = "127.0.0.1"
|
||||||
PORT = 5901
|
PORT = 5901
|
||||||
|
|
||||||
|
input = random.randint(1, 1000)
|
||||||
|
|
||||||
# Manually set the starting "input" for the first team
|
# Manually set the starting "input" for the first team
|
||||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
s.connect((SERVER_IP, PORT))
|
s.connect((SERVER_IP, PORT))
|
||||||
# Using "0" as the ID for the very first team's source
|
# 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())
|
print(s.recv(1024).decode())
|
||||||
s.close()
|
s.close()
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ while True:
|
|||||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
s.connect((SERVER_IP, PORT))
|
s.connect((SERVER_IP, PORT))
|
||||||
s.send(f"GET {PREV_ID}".encode())
|
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()
|
s.close()
|
||||||
|
|
||||||
if input != "-1": # -1 Means Clue Is Not Yet Sent
|
if input != "-1": # -1 Means Clue Is Not Yet Sent
|
||||||
|
|||||||
40
src/main.rs
40
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 mut buf = [0; 1024];
|
||||||
let n = socket.read(&mut buf).await?;
|
let n = socket.read(&mut buf).await?;
|
||||||
|
|
||||||
// Connection closed
|
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return Ok(());
|
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() {
|
match parts[0].to_uppercase().as_str() {
|
||||||
// Teams submit their solution: PUT [team_id] [value]
|
|
||||||
"PUT" => {
|
"PUT" => {
|
||||||
if parts.len() == 3 {
|
if parts.len() == 3 {
|
||||||
let team_id = parts[1].to_string();
|
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
|
// Validate if the value is an integer
|
||||||
data.insert(team_id.clone(), val.clone());
|
if val_str.parse::<i32>().is_ok() {
|
||||||
|
let mut data = db.write().await;
|
||||||
socket.write_all(b"ACK\n").await?;
|
data.insert(team_id.clone(), val_str.to_string());
|
||||||
println!("[LOG] Team {} submitted solution: {}", team_id, val);
|
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" => {
|
"GET" => {
|
||||||
if parts.len() == 2 {
|
if parts.len() == 2 {
|
||||||
let target_id = parts[1];
|
let target_id = parts[1];
|
||||||
let data = db.read().await; // Async lock
|
let data = db.read().await;
|
||||||
|
|
||||||
let response = data
|
let response = data
|
||||||
.get(target_id)
|
.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" => {
|
"ADMIN" => {
|
||||||
if parts.len() == 4 && parts[1].to_uppercase() == "SET" {
|
if parts.len() == 4 && parts[1].to_uppercase() == "SET" {
|
||||||
let team_id = parts[2].to_string();
|
let team_id = parts[2].to_string();
|
||||||
let val = parts[3].to_string();
|
let val_str = parts[3];
|
||||||
|
|
||||||
let mut data = db.write().await;
|
if val_str.parse::<i32>().is_ok() {
|
||||||
data.insert(team_id.clone(), val.clone());
|
let mut data = db.write().await;
|
||||||
|
data.insert(team_id.clone(), val_str.to_string());
|
||||||
socket.write_all(b"ADMIN_OK\n").await?;
|
socket.write_all(b"ADMIN_OK\n").await?;
|
||||||
println!("[ADMIN] Manual set: Team {} -> {}", team_id, val);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user