feat: regex

This commit is contained in:
tretrauit 2024-01-01 20:15:51 +07:00
parent 9536539e8c
commit 65911d3706
5 changed files with 67 additions and 28 deletions

19
Cargo.lock generated
View File

@ -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",

View File

@ -1,13 +1,15 @@
pub use leptess::{LepTess, Variable};
pub fn init_tesseract() -> Result<LepTess, String> {
pub fn init_tesseract(numeric_only: bool) -> Result<LepTess, String> {
let mut lep_tess = match LepTess::new(None, "eng") {
Ok(lep_tess) => lep_tess,
Err(why) => return Err(format!("Failed to initialize Tesseract: {:?}", 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)
}

View File

@ -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"] }

View File

@ -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<Regex> = Lazy::new(|| {
Regex::new(r"[A-Za-z ]").unwrap()
});
pub struct Card {
wishlist: Option<i32>,
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);
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();
let series_img = card.crop_imm(22, 260, 206 - 22, 306 - 260);
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<Mutex<LepTess>>,
leptess_arc: &Arc<Mutex<tesseract::LepTess>>,
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)),
};

View File

@ -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<Arc<Mutex<tesseract::LepTess>>> = 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<Arc<Mutex<tesseract::LepTess>>> = Lazy::new(|| {
println!("Initializing Tesseract (numeric filter)...");
Arc::new(Mutex::new(
tesseract::init_tesseract(true).expect("Failed to initialize Tesseract (numeric filter)"),
))
});