From 65911d3706f03c186e28351732d956366af972b3 Mon Sep 17 00:00:00 2001 From: tretrauit Date: Mon, 1 Jan 2024 20:15:51 +0700 Subject: [PATCH] feat: regex --- Cargo.lock | 19 ++++++------ swordfish-common/src/tesseract.rs | 12 +++++--- swordfish/Cargo.toml | 1 + swordfish/src/katana.rs | 51 ++++++++++++++++++++++++------- swordfish/src/main.rs | 12 ++++++-- 5 files changed, 67 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47510b7..681153c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1287,14 +1287,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -1308,13 +1308,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.8.2", ] [[package]] @@ -1325,9 +1325,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" @@ -1683,6 +1683,7 @@ dependencies = [ "dotenvy", "image", "once_cell", + "regex", "serde", "serenity", "swordfish-common", diff --git a/swordfish-common/src/tesseract.rs b/swordfish-common/src/tesseract.rs index eccf7aa..ab23995 100644 --- a/swordfish-common/src/tesseract.rs +++ b/swordfish-common/src/tesseract.rs @@ -1,13 +1,15 @@ pub use leptess::{LepTess, Variable}; -pub fn init_tesseract() -> Result { +pub fn init_tesseract(numeric_only: bool) -> Result { let mut lep_tess = match LepTess::new(None, "eng") { Ok(lep_tess) => lep_tess, Err(why) => return Err(format!("Failed to initialize Tesseract: {:?}", why)), }; - match lep_tess.set_variable(Variable::TesseditCharWhitelist, "0123456789") { - Ok(_) => (), - Err(why) => return Err(format!("Failed to set whitelist: {:?}", why)), - }; + if numeric_only { + match lep_tess.set_variable(Variable::TesseditCharWhitelist, "0123456789") { + Ok(_) => (), + Err(why) => return Err(format!("Failed to set whitelist: {:?}", why)), + }; + } Ok(lep_tess) } diff --git a/swordfish/Cargo.toml b/swordfish/Cargo.toml index fb70ff2..0ab689f 100644 --- a/swordfish/Cargo.toml +++ b/swordfish/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" dotenvy = "0.15.7" image = "0.24.7" once_cell = "1.19.0" +regex = "1.10.2" serde = "1.0.193" serenity = { version = "0.12.0", features = ["builder"] } tokio = { version = "1.35.1", features = ["full"] } diff --git a/swordfish/src/katana.rs b/swordfish/src/katana.rs index 492fbff..0d824af 100644 --- a/swordfish/src/katana.rs +++ b/swordfish/src/katana.rs @@ -1,26 +1,55 @@ use image::io::Reader as ImageReader; -use serenity::framework::standard::macros::{command, group}; -use serenity::framework::standard::{CommandResult, Configuration, StandardFramework}; +use once_cell::sync::Lazy; +use regex::Regex; use serenity::model::channel::Message; use serenity::prelude::*; use std::io::Cursor; use std::sync::{Arc, Mutex}; use std::thread; -use swordfish_common::tesseract::LepTess; +use swordfish_common::tesseract; use swordfish_common::{debug, error, info, trace, warn}; -pub fn analyze_card(leptess: &LepTess, card: image::DynamicImage) { - trace!("Analyzing card..."); + +static TEXT_REGEX: Lazy = Lazy::new(|| { + Regex::new(r"[A-Za-z ]").unwrap() +}); + + +pub struct Card { + wishlist: Option, + name: String, + series: String, + print: i32, +} + +pub fn analyze_card(card: image::DynamicImage) { + trace!("Spawning threads for analyzing card..."); // Read the name and the series - let name_img = card.crop_imm(22, 26, 206 - 22, 70 - 26); - name_img.save("debug/4-name.png").unwrap(); - let series_img = card.crop_imm(22, 260, 206 - 22, 306 - 260); - series_img.save("debug/4-series.png").unwrap(); + let card_clone = card.clone(); + let name_thread = thread::spawn(move || { + let mut leptess = tesseract::init_tesseract(false).expect("Failed to initialize Tesseract"); + let name_img = card_clone.crop_imm(22, 26, 202 - 22, 70 - 26); + name_img.save("debug/4-name.png").unwrap(); + leptess.set_image_from_mem(&name_img.as_bytes()).unwrap(); + leptess.get_utf8_text().expect("Failed to read name") + }); + let card_clone = card.clone(); + let series_thread = thread::spawn(move || { + let mut leptess = tesseract::init_tesseract(false).expect("Failed to initialize Tesseract"); + let series_img = card_clone.crop_imm(22, 276, 202 - 22, 330 - 276); + series_img.save("debug/4-series.png").unwrap(); + leptess.set_image_from_mem(&series_img.as_bytes()).unwrap(); + let series = leptess.get_utf8_text().unwrap(); + }); + let name = name_thread.join().unwrap(); + trace!("Name: {}", name); + let series = series_thread.join().unwrap(); + trace!("Series: {}", name); // Read the print number } pub async fn analyze_drop_message( - leptess_arc: &Arc>, + leptess_arc: &Arc>, message: &Message, ) -> Result<(), String> { if message.attachments.len() < 1 { @@ -67,7 +96,7 @@ pub async fn analyze_drop_message( Ok(_) => { trace!("Saved cropped card {}", i); let leptess = leptess_mutex.lock().unwrap(); - analyze_card(&leptess, card_img); + analyze_card(card_img); } Err(why) => return Err(format!("Failed to save image: {:?}", why)), }; diff --git a/swordfish/src/main.rs b/swordfish/src/main.rs index 6dc26db..a959ea9 100644 --- a/swordfish/src/main.rs +++ b/swordfish/src/main.rs @@ -1,5 +1,5 @@ use dotenvy::dotenv; -use once_cell::sync::Lazy; +use once_cell::unsync::Lazy; use serenity::async_trait; use serenity::framework::standard::macros::{command, group}; use serenity::framework::standard::{CommandResult, Configuration, StandardFramework}; @@ -20,9 +20,15 @@ mod template; const GITHUB_URL: &str = "https://github.com/teppyboy/swordfish"; static mut LEPTESS_ARC: Lazy>> = Lazy::new(|| { - trace!("Initializing Tesseract..."); + println!("Initializing Tesseract..."); Arc::new(Mutex::new( - tesseract::init_tesseract().expect("Failed to initialize Tesseract"), + tesseract::init_tesseract(false).expect("Failed to initialize Tesseract"), + )) +}); +static mut LEPTESS_NUMERIC_ARC: Lazy>> = Lazy::new(|| { + println!("Initializing Tesseract (numeric filter)..."); + Arc::new(Mutex::new( + tesseract::init_tesseract(true).expect("Failed to initialize Tesseract (numeric filter)"), )) });