@@ -232,7 +232,7 @@ pub mod osrs_broadcast_extractor {
232
232
pub player : String ,
233
233
pub activity : String ,
234
234
pub variant : Option < String > ,
235
- pub time_in_seconds : i64 ,
235
+ pub time_in_seconds : f64 ,
236
236
}
237
237
238
238
#[ derive( PartialEq , Deserialize , Serialize , Debug , Clone ) ]
@@ -622,8 +622,9 @@ pub mod osrs_broadcast_extractor {
622
622
}
623
623
624
624
pub fn personal_best_broadcast_extractor ( message : String ) -> Option < PersonalBestBroadcast > {
625
+ // RuneScape Player has achieved a new Vorkath personal best: 2:28
625
626
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:]+ )"# ,
627
628
)
628
629
. unwrap ( ) ;
629
630
@@ -636,12 +637,35 @@ pub mod osrs_broadcast_extractor {
636
637
player : player. to_string ( ) ,
637
638
activity : activity. to_string ( ) ,
638
639
variant : None ,
639
- time_in_seconds : 0 ,
640
+ time_in_seconds : osrs_time_parser ( time ) ,
640
641
} ) ;
641
642
}
642
643
None
643
644
}
644
645
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
+
645
669
pub fn get_broadcast_type ( message_content : String ) -> BroadcastType {
646
670
if message_content. contains ( "received a drop:" ) {
647
671
return BroadcastType :: ItemDrop ;
@@ -743,6 +767,7 @@ mod tests {
743
767
LevelMilestoneBroadcast , PersonalBestBroadcast , PetDropBroadcast , PkBroadcast ,
744
768
QuestCompletedBroadcast , XPMilestoneBroadcast ,
745
769
} ;
770
+ use rstest:: rstest;
746
771
use tracing:: info;
747
772
748
773
#[ test]
@@ -1353,6 +1378,19 @@ mod tests {
1353
1378
}
1354
1379
}
1355
1380
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
+
1356
1394
//Test data setup
1357
1395
struct ItemMessageTest {
1358
1396
message : String ,
@@ -2075,7 +2113,7 @@ mod tests {
2075
2113
message : "RuneScape Player has achieved a new Vorkath personal best: 2:28" . to_string ( ) ,
2076
2114
broadcast : PersonalBestBroadcast {
2077
2115
player : "RuneScape Player" . to_string ( ) ,
2078
- time_in_seconds : 148 ,
2116
+ time_in_seconds : 148.00 ,
2079
2117
activity : "Vorkath" . to_string ( ) ,
2080
2118
variant : None ,
2081
2119
} ,
0 commit comments