1
Fork 0

auto-update

This commit is contained in:
Andy Killorin 2023-12-16 17:33:29 -06:00
parent 4a4fe37e8e
commit 29a6fd486e
Signed by: ank
GPG key ID: B6241CA3B552BCA4
2 changed files with 79 additions and 8 deletions

View file

@ -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"

View file

@ -78,8 +78,6 @@ type SharedControl = Arc<RwLock<ControlState>>;
#[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")
}