diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-08 19:40:52 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-08 19:40:52 +0200 |
commit | b43be80a63e54948656313d9862e0523a3aed31f (patch) | |
tree | 2c88d1c25594d7f2ded1ab46cb3a052fa33e9a26 /server | |
parent | aeeb376c1faceacb8856add20a820271cc3254b3 (diff) | |
download | hurrycurry-b43be80a63e54948656313d9862e0523a3aed31f.tar hurrycurry-b43be80a63e54948656313d9862e0523a3aed31f.tar.bz2 hurrycurry-b43be80a63e54948656313d9862e0523a3aed31f.tar.zst |
compress replays
Diffstat (limited to 'server')
-rw-r--r-- | server/replaytool/Cargo.toml | 1 | ||||
-rw-r--r-- | server/replaytool/src/main.rs | 20 |
2 files changed, 18 insertions, 3 deletions
diff --git a/server/replaytool/Cargo.toml b/server/replaytool/Cargo.toml index e6c1cc23..036c464b 100644 --- a/server/replaytool/Cargo.toml +++ b/server/replaytool/Cargo.toml @@ -14,5 +14,6 @@ tokio-tungstenite = { version = "0.23.1", features = ["native-tls"] } futures-util = "0.3.30" rand = "0.9.0-alpha.1" clap = { version = "4.5.8", features = ["derive"] } +async-compression = { version = "0.4.11", features = ["zstd", "tokio"] } hurrycurry-protocol = { path = "../protocol" } 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.; |