summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2024-08-17 22:53:38 -0400
committerpommicket <pommicket@gmail.com>2024-08-17 22:53:38 -0400
commit2deeda6f7c219522218a722bee17b646bd2b7ba6 (patch)
tree1bde52e42e73bb6f63e3d8b0cf61f5f984d45888 /server/src
parent9edd849f37c339dfb6d5a5c125a72e0b8e588180 (diff)
only send update if piece data has changed
Diffstat (limited to 'server/src')
-rw-r--r--server/src/main.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/server/src/main.rs b/server/src/main.rs
index a6ffd2c..afc87eb 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -291,6 +291,7 @@ async fn handle_websocket(
puzzle_id: &mut Option<[u8; PUZZLE_ID_LEN]>,
ws: &mut tokio_tungstenite::WebSocketStream<&mut tokio::net::TcpStream>,
) -> Result<()> {
+ let mut last_poll_hash = 0u64;
while let Some(message) = ws.next().await {
let message = message?;
if matches!(message, Message::Close(_)) {
@@ -421,14 +422,25 @@ async fn handle_websocket(
server.connect_pieces(puzzle_id, piece1, piece2).await?;
} else if text == "poll" {
let puzzle_id = puzzle_id.ok_or(Error::NotJoined)?;
- let mut data = vec![2, 0, 0, 0, 0, 0, 0, 0]; // opcode / version number + padding
let PieceInfo {
positions,
connectivity,
} = server.get_piece_info(puzzle_id).await?;
- data.extend_from_slice(transmute_to_bytes(&positions[..]));
- data.extend_from_slice(transmute_to_bytes(&connectivity[..]));
- ws.send(Message::Binary(data)).await?;
+ let mut hasher = std::hash::DefaultHasher::new();
+ let positions_bytes = transmute_to_bytes(&positions[..]);
+ let connectivity_bytes = transmute_to_bytes(&connectivity[..]);
+ use std::hash::Hasher;
+ hasher.write(positions_bytes);
+ hasher.write(connectivity_bytes);
+ let hash = hasher.finish();
+ if hash != last_poll_hash {
+ // don't send update if nothing's changed
+ last_poll_hash = hash;
+ let mut data = vec![2, 0, 0, 0, 0, 0, 0, 0]; // opcode / version number + padding
+ data.extend_from_slice(positions_bytes);
+ data.extend_from_slice(connectivity_bytes);
+ ws.send(Message::Binary(data)).await?;
+ }
} else if text == "randomFeaturedWikimedia" {
let choice = rand::thread_rng().gen_range(0..server.wikimedia_featured.len());
ws.send(Message::Text(format!(