diff --git a/client/client.lua b/client/client.lua index 21c1706..537cd08 100644 --- a/client/client.lua +++ b/client/client.lua @@ -1,5 +1,9 @@ -local port = "48228" -local endpoint = "http://" .. ipaddr .. ":" .. port +local endpoint = "http://" .. ipaddr .. ":" +if port then + endpoint = endpoint .. port +else + endpoint = endpoint .. "48228" +end local args = {...} local function update() diff --git a/server/Cargo.toml b/server/Cargo.toml index 17ae058..629de4b 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -16,6 +16,7 @@ future-parking_lot = "0.3.3" hilbert_index = "0.2.0" hyper = "1.0.1" hyper-util = "0.1.1" +indoc = "2.0.4" nalgebra = { version = "0.32.3", features = ["serde-serialize"] } parking_lot = { version = "0.11", features = ["serde"] } pathfinding = "4.6.0" diff --git a/server/Makefile b/server/Makefile index 47f2aaa..e33165d 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,9 +1,19 @@ -.PHONY: server server-opt -server: surnames.txt names.txt ipaddr.txt - GLOBAL_IP=$(cat ipaddr.txt) cargo run +DEVPORT=1505 +DEVFILE="offline-state.json" +PRODPORT=48228 +PRODFILE="state.json" + +MANIFEST=../Cargo.toml + +.PHONY: local global +local: surnames.txt names.txt ipaddr.txt + echo '"localhost"' > ipaddr.txt + cargo run $(DEVPORT) $(DEVFILE) -server-opt: surnames.txt names.txt ipaddr.txt - GLOBAL_IP=$(cat ipaddr.txt) cargo run --release +global: surnames.txt names.txt ipaddr.txt + make -B ipaddr.txt + mkdir -p prod + cd prod; cargo run --release $(PRODPORT) $(PRODFILE) surnames.txt: curl https://raw.githubusercontent.com/Hyneman/moby-project/672f6bdca054c42d375f065ffee87e8ceba0c242/moby/mwords/21986na.mes |\ diff --git a/server/src/main.rs b/server/src/main.rs index 3bf1fe8..86f3fed 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,6 +1,6 @@ #![feature(iter_map_windows)] -use std::{collections::VecDeque, io::ErrorKind, sync::Arc}; +use std::{collections::VecDeque, io::ErrorKind, sync::Arc, env::args}; use anyhow::{Context, Error, Ok}; use axum::{ @@ -10,6 +10,7 @@ use axum::{ Json, Router, }; use blocks::{World, Position, Vec3}; +use indoc::formatdoc; use mine::TurtleMineJob; use rstar::{self, AABB, RTree}; @@ -18,12 +19,12 @@ use hyper::body::Incoming; use nalgebra::Vector3; use names::Name; use serde::{Deserialize, Serialize}; -use tokio::sync::{ +use tokio::{sync::{ watch::{self}, - Mutex, RwLock, mpsc -}; + Mutex, RwLock, mpsc, OnceCell +}, fs}; use tower::Service; -use turtle::{TurtleTask, Iota, Receiver, Sender, Turtle, TurtleUpdate, TurtleInfo, TurtleCommand, TurtleCommander}; +use turtle::{TurtleTask, Iota, Receiver, Sender, Turtle, TurtleUpdate, TurtleInfo, TurtleCommand, TurtleCommander, TurtleCommandResponse}; use crate::{blocks::Block, paths::route}; @@ -71,14 +72,26 @@ impl LiveState { } +static PORT: OnceCell = OnceCell::const_new(); +static SAVE: OnceCell = OnceCell::const_new(); type SharedControl = Arc>; #[tokio::main] async fn main() -> Result<(), Error> { + let mut args = args().skip(1); + PORT.set(match args.next() { + Some(port) => port.parse()?, + None => 48228, + })?; + SAVE.set(match args.next() { + Some(file) => file, + None => "state.json".to_string(), + })?; + let state = match tokio::fs::OpenOptions::new() .read(true) - .open("state.json") + .open(SAVE.get().unwrap()) .await { tokio::io::Result::Ok(file) => serde_json::from_reader(file.into_std().await)?, @@ -109,7 +122,10 @@ async fn main() -> Result<(), Error> { .route("/flush", get(flush)) .with_state(state.clone()); - let server = safe_kill::serve(server).await; + let listener = tokio::net::TcpListener::bind(("0.0.0.0", *PORT.get().unwrap())) + .await.unwrap(); + + let server = safe_kill::serve(server, listener).await; println!("writing"); write_to_disk(state.read().await.save().await).await?; @@ -127,7 +143,7 @@ async fn flush(State(state): State) -> &'static str { async fn write_to_disk(state: SavedState) -> anyhow::Result<()> { let json = serde_json::to_string_pretty(&state)?; - tokio::fs::write("state.json", json).await?; + tokio::fs::write(SAVE.get().unwrap(), json).await?; Ok(()) } @@ -253,11 +269,14 @@ async fn command( ) } -async fn client() -> &'static str { - formatcp!( - "local ipaddr = {}\n{}", +async fn client() -> String { + formatdoc!(r#" + local ipaddr = {} + local port = "{}" + {}"#, include_str!("../ipaddr.txt"), - include_str!("../../client/client.lua") + PORT.get().unwrap(), + fs::read_to_string("../client/client.lua").await.unwrap(), // TODO: cache handle if bottleneck ) } diff --git a/server/src/safe_kill.rs b/server/src/safe_kill.rs index 7bb1292..0199e99 100644 --- a/server/src/safe_kill.rs +++ b/server/src/safe_kill.rs @@ -1,3 +1,4 @@ +use tokio::net::TcpListener; use tokio::signal; use std; @@ -18,11 +19,7 @@ use tokio::sync::watch::Sender; use axum::Router; -pub(crate) async fn serve(server: Router) -> Sender<()> { - let listener = tokio::net::TcpListener::bind("0.0.0.0:48228") - .await - .unwrap(); - +pub(crate) async fn serve(server: Router, listener: TcpListener) -> Sender<()> { let (close_tx, close_rx) = watch::channel(()); loop { diff --git a/server/src/turtle.rs b/server/src/turtle.rs index 4486827..1cd12db 100644 --- a/server/src/turtle.rs +++ b/server/src/turtle.rs @@ -303,15 +303,13 @@ pub(crate) async fn process_turtle_update( return Ok(TurtleCommand::Update); } - if turtle.fuel != update.fuel { + if turtle.fuel > update.fuel { let diff = turtle.fuel - update.fuel; turtle.fuel = update.fuel; - if diff > 0 { - let delta = turtle.queued_movement * diff as i32; + let delta = turtle.queued_movement * diff as i32; - turtle.position.pos += delta; - } + turtle.position.pos += delta; turtle.queued_movement = Vec3::zeros(); }