summaryrefslogtreecommitdiff
path: root/server/replaytool
diff options
context:
space:
mode:
Diffstat (limited to 'server/replaytool')
-rw-r--r--server/replaytool/Cargo.toml1
-rw-r--r--server/replaytool/src/main.rs20
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.;