Skip to content

Commit 4850905

Browse files
committed
fix: banner win/loss detection
1 parent 044b30b commit 4850905

1 file changed

Lines changed: 16 additions & 6 deletions

File tree

src/api/banner_helpers.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use std::{collections::HashMap, ops::Range};
22

33
use chrono::{DateTime, Utc};
44

5-
// Standard-pool 5★ HSR characters and light cones. A pull whose item is in this list and whose
6-
// timestamp falls outside every rate-up banner is a Loss; everything else counts as a Win.
5+
// Standard-pool 5★ HSR characters and light cones. A pull outside every configured banner window
6+
// is a Loss only when the item is in this list; otherwise it is a Win.
77
pub const HSR_STANDARD: &[i32] = &[
88
1209, 1004, 1101, 1211, 1104, 1107, 1003, // characters
99
23000, 23002, 23003, 23004, 23005, 23012, 23013, // light cones
@@ -20,9 +20,19 @@ pub fn is_win_fn<'a>(
2020
standard: &'a [i32],
2121
) -> impl Fn(i32, DateTime<Utc>) -> bool + 'a {
2222
move |item_id, timestamp| {
23-
banners
24-
.get(&item_id)
25-
.is_some_and(|v| v.iter().any(|r| r.contains(&timestamp)))
26-
|| !standard.contains(&item_id)
23+
let matching_items: Vec<_> = banners
24+
.iter()
25+
.filter(|(_, ranges)| ranges.iter().any(|range| range.contains(&timestamp)))
26+
.map(|(item_id, _)| *item_id)
27+
.collect();
28+
29+
let is_standard = standard.contains(&item_id);
30+
let is_win = if matching_items.is_empty() {
31+
!is_standard
32+
} else {
33+
matching_items.contains(&item_id)
34+
};
35+
36+
is_win
2737
}
2838
}

0 commit comments

Comments
 (0)