feat: regex
This commit is contained in:
parent
9536539e8c
commit
65911d3706
19
Cargo.lock
generated
19
Cargo.lock
generated
@ -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",
|
||||
|
@ -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)),
|
||||
};
|
||||
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)
|
||||
}
|
||||
|
@ -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"] }
|
||||
|
@ -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);
|
||||
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<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)),
|
||||
};
|
||||
|
@ -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)"),
|
||||
))
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user