Skip to content

Commit c37e6c1

Browse files
committed
feat: [#654] UDP tracker client: scrape
```console $ cargo run --bin udp_tracker_client 127.0.0.1:6969 9c38422213e30bff212b30c360d26f9a02136422 | jq Compiling torrust-tracker v3.0.0-alpha.12-develop (/home/josecelano/Documents/git/committer/me/github/torrust/torrust-tracker) Finished dev [optimized + debuginfo] target(s) in 2.60s Running `target/debug/udp_tracker_client '127.0.0.1:6969' 9c38422213e30bff212b30c360d26f9a02136422` { "announce_interval": 120, "leechers": 0, "peers": [], "seeders": 1, "transaction_id": -888840697 } ```
1 parent c526cc1 commit c37e6c1

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

src/bin/udp_tracker_client.rs

+50-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,38 @@
1+
//! HTTP Tracker client:
2+
//!
3+
//! Examples:
4+
//!
5+
//! Announce request:
6+
//!
7+
//! ```text
8+
//! cargo run --bin udp_tracker_client 127.0.0.1:6969 9c38422213e30bff212b30c360d26f9a02136422 | jq
9+
//! ```
10+
//!
11+
//! Announce response:
12+
//!
13+
//! ```json
14+
//! {
15+
//! "transaction_id": -888840697
16+
//! "announce_interval": 120,
17+
//! "leechers": 0,
18+
//! "seeders": 1,
19+
//! "peers": [
20+
//! "123.123.123.123:51289"
21+
//! ],
22+
//! }
23+
/// ````
124
use std::env;
225
use std::net::{Ipv4Addr, SocketAddr};
326
use std::str::FromStr;
427

528
use aquatic_udp_protocol::common::InfoHash;
29+
use aquatic_udp_protocol::Response::{AnnounceIpv4, AnnounceIpv6};
630
use aquatic_udp_protocol::{
731
AnnounceEvent, AnnounceRequest, ConnectRequest, ConnectionId, NumberOfBytes, NumberOfPeers, PeerId, PeerKey, Port, Response,
832
TransactionId,
933
};
1034
use log::{debug, LevelFilter};
35+
use serde_json::json;
1136
use torrust_tracker::shared::bit_torrent::info_hash::InfoHash as TorrustInfoHash;
1237
use torrust_tracker::shared::bit_torrent::tracker::udp::client::{UdpClient, UdpTrackerClient};
1338

@@ -52,7 +77,31 @@ async fn main() {
5277
)
5378
.await;
5479

55-
println!("{response:#?}");
80+
match response {
81+
AnnounceIpv4(announce) => {
82+
let json = json!({
83+
"transaction_id": announce.transaction_id.0,
84+
"announce_interval": announce.announce_interval.0,
85+
"leechers": announce.leechers.0,
86+
"seeders": announce.seeders.0,
87+
"peers": announce.peers.iter().map(|peer| format!("{}:{}", peer.ip_address, peer.port.0)).collect::<Vec<_>>(),
88+
});
89+
let pretty_json = serde_json::to_string_pretty(&json).unwrap();
90+
println!("{pretty_json}");
91+
}
92+
AnnounceIpv6(announce) => {
93+
let json = json!({
94+
"transaction_id": announce.transaction_id.0,
95+
"announce_interval": announce.announce_interval.0,
96+
"leechers": announce.leechers.0,
97+
"seeders": announce.seeders.0,
98+
"peers6": announce.peers.iter().map(|peer| format!("{}:{}", peer.ip_address, peer.port.0)).collect::<Vec<_>>(),
99+
});
100+
let pretty_json = serde_json::to_string_pretty(&json).unwrap();
101+
println!("{pretty_json}");
102+
}
103+
_ => println!("{response:#?}"),
104+
}
56105
}
57106

58107
fn setup_logging(level: LevelFilter) {

0 commit comments

Comments
 (0)