@@ -12,18 +12,32 @@ use crate::scanning::scanner::{scan, ScanConfig};
1212use crate :: scanning:: utils:: { format_time, prettier_ping_result, save_server} ;
1313
1414pub async fn crawl ( gen_config : IpGenerator ) {
15- let _ = TaskManager :: spawn ( "Crawler" , move |_cancel_token | async move {
15+ let _ = TaskManager :: spawn ( "Crawler" , move |cancel_token | async move {
1616 loop {
17+ if cancel_token. is_cancelled ( ) {
18+ logger:: warning ( "Crawler shutting down..." . to_string ( ) )
19+ . prefix ( "Crawler" ) . send ( ) . await ;
20+ break ;
21+ }
22+
1723 let start_time = Instant :: now ( ) ;
1824
1925 let ports = vec ! [ 25565 ] ; // Example for later implementation
2026 let targets: Vec < ( Ipv4Addr , u16 ) > = gen_config. generate ( )
27+ . take_while ( |_| {
28+ let cancelled = cancel_token. is_cancelled ( ) ;
29+ async move { !cancelled }
30+ } )
2131 . flat_map ( |ip| {
2232 stream:: iter ( ports. clone ( ) . into_iter ( ) . map ( move |port| ( ip, port) ) )
2333 } )
2434 . collect ( )
2535 . await ;
2636
37+ if cancel_token. is_cancelled ( ) && targets. is_empty ( ) {
38+ break ;
39+ }
40+
2741 let total_targets = targets. len ( ) ;
2842 let mut found_batch: Vec < ( ServerInfo , ServerHistory ) > = Vec :: new ( ) ;
2943
@@ -54,6 +68,12 @@ pub async fn crawl(gen_config: IpGenerator) {
5468 while let Some ( maybe_result) = scan_stream. next ( ) . await {
5569 processed_count += 1 ;
5670
71+ if cancel_token. is_cancelled ( ) {
72+ logger:: warning ( "Scan interrupted. Saving results..." . to_string ( ) )
73+ . prefix ( "Crawler" ) . send ( ) . await ;
74+ break ;
75+ }
76+
5777 // Success
5878 if let Some ( result) = maybe_result {
5979 let parsed = parse_server ( result. ip , result. port , result. ping . clone ( ) , result. query , result. join ) ;
@@ -70,12 +90,11 @@ pub async fn crawl(gen_config: IpGenerator) {
7090 ) ;
7191 output. push_str ( & prettier_ping_result ( result. ping ) . await ) ;
7292 logger:: success ( output) . prefix ( "Crawler" ) . send ( ) . await ;
73- }
7493
75- // Database insert
76- if processed_count % 10000 == 0 {
77- let batch_to_insert = std :: mem :: take ( & mut found_batch ) ;
78- save_server ( & batch_to_insert ) . await ;
94+ if found_batch . len ( ) >= 30 {
95+ let batch_to_insert = std :: mem :: take ( & mut found_batch ) ;
96+ save_server ( & batch_to_insert ) . await ;
97+ }
7998 }
8099
81100 // Progress calc
@@ -103,6 +122,10 @@ pub async fn crawl(gen_config: IpGenerator) {
103122 save_server ( & found_batch) . await ;
104123 }
105124
125+ if cancel_token. is_cancelled ( ) {
126+ break ;
127+ }
128+
106129 // Finished
107130 let elapsed_time = start_time. elapsed ( ) ;
108131
0 commit comments