use rust_mc_status::{McClient, StatusExt};
use std::time::{Duration, Instant};
fn sep() {
println!("\n{}\n", "─".repeat(50));
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Cache Management ===\n");
println!("── DNS / SRV cache ──────────────────────────────\n");
let client = McClient::builder()
.timeout(Duration::from_secs(15))
.dns_cache_size(512) .build();
println!("1. Initial cache state (empty)");
let stats = client.cache_stats().await;
println!(" DNS entries : {}", stats.dns_entries);
println!(" SRV entries : {}", stats.srv_entries);
println!(" Response entries : {}", stats.response_entries);
println!("\n2. Pinging servers to populate DNS cache…");
let t0 = Instant::now();
let _ = client.java("mc.hypixel.net").await;
let first_ping = t0.elapsed();
let _ = client.bedrock("geo.hivebedrock.network:19132").await;
let stats = client.cache_stats().await;
println!(" After 2 pings:");
println!(" DNS entries : {}", stats.dns_entries);
println!(" SRV entries : {}", stats.srv_entries);
println!(" First ping : {:.0} ms (includes DNS + network)", first_ping.as_millis());
println!("\n3. Repeat ping (DNS from cache, network still happens)");
let t1 = Instant::now();
let _ = client.java("mc.hypixel.net").await;
let cached_ping = t1.elapsed();
let saved = first_ping.saturating_sub(cached_ping);
println!(" Cached ping : {:.0} ms", cached_ping.as_millis());
println!(" Saved : ~{:.0} ms (DNS lookup avoided)", saved.as_millis());
println!("\n4. Clearing DNS/SRV caches");
client.clear_caches().await;
let stats = client.cache_stats().await;
println!(" DNS entries : {} (cleared)", stats.dns_entries);
println!(" SRV entries : {} (cleared)", stats.srv_entries);
sep();
println!("── Response cache ───────────────────────────────\n");
let client = McClient::builder()
.timeout(Duration::from_secs(15))
.response_cache(Duration::from_secs(60), 100)
.build();
println!("5. First ping — live request (cache miss)");
let t2 = Instant::now();
match client.java("mc.hypixel.net").await {
Ok(s) => {
let elapsed = t2.elapsed();
println!(" ✅ {} ms — {} — cached: {}", elapsed.as_millis(), s.display_players(), s.is_cached());
}
Err(e) => println!(" ❌ {e}"),
}
let stats = client.cache_stats().await;
println!(" Response entries : {} (populated)", stats.response_entries);
println!("\n6. Second ping — instant response (cache hit)");
let t3 = Instant::now();
match client.java("mc.hypixel.net").await {
Ok(s) => {
let elapsed = t3.elapsed();
println!(" ✅ {} ms — {} — cached: {}", elapsed.as_millis(), s.display_players(), s.is_cached());
if s.is_cached() {
println!(" ⚡ Returned from cache instantly — no network request");
}
}
Err(e) => println!(" ❌ {e}"),
}
println!("\n7. Caching multiple servers");
let servers = ["mc.hypixel.net", "mc.mineplex.com"];
for server in &servers {
let _ = client.java(*server).await;
}
let stats = client.cache_stats().await;
println!(" Response entries : {}", stats.response_entries);
for server in &servers {
let t = Instant::now();
match client.java(*server).await {
Ok(s) => println!(" {} → {} ms (cached: {})", server, t.elapsed().as_millis(), s.is_cached()),
Err(e) => println!(" {} → ❌ {e}", server),
}
}
println!("\n8. Clear response cache only");
client.clear_response_cache().await;
let stats = client.cache_stats().await;
println!(" Response entries : {} (cleared)", stats.response_entries);
println!(" DNS entries : {} (untouched)", stats.dns_entries);
println!("\n9. Ping after response cache clear (live again, DNS still cached)");
let t4 = Instant::now();
match client.java("mc.hypixel.net").await {
Ok(s) => {
println!(" ✅ {} ms — cached: {} (DNS was still cached → faster than first ping)",
t4.elapsed().as_millis(), s.is_cached());
}
Err(e) => println!(" ❌ {e}"),
}
sep();
println!("Summary:\n");
println!(" ┌─────────────────┬──────────────────────────────────────────┐");
println!(" │ Кэш │ Что ускоряет │");
println!(" ├─────────────────┼──────────────────────────────────────────┤");
println!(" │ DNS/SRV │ Резолвинг хоста (~10–50 ms) │");
println!(" │ Response │ Весь пинг (~0 ms, возвращает старый TTL) │");
println!(" └─────────────────┴──────────────────────────────────────────┘");
println!();
println!(" DNS TTL : 5 минут (автоматическое истечение)");
println!(" Response TTL : задаётся через with_response_cache_ttl()");
println!(" clear_caches() → сбрасывает DNS + SRV");
println!(" clear_response_cache() → сбрасывает только response");
println!(" Клонированные клиенты → разделяют один Arc<> кэш");
Ok(())
}