From 29a6fd486e5ae66225096f5bbfbc36b77c8f60b1 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:33:29 -0600 Subject: [PATCH] auto-update --- client/client.lua | 71 +++++++++++++++++++++++++++++++++++++++++++--- server/src/main.rs | 16 ++++++++--- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/client/client.lua b/client/client.lua index 0ec50b4..a5e9dc7 100644 --- a/client/client.lua +++ b/client/client.lua @@ -1,10 +1,13 @@ -ipaddr = "68.46.126.104:48228" ---ipaddr = "localhost:48228" +local ipaddr = "68.46.126.104" +local port = "48228" + +local endpoint = "http://" .. ipaddr .. ":" .. port local idfile = fs.open("id", "r") local id = nil local command = nil +local backoff = 0; if not idfile then local fuel = turtle.getFuelLevel() @@ -27,7 +30,7 @@ if not idfile then } -- TODO: get from boot floppy local turtleinfo = http.post( - "http://" .. ipaddr .. "/turtle/new", + endpoint .. "/turtle/new", textutils.serializeJSON(info), { ["Content-Type"] = "application/json" } ) @@ -44,4 +47,64 @@ else idfile.close() end -print(command) +repeat + print(command) + if command == "Wait" then + sleep(5) + elseif command == "Forward" then + turtle.forward() + elseif command == "Backward" then + turtle.backward() + elseif command == "Left" then + turtle.left() + elseif command == "Right" then + turtle.right() + elseif command == "Update" then + local req = http.get(endpoint .. "/turtle/client.lua") + local update = req.readAll() + req.close() + local startup = fs.open("startup", "w") + startup.write(update) + startup.close() + os.reboot() + end + + local ahead = "minecraft:air" + local above = "minecraft:air" + local below = "minecraft:air" + + local a,b = turtle.inspect() + if a then + ahead = b.name + end + + local a,b = turtle.inspectUp() + if a then + above = b.name + end + + local a,b = turtle.inspectDown() + if a then + below = b.name + end + local info = { + fuel = turtle.getFuelLevel(), + ahead = ahead, + above = above, + below = below + } + + local rsp = http.post( + endpoint .. "/turtle/update/" .. id, + textutils.serializeJSON(info), + { ["Content-Type"] = "application/json" } + ) + if rsp then + backoff = 0 + command = textutils.unserialiseJSON(rsp.readAll()) + else + print("C&C server offline, waiting " .. backoff .. " seconds") + sleep(backoff) + backoff = backoff + 1 + end +until command == "Poweroff" diff --git a/server/src/main.rs b/server/src/main.rs index b6f5066..773930a 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -78,8 +78,6 @@ type SharedControl = Arc>; #[tokio::main] async fn main() -> Result<(), Error> { - println!("{}", names::Name::from_num(args().nth(1).unwrap().parse().unwrap()).to_str()); - let state = match fs::File::open("state.json") { Ok(file) => { serde_json::from_reader(file)? @@ -97,6 +95,7 @@ async fn main() -> Result<(), Error> { let serv = Router::new() .route("/turtle/new", post(create_turtle)) .route("/turtle/update/:id", post(command)) + .route("/turtle/client.lua", get(client)) .with_state(state); let listener = tokio::net::TcpListener::bind("0.0.0.0:48228").await.unwrap(); @@ -114,7 +113,9 @@ async fn create_turtle( let id = (turtles.len() + 1) as u32; turtles.push(Turtle::new(id, req.position, req.facing, req.fuel)); - Json(TurtleResponse {name: Name::from_num(id).to_str(), command: TurtleCommand::Wait}) + println!("turt {id}"); + + Json(TurtleResponse {name: Name::from_num(id).to_str(), id, command: TurtleCommand::Wait}) } async fn command( @@ -126,7 +127,7 @@ async fn command( println!("{id}"); - Json(TurtleCommand::Wait) + Json(TurtleCommand::Update) } #[derive(Serialize, Deserialize)] @@ -142,6 +143,8 @@ enum TurtleCommand { DigUp, DigDown, TakeInventory, + Update, + Poweroff, } #[derive(Serialize, Deserialize)] @@ -161,5 +164,10 @@ struct TurtleRegister { #[derive(Serialize, Deserialize)] struct TurtleResponse { name: String, + id: u32, command: TurtleCommand, } + +async fn client() -> &'static str { + include_str!("../../client/client.lua") +}