feat(katana): implement character parsing from Calf's analysis

Also fix bug in kc o:w parsing
This commit is contained in:
tretrauit 2024-01-10 02:09:34 +07:00
parent 6f35d05a3e
commit 2b6dc03040
5 changed files with 177 additions and 0 deletions

View File

@ -1,3 +1,4 @@
pub const KATANA_ID: u64 = 646937666251915264; pub const KATANA_ID: u64 = 646937666251915264;
pub const SOFA_ID: u64 = 853629533855809596; pub const SOFA_ID: u64 = 853629533855809596;
pub const QINGQUE_ID: u64 = 772642704257187840; pub const QINGQUE_ID: u64 = 772642704257187840;
pub const CALF_ID: u64 = 1006025546045591632;

View File

@ -64,6 +64,8 @@ pub fn parse_cards_from_qingque_atopwl(content: &String) -> Vec<Character> {
pub fn parse_cards_from_katana_kc_ow(content: &String) -> Vec<Character> { pub fn parse_cards_from_katana_kc_ow(content: &String) -> Vec<Character> {
let mut cards: Vec<Character> = Vec::new(); let mut cards: Vec<Character> = Vec::new();
for line in content.split("\n") { for line in content.split("\n") {
let mut line = line.to_string();
line.remove_matches("~~");
trace!("Parsing line: {}", line); trace!("Parsing line: {}", line);
if !line.ends_with("**") { if !line.ends_with("**") {
continue; continue;
@ -246,3 +248,78 @@ pub fn parse_cards_from_katana_klu_lookup(content: &String) -> Option<Character>
last_update_ts: 0, last_update_ts: 0,
}) })
} }
pub fn parse_cards_from_calf_analysis(content: &String) -> Vec<Character> {
let mut cards: Vec<Character> = Vec::new();
let mut lines = content.split("\n");
// Skip first 2 lines
lines.nth(1);
for line in lines {
trace!("Parsing line: {}", line);
let mut line_string = line.to_string();
// Remove first `
match line.find('`') {
Some(i) => {
line_string.drain(0..i + 1);
}
None => continue,
}
let mut line_split = line_string.split('`');
let wishlist = match line_split.nth(0) {
Some(wishlist_str) => {
let mut wl_string = wishlist_str.to_string();
// Remove ♡
wl_string.remove(0);
// Remove "," in the number
// I don't know, I've never seen this myself.
wl_string.remove_matches(",");
// Remove whitespace
wl_string = wl_string
.split_whitespace()
.collect::<String>()
.trim()
.to_string();
trace!("Formatted wishlist number: {}", wl_string);
match wl_string.parse::<u32>() {
Ok(wishlist) => wishlist,
Err(_) => {
error!("Failed to parse wishlist number: {}", wishlist_str);
continue;
}
}
}
None => continue,
};
let mut name_series_split = match line_split.nth(0) {
Some(split) => split.split(" · "),
None => continue,
};
let series = match name_series_split.next() {
Some(series) => series.trim().to_string(),
None => continue,
};
let name = match name_series_split.next() {
Some(name) => {
let mut name_string = name.to_string();
match name_string.find("** (") {
Some(i) => {
name_string.drain(i..);
}
None => {}
}
name_string.remove_matches("**");
name_string
}
None => continue,
};
let card = Character {
wishlist: Some(wishlist),
name,
series,
last_update_ts: 0,
};
trace!("Parsed card: {:?}", card);
cards.push(card);
}
cards
}

View File

@ -93,6 +93,29 @@ async fn parse_katana_embed(embed: &Embed) {
}; };
} }
async fn parse_calf_event(ctx: &Context, event: MessageUpdateEvent) -> Result<(), String> {
if event.content.is_none() {
return Ok(());
}
let content = event.content.unwrap();
if content.contains("Apricot v6 Drop Analysis Engine") {
let cards = utils::katana::parse_cards_from_calf_analysis(&content);
if cards.len() == 0 {
return Ok(());
}
debug!("Importing cards from Calf Analysis");
match database::katana::write_characters(cards).await {
Ok(_) => {
debug!("Imported successully");
}
Err(why) => {
error!("Failed to import card: {:?}", why);
}
}
}
Ok(())
}
async fn parse_qingque_event(ctx: &Context, event: MessageUpdateEvent) -> Result<(), String> { async fn parse_qingque_event(ctx: &Context, event: MessageUpdateEvent) -> Result<(), String> {
if event.embeds.is_none() || event.embeds.clone().unwrap().len() == 0 { if event.embeds.is_none() || event.embeds.clone().unwrap().len() == 0 {
return Ok(()); return Ok(());
@ -174,6 +197,9 @@ impl EventHandler for Handler {
constants::QINGQUE_ID => { constants::QINGQUE_ID => {
parse_qingque_event(&ctx, event).await.unwrap(); parse_qingque_event(&ctx, event).await.unwrap();
} }
constants::CALF_ID => {
parse_calf_event(&ctx, event).await.unwrap();
}
_ => {} _ => {}
} }
} }

View File

@ -254,6 +254,51 @@ pub async fn dbg_parse_katana_klu_lookup(ctx: &Context, msg: &Message) -> Comman
Ok(()) Ok(())
} }
pub async fn dbg_parse_calf_analysis(ctx: &Context, msg: &Message) -> CommandResult {
let target_msg = match dbg_get_message("embed", ctx, msg).await {
Ok(msg) => msg,
Err(_) => {
return Ok(());
}
};
let cards = utils::katana::parse_cards_from_calf_analysis(&target_msg.content);
helper::info_message(
ctx,
msg,
format!("Parsed cards: ```\n{:?}\n```", cards),
None,
)
.await;
Ok(())
}
pub async fn dbg_message(ctx: &Context, msg: &Message) -> CommandResult {
let target_msg = match dbg_get_message("message", ctx, msg).await {
Ok(msg) => msg,
Err(_) => {
return Ok(());
}
};
let content = match target_msg.content.len() {
0 => "None".to_string(),
_ => target_msg.content,
};
helper::info_message(
ctx,
msg,
format!(
"Content: \n\
```\n\
{}\n\
```",
content
),
Some("Message information".to_string()),
)
.await;
Ok(())
}
pub async fn dbg_embed(ctx: &Context, msg: &Message) -> CommandResult { pub async fn dbg_embed(ctx: &Context, msg: &Message) -> CommandResult {
let target_msg = match dbg_get_message("embed", ctx, msg).await { let target_msg = match dbg_get_message("embed", ctx, msg).await {
Ok(msg) => msg, Ok(msg) => msg,

View File

@ -70,11 +70,37 @@ impl EventHandler for Handler {
constants::QINGQUE_ID => { constants::QINGQUE_ID => {
parse_qingque_event(&ctx, event).await.unwrap(); parse_qingque_event(&ctx, event).await.unwrap();
} }
constants::CALF_ID => {
parse_calf_event(&ctx, event).await.unwrap();
}
_ => {} _ => {}
} }
} }
} }
async fn parse_calf_event(ctx: &Context, event: MessageUpdateEvent) -> Result<(), String> {
if event.content.is_none() {
return Ok(());
}
let content = event.content.unwrap();
if content.contains("Apricot v6 Drop Analysis Engine") {
let cards = utils::katana::parse_cards_from_calf_analysis(&content);
if cards.len() == 0 {
return Ok(());
}
debug!("Importing cards from Calf Analysis");
match database::katana::write_characters(cards).await {
Ok(_) => {
debug!("Imported successully");
}
Err(why) => {
error!("Failed to import card: {:?}", why);
}
}
}
Ok(())
}
async fn parse_qingque_event(ctx: &Context, event: MessageUpdateEvent) -> Result<(), String> { async fn parse_qingque_event(ctx: &Context, event: MessageUpdateEvent) -> Result<(), String> {
if event.embeds.is_none() || event.embeds.clone().unwrap().len() == 0 { if event.embeds.is_none() || event.embeds.clone().unwrap().len() == 0 {
return Ok(()); return Ok(());
@ -320,10 +346,12 @@ async fn debug(ctx: &Context, msg: &Message) -> CommandResult {
"kdropanalyze" => debug::dbg_kdropanalyze(ctx, msg).await?, "kdropanalyze" => debug::dbg_kdropanalyze(ctx, msg).await?,
"kda" => debug::dbg_kdropanalyze(ctx, msg).await?, "kda" => debug::dbg_kdropanalyze(ctx, msg).await?,
"embed" => debug::dbg_embed(ctx, msg).await?, "embed" => debug::dbg_embed(ctx, msg).await?,
"message" => debug::dbg_message(ctx, msg).await?,
"parse-qingque-atopwl" => debug::dbg_parse_qingque_atopwl(ctx, msg).await?, "parse-qingque-atopwl" => debug::dbg_parse_qingque_atopwl(ctx, msg).await?,
"parse-katana-kc_ow" => debug::dbg_parse_katana_kc_ow(ctx, msg).await?, "parse-katana-kc_ow" => debug::dbg_parse_katana_kc_ow(ctx, msg).await?,
"parse-katana-klu_lookup" => debug::dbg_parse_katana_klu_lookup(ctx, msg).await?, "parse-katana-klu_lookup" => debug::dbg_parse_katana_klu_lookup(ctx, msg).await?,
"parse-katana-klu_results" => debug::dbg_parse_katana_klu_results(ctx, msg).await?, "parse-katana-klu_results" => debug::dbg_parse_katana_klu_results(ctx, msg).await?,
"parse-calf-analysis" => debug::dbg_parse_calf_analysis(ctx, msg).await?,
_ => { _ => {
helper::error_message( helper::error_message(
ctx, ctx,