Guest User

Untitled

a guest
Aug 24th, 2022
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.20 KB | None | 0 0
  1. #[allow(dead_code)]
  2.  
  3. use std::{
  4.     fs::OpenOptions,
  5.     fs::File,
  6.     io::{prelude::*, BufReader},
  7.     path::Path,
  8.     thread::{self},
  9. };
  10. use rfd::FileDialog;
  11. use text_io::read;
  12. use std::sync::atomic::{AtomicU32, Ordering};
  13. use std::sync::Arc;
  14.  
  15. fn load(filename: impl AsRef<Path>) -> Vec<String> {
  16.     let file = File::open(filename)
  17.         .expect("error");
  18.     let buffer = BufReader::new(file);
  19.     buffer.lines()
  20.         .map(|l| l.expect("error"))
  21.         .collect()
  22. }
  23.  
  24. fn write(filename: impl AsRef<Path>, mut t_write: String) {
  25.     let mut file = OpenOptions::new()
  26.         .append(true)
  27.         .open(filename)
  28.         .expect("error");
  29.     t_write.push_str("\n");
  30.     file.write_all(t_write
  31.         .as_bytes())
  32.         .unwrap();
  33. }
  34.  
  35. #[tokio::main]
  36. async fn main() -> Result<(), Box<dyn std::error::Error>> {
  37.    
  38.     let file = FileDialog::new()
  39.         .add_filter("text", &["txt"])
  40.         .set_directory(".")
  41.         .pick_file();
  42.     let url = load(file.unwrap());
  43.     println!("{}", url.len());
  44.     let threads: i16 = read!("{}\n");
  45.     println!("Splitting URLs...");
  46.     let mut values = url
  47.         .into_iter()
  48.         .peekable();
  49.     let mut chunks = Vec::new();
  50.     while values.peek().is_some() {
  51.         let chunk: Vec<_> = values
  52.             .by_ref()
  53.             .take(threads as usize)
  54.             .collect();
  55.         chunks.push(chunk);
  56.     }
  57.     let mut handles = Vec::new();
  58.     println!("Done.");
  59.     let checked = Arc::new(AtomicU32::new(1));
  60.     let valid = Arc::new(AtomicU32::new(1));
  61.     let invalid = Arc::new(AtomicU32::new(1));
  62.     // println!("{:?}", chunks);
  63.     for chunk in chunks {
  64.         let handle = thread::spawn({
  65.                 let c_clone = Arc::clone(&checked);
  66.                 let v_clone = Arc::clone(&valid);
  67.                 let i_clone = Arc::clone(&invalid);
  68.                 move ||
  69.             for x in chunk {
  70.                 print! ("\x1B[2J\x1B[1;1H");
  71.                 let resp = reqwest
  72.                     ::blocking
  73.                     ::get(x.as_str());
  74.                 let _resp_r = match resp {
  75.                     Ok(_ok) => {
  76.                         c_clone.fetch_add(1, Ordering::SeqCst);
  77.                         v_clone.fetch_add(1, Ordering::SeqCst);
  78.                         write("valid.txt".to_string(), x);
  79.                         println!("{} | Valid: {} | Invalid: {}",
  80.                             c_clone.load(Ordering::SeqCst),
  81.                             v_clone.load(Ordering::SeqCst),
  82.                             i_clone.load(Ordering::SeqCst));}
  83.                     Err(_error) => {
  84.                         c_clone.fetch_add(1, Ordering::SeqCst);
  85.                         i_clone.fetch_add(1, Ordering::SeqCst);
  86.                         write("invalid.txt".to_string(), x);
  87.                         println!("{} | Valid: {} | Invalid: {}",
  88.                             c_clone.load(Ordering::SeqCst),
  89.                             v_clone.load(Ordering::SeqCst),
  90.                             i_clone.load(Ordering::SeqCst));}
  91.                 };
  92.             }
  93.         });
  94.  
  95.         handles.push(handle);
  96.        
  97.     }
  98.     for x in handles {
  99.         x.join().unwrap();
  100.     }
  101.     Ok(())
  102. }
Advertisement
Add Comment
Please, Sign In to add comment