diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/customer/mod.rs | 14 | ||||
-rw-r--r-- | server/src/game.rs | 1 | ||||
-rw-r--r-- | server/src/main.rs | 25 | ||||
-rw-r--r-- | server/src/protocol.rs | 3 | ||||
-rw-r--r-- | server/src/state.rs | 33 |
5 files changed, 56 insertions, 20 deletions
diff --git a/server/src/customer/mod.rs b/server/src/customer/mod.rs index 92e6e94c..f90b2eb2 100644 --- a/server/src/customer/mod.rs +++ b/server/src/customer/mod.rs @@ -165,6 +165,13 @@ impl DemandState { persist: true, }, )); + packets_out.push(( + id, + PacketS::Communicate { + message: Some(Message::Effect("angry".to_string())), + persist: false, + }, + )); let path = find_path( &self.walkable, p.movement.position.as_ivec2(), @@ -205,6 +212,13 @@ impl DemandState { message: None, }, )); + packets_out.push(( + id, + PacketS::Communicate { + message: Some(Message::Effect("satisfied".to_string())), + persist: false, + }, + )); for edge in [true, false] { packets_out.push((id, PacketS::Interact { pos, edge })) } diff --git a/server/src/game.rs b/server/src/game.rs index 4f609608..96cfa93a 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -106,6 +106,7 @@ impl Game { self.unload(); self.data = gamedata.into(); + self.points = 0; for (&p, (tile, item)) in &self.data.initial_map { self.tiles.insert( diff --git a/server/src/main.rs b/server/src/main.rs index 5b191365..68927eaa 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -143,18 +143,25 @@ async fn run() -> anyhow::Result<()> { while let Some(Ok(message)) = read.next().await { match message { Message::Text(line) => { - let Ok(packet): Result<PacketS, _> = serde_json::from_str(&line) else { - warn!("invalid json over ws"); - break; + let packet = match serde_json::from_str(&line) { + Ok(p) => p, + Err(e) => { + warn!("invalid packet: {e}"); + break; + } }; debug!("<- {id:?} {packet:?}"); - if let Err(e) = state.write().await.packet_in(id, packet).await { - warn!("client error: {e}"); - let _ = error_tx - .send(PacketC::Error { + let packet_out = match state.write().await.packet_in(id, packet).await { + Ok(packets) => packets, + Err(e) => { + warn!("client error: {e}"); + vec![PacketC::Error { message: format!("{e}"), - }) - .await; + }] + } + }; + for packet in packet_out { + let _ = error_tx.send(packet).await; } } Message::Close(_) => break, diff --git a/server/src/protocol.rs b/server/src/protocol.rs index 6ed34a65..39bc0887 100644 --- a/server/src/protocol.rs +++ b/server/src/protocol.rs @@ -134,6 +134,9 @@ pub enum PacketC { message: Option<Message>, persist: bool, }, + ServerMessage { + text: String, + }, Score { points: i64, demands_failed: usize, diff --git a/server/src/state.rs b/server/src/state.rs index da05f33a..41ffce20 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -45,26 +45,37 @@ impl State { let _ = self.tx.send(p); } } - pub async fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<()> { + pub async fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<Vec<PacketC>> { match &packet { PacketS::Communicate { message: Some(Message::Text(text)), persist: false, } if let Some(command) = text.strip_prefix("/") => { - self.handle_command( - player, - Command::try_parse_from( - shlex::split(command) - .ok_or(anyhow!("quoting invalid"))? - .into_iter(), - )?, - ) - .await?; - return Ok(()); + match self.handle_command_parse(player, command).await { + Ok(()) => return Ok(vec![]), + Err(e) => { + return Ok(vec![PacketC::ServerMessage { + text: format!("{e}"), + }]); + } + } } _ => (), } self.game.packet_in(player, packet)?; + Ok(vec![]) + } + + async fn handle_command_parse(&mut self, player: PlayerID, command: &str) -> Result<()> { + self.handle_command( + player, + Command::try_parse_from( + shlex::split(command) + .ok_or(anyhow!("quoting invalid"))? + .into_iter(), + )?, + ) + .await?; Ok(()) } |