Skip to content

Commit 6b288c8

Browse files
committed
time parser
1 parent cbcebc8 commit 6b288c8

File tree

4 files changed

+89
-6
lines changed

4 files changed

+89
-6
lines changed

Cargo.lock

+42
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

trackscape-discord-shared/Cargo.toml

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,7 @@ anyhow = "1.0.75"
2727
celery = "0.5.5"
2828
redis = { version = "0.23.3", features = ["json"] }
2929
wom_rs = { git = "https://github.com/fatfingers23/wom_rs.git" }
30-
chrono = "0.4.33"
30+
chrono = "0.4.33"
31+
32+
[dev-dependencies]
33+
rstest = "0.19.0"

trackscape-discord-shared/src/osrs_broadcast_extractor.rs

+42-4
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ pub mod osrs_broadcast_extractor {
232232
pub player: String,
233233
pub activity: String,
234234
pub variant: Option<String>,
235-
pub time_in_seconds: i64,
235+
pub time_in_seconds: f64,
236236
}
237237

238238
#[derive(PartialEq, Deserialize, Serialize, Debug, Clone)]
@@ -622,8 +622,9 @@ pub mod osrs_broadcast_extractor {
622622
}
623623

624624
pub fn personal_best_broadcast_extractor(message: String) -> Option<PersonalBestBroadcast> {
625+
// RuneScape Player has achieved a new Vorkath personal best: 2:28
625626
let re = regex::Regex::new(
626-
r#"^(?P<player>[\w\s]+) has achieved a new (?P<activity>[\w\s]+) personal best: (?<time>.*?)"#,
627+
r#"^(?P<player>[\w\s]+) has achieved a new (?P<activity>[\w\s]+) personal best: (?<time>[\d:]+)"#,
627628
)
628629
.unwrap();
629630

@@ -636,12 +637,35 @@ pub mod osrs_broadcast_extractor {
636637
player: player.to_string(),
637638
activity: activity.to_string(),
638639
variant: None,
639-
time_in_seconds: 0,
640+
time_in_seconds: osrs_time_parser(time),
640641
});
641642
}
642643
None
643644
}
644645

646+
pub fn osrs_time_parser(time: &str) -> f64 {
647+
let split_sub_second: Vec<&str> = time.split(".").collect();
648+
let sub_second_fraction = format!(".{:}", split_sub_second.get(1).unwrap_or(&"0"))
649+
.parse::<f64>()
650+
.unwrap_or(0.0);
651+
652+
let split_time: Vec<&str> = split_sub_second[0].split(":").collect();
653+
654+
if split_time.len() == 2 {
655+
let minutes_seconds = split_time[0].parse::<f64>().unwrap_or(0.0) * 60.0;
656+
let seconds = split_time[1].parse::<f64>().unwrap_or(0.0);
657+
return minutes_seconds + seconds + sub_second_fraction;
658+
}
659+
if split_time.len() == 3 {
660+
let hours_seconds = split_time[0].parse::<f64>().unwrap_or(0.0) * 3600.0;
661+
let minutes_seconds = split_time[1].parse::<f64>().unwrap_or(0.0) * 60.0;
662+
let seconds = split_time[2].parse::<f64>().unwrap_or(0.0);
663+
return hours_seconds + minutes_seconds + seconds + sub_second_fraction;
664+
}
665+
666+
0.0
667+
}
668+
645669
pub fn get_broadcast_type(message_content: String) -> BroadcastType {
646670
if message_content.contains("received a drop:") {
647671
return BroadcastType::ItemDrop;
@@ -743,6 +767,7 @@ mod tests {
743767
LevelMilestoneBroadcast, PersonalBestBroadcast, PetDropBroadcast, PkBroadcast,
744768
QuestCompletedBroadcast, XPMilestoneBroadcast,
745769
};
770+
use rstest::rstest;
746771
use tracing::info;
747772

748773
#[test]
@@ -1353,6 +1378,19 @@ mod tests {
13531378
}
13541379
}
13551380

1381+
#[rstest]
1382+
#[case("0:56.40", 56.40)]
1383+
#[case("1:25", 85.0)]
1384+
#[case("1:19.80", 79.8)]
1385+
#[case("1:15.00", 75.00)]
1386+
#[case("21:55.80", 1_315.80)]
1387+
#[case("1:30:00", 5_400.00)]
1388+
#[case("1:30:00.45", 5_400.45)]
1389+
fn test_osrs_time_parser(#[case] time: &str, #[case] expected: f64) {
1390+
let actual = osrs_broadcast_extractor::osrs_time_parser(time);
1391+
assert_eq!(actual, expected);
1392+
}
1393+
13561394
//Test data setup
13571395
struct ItemMessageTest {
13581396
message: String,
@@ -2075,7 +2113,7 @@ mod tests {
20752113
message: "RuneScape Player has achieved a new Vorkath personal best: 2:28".to_string(),
20762114
broadcast: PersonalBestBroadcast {
20772115
player: "RuneScape Player".to_string(),
2078-
time_in_seconds: 148,
2116+
time_in_seconds: 148.00,
20792117
activity: "Vorkath".to_string(),
20802118
variant: None,
20812119
},

trackscape-discord-shared/src/osrs_broadcast_handler.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ mod tests {
846846
impl JobQueue for MockJobQueue {
847847
async fn send_task<T: Task>(
848848
&self,
849-
task_sig: Signature<T>,
849+
_task_sig: Signature<T>,
850850
) -> Result<AsyncResult, CeleryError> {
851851
Ok(AsyncResult {
852852
task_id: "".to_string(),

0 commit comments

Comments
 (0)