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 | |
parent | aeeb376c1faceacb8856add20a820271cc3254b3 (diff) | |
download | hurrycurry-b43be80a63e54948656313d9862e0523a3aed31f.tar hurrycurry-b43be80a63e54948656313d9862e0523a3aed31f.tar.bz2 hurrycurry-b43be80a63e54948656313d9862e0523a3aed31f.tar.zst |
compress replays
-rw-r--r-- | Cargo.lock | 57 | ||||
-rw-r--r-- | server/replaytool/Cargo.toml | 1 | ||||
-rw-r--r-- | server/replaytool/src/main.rs | 20 |
3 files changed, 75 insertions, 3 deletions
@@ -82,6 +82,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] +name = "async-compression" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +dependencies = [ + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "zstd", + "zstd-safe", +] + +[[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -134,6 +148,11 @@ name = "cc" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "066fce287b1d4eafef758e89e09d724a24808a9196fe9756b8ca90e86d0719a2" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] [[package]] name = "cfg-if" @@ -454,6 +473,7 @@ name = "hurrycurry-replaytool" version = "0.1.0" dependencies = [ "anyhow", + "async-compression", "clap", "env_logger", "futures-util", @@ -510,6 +530,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1305,3 +1334,31 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zstd" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa556e971e7b568dc775c136fc9de8c779b1c2fc3a63defaafadffdbd3181afa" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.12+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +dependencies = [ + "cc", + "pkg-config", +] 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.; |