diff --git a/server/src/googleforms.rs b/server/src/googleforms.rs new file mode 100644 index 0000000..2efe9c7 --- /dev/null +++ b/server/src/googleforms.rs @@ -0,0 +1,45 @@ +use anyhow::Ok; +use axum::{Router, routing::post, extract::State, Json}; +use serde::{Deserialize, Serialize}; +use tracing::{info, error}; + +use crate::{SharedControl, mine::Remove, blocks::Vec3}; + +pub fn forms_api() -> Router { + Router::new() + .route("/registerVeinMine", post(remove_vein)) +} + +#[derive(Serialize, Deserialize)] +struct GoogleFormsRemoveVein{ + #[serde(rename(deserialize = "Block name"))] + block: String, + #[serde(rename(deserialize = "X coordinate"))] + x: String, + #[serde(rename(deserialize = "Y coordinate"))] + y: String, + #[serde(rename(deserialize = "Z coordinate"))] + z: String, +} + +async fn remove_vein( + State(state): State, + Json(req): Json, +) -> &'static str { + match remove_vein_inner(state, req).await { + anyhow::Result::Ok(_) => {}, + anyhow::Result::Err(e) => error!("remove vein request failed: {e}"), + }; + + "ACK" +} + +async fn remove_vein_inner(state: SharedControl, req: GoogleFormsRemoveVein) -> anyhow::Result<()> { + let state = state.read().await; + let mut schedule = state.tasks.lock().await; + let position = { Vec3::new(req.x.parse()?,req.y.parse()?,req.z.parse()?) }; + let block = req.block; + info!("new remove {block} command from the internet at {position}"); + schedule.add_task(Box::new(Remove::new(position,block))); + Ok(()) +} diff --git a/server/src/main.rs b/server/src/main.rs index 420ab82..9aee606 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -39,6 +39,7 @@ mod turtle; mod turtle_api; mod tasks; mod depot; +mod googleforms; static PORT: OnceCell = OnceCell::const_new(); static SAVE: OnceCell = OnceCell::const_new(); @@ -66,6 +67,7 @@ async fn main() -> Result<(), Error> { .with_target("server::turtle", Level::WARN) .with_target("server::paths", Level::ERROR) .with_target("server::turtle_api", Level::INFO) + .with_target("server::googleforms", Level::TRACE) .with_target("server::fell", Level::WARN) .with_target("server::mine", Level::INFO) .with_target("server::depot", Level::TRACE); @@ -124,6 +126,7 @@ async fn main() -> Result<(), Error> { //.route("/turtle/:id/placeUp", get(place_up)) .route("/flush", get(flush)) .nest("/turtle", turtle_api::turtle_api()) + .nest("/forms", googleforms::forms_api()) .layer(TraceLayer::new_for_http()) .with_state(state.clone()); diff --git a/server/src/mine.rs b/server/src/mine.rs index 9953bba..620cb43 100644 --- a/server/src/mine.rs +++ b/server/src/mine.rs @@ -554,7 +554,7 @@ mod tests { } #[derive(Serialize, Deserialize,Clone)] -struct Remove { +pub struct Remove { start: Vec3, block: String, #[serde(skip_deserializing)] @@ -565,7 +565,7 @@ struct Remove { } impl Remove { - fn new(start: Vec3, block: String) -> + pub fn new(start: Vec3, block: String) -> Self { Self { start, block, miners:Default::default(), done: Default::default(), pending: Default::default(),