bhcli

"Strange's fork of n0tr1v's bhcli (onion)"
git clone https://git.dasho.dev/Strange/bhcli.git
Log | Files | Refs | README

commit 0aa296f7f6e4f0f5bd771bbfae12cdd3304f92d2
parent a1b3b2fa940aa49521730f37c5e98bf30c5d66e7
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 30 Mar 2023 00:52:19 -0700

cleanup

Diffstat:
Msrc/lechatphp/mod.rs | 33+++++++++++++--------------------
1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs @@ -265,45 +265,38 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> { } let mut answer = String::new(); - let mut letter = starting.unwrap(); let mut visited = HashSet::<Letter>::new(); - for i in 0..5 { - if visited.contains(&letter) { - return Err(CaptchaErr(format!("already visited node {:?}", letter))); - } - answer.push(letter.character); - // println!("visiting {:?}", letter); - visited.insert(letter.clone()); - if i == 4 { - break; - } - + let mut letter = starting.unwrap(); + answer.push(letter.character); + visited.insert(letter.clone()); + for i in 0..4 { let top_left = Point::new(letter.offset.x-5, letter.offset.y-3); let mut rect = Rect{p1: top_left, width: 8+5+6, height: 14+3+2}; - let mut retry = 0; 'retry_loop: loop { retry += 1; let square = img.crop_imm(rect.p1.x, rect.p1.y, rect.width, rect.height); let red_px_pts = get_contour_red_pixels(&rect.p1, &square); - let mut nb_branches = if i == 0 { 1 } else { 2 }; - if red_px_pts.len() != nb_branches { + let nb_lines = if i == 0 { 1 } else { 2 }; + if red_px_pts.len() != nb_lines { if retry < 10 { rect.enlarge(); continue 'retry_loop; } return Err(CaptchaErr(format!("letter #{} {:?} invalid nb lines detected", i+1, letter))); } - letter = get_next_node(&red_px_pts, &letter, &letters_map, &visited, i, nb_branches)?; + letter = get_next_node(&red_px_pts, &letter, &letters_map, &visited, i, nb_lines)?; break 'retry_loop; } + answer.push(letter.character); + visited.insert(letter.clone()); } Ok(answer) } -fn get_next_node(red_px_pts: &Vec<Point>, letter: &Letter, letters_map: &HashMap<char, Letter>, visited: &HashSet<Letter>, i: i32, nb_branches: usize) -> Result<Letter, CaptchaErr> { +fn get_next_node(red_px_pts: &Vec<Point>, letter: &Letter, letters_map: &HashMap<char, Letter>, visited: &HashSet<Letter>, i: i32, nb_lines: usize) -> Result<Letter, CaptchaErr> { let mut res: Option<Letter> = None; - 'some_loop: for idx in 0..nb_branches { + 'some_loop: for idx in 0..nb_lines { let fst_red_pt = red_px_pts.get(idx).unwrap(); let angle = get_angle(fst_red_pt, &letter.center()); let neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap(); @@ -364,8 +357,8 @@ struct Rect { impl Rect { fn enlarge(&mut self) { - self.p1.x = std::cmp::max(self.p1.x-1, 0); - self.p1.y = std::cmp::max(self.p1.y-1, 0); + self.p1.x = self.p1.x.checked_sub(1).unwrap_or(0); + self.p1.y = self.p1.y.checked_sub(1).unwrap_or(0); self.width += 1; self.height += 1; }