mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-01 10:15:31 +00:00
aquatic_ws: save peer even if AnnounceRequest.bytes_left is None
This commit is contained in:
parent
008d8b8eff
commit
cb66364fa5
3 changed files with 34 additions and 36 deletions
|
|
@ -37,11 +37,11 @@ impl PeerStatus {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn from_event_and_bytes_left(
|
pub fn from_event_and_bytes_left(
|
||||||
event: AnnounceEvent,
|
event: AnnounceEvent,
|
||||||
bytes_left: usize
|
opt_bytes_left: Option<usize>
|
||||||
) -> Self {
|
) -> Self {
|
||||||
if let AnnounceEvent::Stopped = event {
|
if let AnnounceEvent::Stopped = event {
|
||||||
Self::Stopped
|
Self::Stopped
|
||||||
} else if bytes_left == 0 {
|
} else if let Some(0) = opt_bytes_left {
|
||||||
Self::Seeding
|
Self::Seeding
|
||||||
} else {
|
} else {
|
||||||
Self::Leeching
|
Self::Leeching
|
||||||
|
|
|
||||||
|
|
@ -109,44 +109,41 @@ pub fn handle_announce_requests(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: correct to only update when bytes_left is Some?
|
let peer_status = PeerStatus::from_event_and_bytes_left(
|
||||||
if let Some(bytes_left) = request.bytes_left {
|
request.event,
|
||||||
let peer_status = PeerStatus::from_event_and_bytes_left(
|
request.bytes_left
|
||||||
request.event,
|
);
|
||||||
bytes_left
|
|
||||||
);
|
|
||||||
|
|
||||||
let peer = Peer {
|
let peer = Peer {
|
||||||
connection_meta: sender_meta,
|
connection_meta: sender_meta,
|
||||||
status: peer_status,
|
status: peer_status,
|
||||||
valid_until,
|
valid_until,
|
||||||
};
|
};
|
||||||
|
|
||||||
let opt_removed_peer = match peer_status {
|
let opt_removed_peer = match peer_status {
|
||||||
PeerStatus::Leeching => {
|
PeerStatus::Leeching => {
|
||||||
torrent_data.num_leechers += 1;
|
torrent_data.num_leechers += 1;
|
||||||
|
|
||||||
torrent_data.peers.insert(peer_id, peer)
|
torrent_data.peers.insert(peer_id, peer)
|
||||||
},
|
},
|
||||||
PeerStatus::Seeding => {
|
PeerStatus::Seeding => {
|
||||||
torrent_data.num_seeders += 1;
|
torrent_data.num_seeders += 1;
|
||||||
|
|
||||||
torrent_data.peers.insert(peer_id, peer)
|
torrent_data.peers.insert(peer_id, peer)
|
||||||
},
|
},
|
||||||
PeerStatus::Stopped => {
|
PeerStatus::Stopped => {
|
||||||
torrent_data.peers.remove(&peer_id)
|
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;
|
|
||||||
},
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
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
|
// If peer sent offers, send them on to random peers
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,8 @@ pub struct AnnounceRequestOffer {
|
||||||
pub struct AnnounceRequest {
|
pub struct AnnounceRequest {
|
||||||
pub info_hash: InfoHash,
|
pub info_hash: InfoHash,
|
||||||
pub peer_id: PeerId,
|
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")]
|
#[serde(rename = "left")]
|
||||||
pub bytes_left: Option<usize>,
|
pub bytes_left: Option<usize>,
|
||||||
/// Can be empty. Then, default is "update"
|
/// Can be empty. Then, default is "update"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue