feat(common): implement database reading

Also fix some bugs
This commit is contained in:
tretrauit 2024-01-06 14:34:45 +07:00
parent 30a7098bed
commit dbc168a955
7 changed files with 77 additions and 35 deletions

41
Cargo.lock generated
View File

@ -71,7 +71,7 @@ checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -702,7 +702,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -1498,9 +1498,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.71" version = "1.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -1533,9 +1533,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.33" version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -1880,9 +1880,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.193" version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -1898,13 +1898,13 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.193" version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -2190,6 +2190,7 @@ dependencies = [
"log", "log",
"mongodb", "mongodb",
"rusty-tesseract", "rusty-tesseract",
"serde",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
] ]
@ -2207,9 +2208,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.43" version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2308,7 +2309,7 @@ checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -2403,7 +2404,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -2506,7 +2507,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -2674,7 +2675,7 @@ checksum = "0b122284365ba8497be951b9a21491f70c9688eb6fddc582931a0703f6a00ece"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]
@ -2811,7 +2812,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -2845,7 +2846,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -3126,7 +3127,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.43", "syn 2.0.48",
] ]
[[package]] [[package]]

View File

@ -9,6 +9,7 @@ edition = "2021"
leptess = "0.14.0" leptess = "0.14.0"
log = "0.4.20" log = "0.4.20"
rusty-tesseract = "1.1.9" rusty-tesseract = "1.1.9"
serde = "1.0.195"
tracing = "0.1.40" tracing = "0.1.40"
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }

View File

@ -23,7 +23,13 @@ pub fn init() {
.unwrap(); .unwrap();
} }
fn query_card() { pub async fn query_card(name: &str, series: &str) -> Option<Card> {
todo!("Query card from database"); // todo!("Query card from database");
println!("{:?}", card); KATANA.get().unwrap().find_one(
mongodb::bson::doc! {
"name": name,
"series": series
},
None,
).await.unwrap()
} }

View File

@ -1,5 +1,6 @@
pub mod katana; pub mod katana;
use mongodb::bson::doc;
use mongodb::options::ClientOptions; use mongodb::options::ClientOptions;
use mongodb::{Client, Database}; use mongodb::{Client, Database};
use std::env; use std::env;
@ -9,11 +10,14 @@ use tracing::info;
static MONGO_CLIENT: OnceLock<Client> = OnceLock::new(); static MONGO_CLIENT: OnceLock<Client> = OnceLock::new();
static MONGO_DATABASE: OnceLock<Database> = OnceLock::new(); static MONGO_DATABASE: OnceLock<Database> = OnceLock::new();
async fn init() { pub async fn init() {
let mut options = let mut options =
ClientOptions::parse(env::var("MONGODB_URL").expect("MongoDB url must be provided")) ClientOptions::parse(env::var("MONGODB_URL").expect("MongoDB url must be provided"))
.await .await
.unwrap(); .unwrap();
options.direct_connection = Some(true);
options.app_name = Some("swordfish".to_string());
options.default_database = Some("swordfish".to_string());
match env::var("MONGODB_USERNAME") { match env::var("MONGODB_USERNAME") {
Ok(username) => { Ok(username) => {
options.credential = Some( options.credential = Some(
@ -29,9 +33,12 @@ async fn init() {
info!("No MongoDB username provided, using authentication provided in the url"); info!("No MongoDB username provided, using authentication provided in the url");
} }
} }
let client = Client::with_options(options).unwrap();
let db = client.database("swordfish");
db.run_command(doc! { "ping": 1 }, None).await.expect("Failed to connect to MongoDB");
MONGO_DATABASE.set(db).unwrap();
MONGO_CLIENT MONGO_CLIENT
.set(Client::with_options(options).unwrap()) .set(client)
.unwrap(); .unwrap();
MONGO_DATABASE.set(MONGO_CLIENT.get().unwrap().database("swordfish"));
katana::init(); katana::init();
} }

View File

@ -1,4 +1,6 @@
#[derive(Debug)] use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
pub struct Card { pub struct Card {
pub wishlist: Option<i32>, pub wishlist: Option<i32>,
pub name: String, pub name: String,

View File

@ -7,6 +7,7 @@ use serenity::model::channel::Message;
use std::io::Cursor; use std::io::Cursor;
use std::sync::LazyLock; use std::sync::LazyLock;
use swordfish_common::structs::Card; use swordfish_common::structs::Card;
use swordfish_common::database::katana as db;
use swordfish_common::tesseract::{libtesseract, subprocess}; use swordfish_common::tesseract::{libtesseract, subprocess};
use swordfish_common::{trace, warn}; use swordfish_common::{trace, warn};
use tokio::task; use tokio::task;
@ -208,10 +209,17 @@ pub async fn analyze_card_libtesseract(card: image::DynamicImage, count: u32) ->
trace!("Name: {}", name); trace!("Name: {}", name);
let series = series_thread.await.unwrap(); let series = series_thread.await.unwrap();
trace!("Series: {}", series); trace!("Series: {}", series);
let mut wishlist: Option<i32> = None;
// TODO: Read the print number // TODO: Read the print number
// TODO: Read the wishlist number (from our database) // Read the wishlist number
match db::query_card(name.as_str(), series.as_str()).await {
Some(card) => {
wishlist = card.wishlist;
}
None => {}
}
return Card { return Card {
wishlist: None, wishlist,
name, name,
series, series,
print: 0, print: 0,
@ -249,10 +257,17 @@ pub async fn analyze_card_subprocess(card: image::DynamicImage, count: u32) -> C
trace!("Name: {}", name); trace!("Name: {}", name);
let series = series_thread.await.unwrap(); let series = series_thread.await.unwrap();
trace!("Series: {}", series); trace!("Series: {}", series);
let mut wishlist: Option<i32> = None;
// TODO: Read the print number // TODO: Read the print number
// TODO: Read the wishlist number (from our database) // Read the wishlist number
match db::query_card(name.as_str(), series.as_str()).await {
Some(card) => {
wishlist = card.wishlist;
}
None => {}
}
return Card { return Card {
wishlist: None, wishlist,
name, name,
series, series,
print: 0, print: 0,

View File

@ -86,8 +86,8 @@ async fn main() {
setup_logger(&log_level).expect("Failed to setup logger"); setup_logger(&log_level).expect("Failed to setup logger");
info!("Swordfish v{} - {}", env!("CARGO_PKG_VERSION"), GITHUB_URL); info!("Swordfish v{} - {}", env!("CARGO_PKG_VERSION"), GITHUB_URL);
info!("Log level: {}", log_level); info!("Log level: {}", log_level);
info!("Loading database..."); info!("Initializing database...");
warn!("Databases are not implemented yet"); swordfish_common::database::init().await;
info!("Initializing Discord client..."); info!("Initializing Discord client...");
let framework = StandardFramework::new().group(&GENERAL_GROUP); let framework = StandardFramework::new().group(&GENERAL_GROUP);
framework.configure(Configuration::new().prefix("~")); // set the bot's prefix to "~" framework.configure(Configuration::new().prefix("~")); // set the bot's prefix to "~"
@ -193,10 +193,20 @@ async fn kdropanalyze(ctx: &Context, msg: &Message) -> CommandResult {
let mut reply_str = String::new(); let mut reply_str = String::new();
for card in cards { for card in cards {
// reply_str.push_str(&format!("{:?}\n", card)); // reply_str.push_str(&format!("{:?}\n", card));
let wishlist_str: String = match card.wishlist {
Some(wishlist) => {
let mut out_str = wishlist.to_string();
while out_str.len() < 5 {
out_str.push(' ');
}
out_str
},
None => "None ".to_string(),
};
reply_str.push_str( reply_str.push_str(
format!( format!(
":heart: `{:?}` • `{}` • **{}** • {}\n", ":heart: `{}` • `{}` • **{}** • {}\n",
card.wishlist, card.print, card.name, card.series wishlist_str, card.print, card.name, card.series
) )
.as_str(), .as_str(),
) )