use aquatic_udp_protocol::PeerId;
use derive_more::From;
use serde::{Deserialize, Serialize};
use torrust_tracker_primitives::peer;
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct Peer {
pub peer_id: Id,
pub peer_addr: String,
#[deprecated(since = "2.0.0", note = "please use `updated_milliseconds_ago` instead")]
pub updated: u128,
pub updated_milliseconds_ago: u128,
pub uploaded: i64,
pub downloaded: i64,
pub left: i64,
pub event: String,
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct Id {
pub id: Option<String>,
pub client: Option<String>,
}
impl From<PeerId> for Id {
fn from(peer_id: PeerId) -> Self {
let peer_id = peer::Id::from(peer_id);
Id {
id: peer_id.to_hex_string(),
client: peer_id.get_client_name(),
}
}
}
impl From<peer::Peer> for Peer {
fn from(value: peer::Peer) -> Self {
#[allow(deprecated)]
Peer {
peer_id: Id::from(value.peer_id),
peer_addr: value.peer_addr.to_string(),
updated: value.updated.as_millis(),
updated_milliseconds_ago: value.updated.as_millis(),
uploaded: value.uploaded.0.get(),
downloaded: value.downloaded.0.get(),
left: value.left.0.get(),
event: format!("{:?}", value.event),
}
}
}
#[derive(From, PartialEq, Default)]
pub struct Vector(pub Vec<Peer>);
impl FromIterator<peer::Peer> for Vector {
fn from_iter<T: IntoIterator<Item = peer::Peer>>(iter: T) -> Self {
let mut peers = Vector::default();
for i in iter {
peers.0.push(i.into());
}
peers
}
}