use captchaforge::solver::CaptchaType;
use captchaforge::telemetry::{MetricsTelemetry, SolveEvent, SolveOutcome, SolverTelemetry};
use std::io::{Read, Write};
use std::sync::Arc;
fn main() -> std::io::Result<()> {
let bind = std::env::args()
.nth(1)
.unwrap_or_else(|| "127.0.0.1:9090".to_string());
let metrics = Arc::new(MetricsTelemetry::new());
let kind = captchaforge::detect::DetectedCaptcha::Turnstile;
let method = captchaforge::solver::SolveMethod::AutoPass;
for vendor in &[CaptchaType::CloudflareTurnstile, CaptchaType::HCaptcha] {
for i in 0..20 {
let outcome = if i < 15 {
SolveOutcome::Success
} else {
SolveOutcome::Failure
};
let evt = SolveEvent::new("Demo", vendor, &kind, "x", outcome, 100, Some(0.8), &method);
metrics.record(&evt);
}
}
let listener = std::net::TcpListener::bind(&bind)?;
println!("captchaforge prometheus exporter listening on http://{bind}/metrics");
for stream in listener.incoming() {
let mut stream = stream?;
let mut buf = [0u8; 1024];
let _ = stream.read(&mut buf);
let body = format!(
"{}\n{}",
metrics.snapshot().to_prometheus(),
"metrics_placeholder".to_string()
);
let response = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/plain; version=0.0.4\r\nContent-Length: {}\r\n\r\n{}",
body.len(),
body
);
let _ = stream.write_all(response.as_bytes());
}
Ok(())
}