diff options
Diffstat (limited to 'server')
| -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(())      } | 
