use rust_mc_status::{McClient, McError, ProxyConfig, StatusExt};
use rust_mc_status::error::ProxyError;
use std::time::{Duration, Instant};
fn sep() {
println!("\n{}\n", "─".repeat(50));
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Proxy Usage ===\n");
println!("1. Anonymous SOCKS5 — Java Edition");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::socks5("127.0.0.1:1080"))
.build();
match client.java("mc.hypixel.net").await {
Ok(s) => println!(" ✅ {} | {} ms | {}", s.display_players(), s.latency_ms() as u32, s.motd_clean()),
Err(e) => println!(" ❌ {e} (is your proxy running on 127.0.0.1:1080?)"),
}
sep();
println!("2. Authenticated SOCKS5");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(
ProxyConfig::socks5("proxy.example.com:1080")
.with_auth("username", "password")
)
.build();
match client.java("mc.hypixel.net").await {
Ok(s) => println!(" ✅ {} | {} ms", s.display_players(), s.latency_ms() as u32),
Err(e) => println!(" ❌ {e}"),
}
sep();
println!("3. HTTP CONNECT proxy — anonymous");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::http("squid.example.com:3128"))
.build();
match client.java("mc.hypixel.net").await {
Ok(s) => println!(" ✅ {} | {} ms | {}", s.display_players(), s.latency_ms() as u32, s.motd_clean()),
Err(e) => println!(" ❌ {e} (is your HTTP proxy running?)"),
}
println!("\n3b. HTTP CONNECT proxy — authenticated");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(
ProxyConfig::http("squid.corp.example.com:3128")
.with_auth("proxyuser", "proxypass")
)
.build();
match client.java("mc.hypixel.net").await {
Ok(s) => println!(" ✅ {} | {} ms", s.display_players(), s.latency_ms() as u32),
Err(e) => println!(" ❌ {e}"),
}
sep();
println!("4. Bedrock via TCP-only SOCKS5 — expected UdpUnsupported error");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::socks5("127.0.0.1:1080")) .build();
match client.bedrock("geo.hivebedrock.network").await {
Ok(s) => println!(" ✅ Unexpected: {}", s.display_players()),
Err(McError::Proxy(ProxyError::UdpUnsupported(addr))) => {
println!(" ❌ ProxyUdpUnsupported({addr}) ← expected, no network attempt made");
println!(" Use ProxyConfig::socks5_with_udp() if your proxy supports UDP ASSOCIATE.");
}
Err(e) => println!(" ❌ {e}"),
}
println!("\n4b. Bedrock via HTTP proxy — same expected error");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::http("squid.example.com:3128"))
.build();
match client.bedrock("geo.hivebedrock.network").await {
Ok(s) => println!(" ✅ Unexpected: {}", s.display_players()),
Err(McError::Proxy(ProxyError::UdpUnsupported(addr))) => {
println!(" ❌ ProxyUdpUnsupported({addr}) ← expected");
}
Err(e) => println!(" ❌ {e}"),
}
sep();
println!("5. SOCKS5 with UDP ASSOCIATE — Java + Bedrock");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::socks5_with_udp("127.0.0.1:1080"))
.build();
match client.java("mc.hypixel.net").await {
Ok(s) => println!(" ✅ Java {} | {} ms", s.display_players(), s.latency_ms() as u32),
Err(e) => println!(" ❌ Java {e}"),
}
match client.bedrock("geo.hivebedrock.network").await {
Ok(s) => println!(" ✅ Bedrock {} | {} ms | {}", s.display_players(), s.latency_ms() as u32, s.edition()),
Err(e) => println!(" ❌ Bedrock {e}"),
}
sep();
println!("6. Proxy + response cache");
let client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::socks5("127.0.0.1:1080"))
.response_cache(Duration::from_secs(30), 64)
.build();
let t1 = Instant::now();
match client.java("mc.hypixel.net").await {
Ok(s) => println!(" live {} ms cached: {} (via proxy)", t1.elapsed().as_millis(), s.is_cached()),
Err(e) => println!(" ❌ {e}"),
}
let t2 = Instant::now();
match client.java("mc.hypixel.net").await {
Ok(s) => println!(" cache {} ms cached: {} (no proxy contact)", t2.elapsed().as_millis(), s.is_cached()),
Err(e) => println!(" ❌ {e}"),
}
sep();
println!("7. Multiple clients — different proxies per region");
let eu_client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::socks5("eu-proxy.example.com:1080"))
.build();
let us_client = McClient::builder()
.timeout(Duration::from_secs(10))
.proxy(ProxyConfig::socks5("us-proxy.example.com:1080"))
.build();
for (label, client, server) in [
("EU", &eu_client, "eu.example-mc.com"),
("US", &us_client, "mc.hypixel.net"),
] {
match client.java(server).await {
Ok(s) => println!(" [{label}] ✅ {server} — {} | {} ms", s.display_players(), s.latency_ms() as u32),
Err(e) => println!(" [{label}] ❌ {server} — {e}"),
}
}
sep();
println!("Summary\n");
println!(" Constructor Protocol UDP (Bedrock) Auth");
println!(" ───────────────────────────── ─────────── ───────────── ────────");
println!(" ProxyConfig::socks5(addr) SOCKS5 ❌ optional");
println!(" ProxyConfig::socks5_with_udp SOCKS5+UDP ✅ optional");
println!(" ProxyConfig::http(addr) HTTP CONNECT ❌ optional");
println!();
println!(" .with_auth(\"user\", \"pass\") — works for all three");
println!(" Bedrock without UDP support — fails immediately, no network attempt");
Ok(())
}