diff --git a/aquatic_ws/src/lib/common.rs b/aquatic_ws/src/lib/common.rs index 1ed1d09..60d51bd 100644 --- a/aquatic_ws/src/lib/common.rs +++ b/aquatic_ws/src/lib/common.rs @@ -37,11 +37,11 @@ impl PeerStatus { #[inline] pub fn from_event_and_bytes_left( event: AnnounceEvent, - bytes_left: usize + opt_bytes_left: Option ) -> Self { if let AnnounceEvent::Stopped = event { Self::Stopped - } else if bytes_left == 0 { + } else if let Some(0) = opt_bytes_left { Self::Seeding } else { Self::Leeching diff --git a/aquatic_ws/src/lib/handler.rs b/aquatic_ws/src/lib/handler.rs index 9427a68..15d0d93 100644 --- a/aquatic_ws/src/lib/handler.rs +++ b/aquatic_ws/src/lib/handler.rs @@ -109,44 +109,41 @@ pub fn handle_announce_requests( } } - // FIXME: correct to only update when bytes_left is Some? - if let Some(bytes_left) = request.bytes_left { - let peer_status = PeerStatus::from_event_and_bytes_left( - request.event, - bytes_left - ); + let peer_status = PeerStatus::from_event_and_bytes_left( + request.event, + request.bytes_left + ); - let peer = Peer { - connection_meta: sender_meta, - status: peer_status, - valid_until, - }; + let peer = Peer { + connection_meta: sender_meta, + status: peer_status, + valid_until, + }; - let opt_removed_peer = match peer_status { - PeerStatus::Leeching => { - torrent_data.num_leechers += 1; + let opt_removed_peer = match peer_status { + PeerStatus::Leeching => { + torrent_data.num_leechers += 1; - torrent_data.peers.insert(peer_id, peer) - }, - PeerStatus::Seeding => { - torrent_data.num_seeders += 1; + torrent_data.peers.insert(peer_id, peer) + }, + PeerStatus::Seeding => { + torrent_data.num_seeders += 1; - torrent_data.peers.insert(peer_id, peer) - }, - PeerStatus::Stopped => { - torrent_data.peers.remove(&peer_id) - } - }; - - match opt_removed_peer.map(|peer| peer.status){ - Some(PeerStatus::Leeching) => { - torrent_data.num_leechers -= 1; - }, - Some(PeerStatus::Seeding) => { - torrent_data.num_seeders -= 1; - }, - _ => {} + torrent_data.peers.insert(peer_id, peer) + }, + PeerStatus::Stopped => { + torrent_data.peers.remove(&peer_id) } + }; + + match opt_removed_peer.map(|peer| peer.status){ + Some(PeerStatus::Leeching) => { + torrent_data.num_leechers -= 1; + }, + Some(PeerStatus::Seeding) => { + torrent_data.num_seeders -= 1; + }, + _ => {} } // If peer sent offers, send them on to random peers diff --git a/aquatic_ws/src/lib/protocol/mod.rs b/aquatic_ws/src/lib/protocol/mod.rs index 21997a8..d3a9f3f 100644 --- a/aquatic_ws/src/lib/protocol/mod.rs +++ b/aquatic_ws/src/lib/protocol/mod.rs @@ -103,7 +103,8 @@ pub struct AnnounceRequestOffer { pub struct AnnounceRequest { pub info_hash: InfoHash, pub peer_id: PeerId, - /// Just called "left" in protocol + /// Just called "left" in protocol. Is set to None in some cases, such as + /// when opening a magnet link #[serde(rename = "left")] pub bytes_left: Option, /// Can be empty. Then, default is "update"