diff options
Diffstat (limited to 'server/replaytool/src')
-rw-r--r-- | server/replaytool/src/main.rs | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/server/replaytool/src/main.rs b/server/replaytool/src/main.rs index 9b9a9eb2..ee6a8def 100644 --- a/server/replaytool/src/main.rs +++ b/server/replaytool/src/main.rs @@ -16,6 +16,7 @@ */ use anyhow::anyhow; +use async_compression::tokio::{bufread::ZstdDecoder, write::ZstdEncoder}; use clap::Parser; use futures_util::{SinkExt, StreamExt}; use hurrycurry_protocol::{PacketC, PacketS}; @@ -52,7 +53,7 @@ async fn main() -> anyhow::Result<()> { match args { Args::Record { url, output } => { - let mut file = BufWriter::new(File::create(&output).await?); + let mut file = BufWriter::new(ZstdEncoder::new(File::create(&output).await?)); info!("connecting to {url:?}..."); let (mut sock, _) = tokio_tungstenite::connect_async(url).await?; info!("starting recording."); @@ -69,6 +70,9 @@ async fn main() -> anyhow::Result<()> { } }; debug!("<- {packet:?}"); + + let is_end = matches!(packet, PacketC::SetIngame { state: false, .. }); + file.write_all( format!( "{}\n", @@ -80,19 +84,29 @@ async fn main() -> anyhow::Result<()> { ) .as_bytes(), ) - .await? + .await?; + + if is_end { + info!("stopping replay..."); + break; + } } Message::Close(_) => break, _ => (), } } + drop(file); + info!("done") } Args::Replay { input } => { let ws_listener = TcpListener::bind("0.0.0.0:27032").await?; info!("listening for websockets on {}", ws_listener.local_addr()?); loop { - let mut file = BufReader::new(File::open(&input).await?).lines(); + let mut file = + BufReader::new(ZstdDecoder::new(BufReader::new(File::open(&input).await?))) + .lines(); + let mut next_event = serde_json::from_str::<Event>(&file.next_line().await?.ok_or(anyhow!("eof"))?)?; let mut time = 0.; |