bhcli

A TUI for chatting on LE PHP Chats (onion)
git clone https://git.dasho.dev/n0tr1v/bhcli.git
Log | Files | Refs | README

commit a1b3b2fa940aa49521730f37c5e98bf30c5d66e7
parent 81ec0205348f6f9aa0d103c31a97d23f29d8d886
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 30 Mar 2023 00:23:43 -0700

simplify code

Diffstat:
Msrc/lechatphp/mod.rs | 67++++++++++++++++++++++++++++---------------------------------------
1 file changed, 28 insertions(+), 39 deletions(-)

diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs @@ -286,55 +286,44 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> { 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); - - if i == 0 { - if red_px_pts.len() != 1 { - if retry < 10 { - rect.enlarge(); - continue; - } - return Err(CaptchaErr(format!("root {:?} does not have exactly 1 line detected", letter))); - } - let red_pt = red_px_pts.get(0).unwrap(); - let angle = get_angle(red_pt, &letter.center()); - let neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap(); - letter = neighbor.clone(); - break 'retry_loop; - } - - if red_px_pts.len() != 2 { + let mut nb_branches = if i == 0 { 1 } else { 2 }; + if red_px_pts.len() != nb_branches { if retry < 10 { rect.enlarge(); - continue; + continue 'retry_loop; } - return Err(CaptchaErr(format!("letter #{} {:?} doesn't have exactly 2 lines detected", i+1, letter))); + 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)?; + break 'retry_loop; + } + } + Ok(answer) +} - let fst_red_pt = red_px_pts.get(0).unwrap(); - let angle = get_angle(fst_red_pt, &letter.center()); - let mut neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap(); - - if visited.contains(&neighbor) { - let fst_red_pt = red_px_pts.get(1).unwrap(); - let angle = get_angle(fst_red_pt, &letter.center()); - neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap(); - if visited.contains(&neighbor) { - if i == 3 { - for (_, l) in letters_map.iter() { - if !visited.contains(&l) { - letter = l.clone(); - break 'retry_loop; - } - } +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> { + let mut res: Option<Letter> = None; + 'some_loop: for idx in 0..nb_branches { + 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(); + if visited.contains(&neighbor) { + if i == 3 { + for (_, l) in letters_map.iter() { + if !visited.contains(&l) { + res = Some(l.clone()); + break 'some_loop; } - return Err(CaptchaErr(format!("letter #{} {:?} all neighbors already visited", i+1, letter))); } } - letter = neighbor; - break; + continue; } + res = Some(neighbor); + } + match res { + Some(res) => Ok(res), + None => Err(CaptchaErr(format!("letter #{} {:?} all neighbors already visited", i+1, letter))), } - Ok(answer) }