@@ -257,6 +257,49 @@ pub mod osrs_broadcast_extractor {
257
257
pub time_in_seconds : f64 ,
258
258
}
259
259
260
+ //Leagues broadcasts
261
+ //TODO may come back and add more descriptive broadcasts for Leagues, but right now just going the "firehose" route
262
+ // #[derive(Clone, Debug, Serialize, Deserialize)]
263
+ // pub struct AreaUnlockBroadcast {
264
+ // pub area: String,
265
+ // pub player: String
266
+ // }
267
+
268
+ // #[derive(Clone, Debug, Serialize, Deserialize)]
269
+ // pub struct LeaguesRankBroadcast {
270
+ // pub area: String,
271
+ // pub player: String
272
+ // }
273
+
274
+ // #[derive(Clone, Debug, Serialize, Deserialize)]
275
+ // pub struct CombatMasteriesBroadcast {
276
+ // pub player: String,
277
+ // pub combat_mastery: String,
278
+ // pub rank: i64,
279
+ // }
280
+
281
+ #[ derive( Clone , Debug , Serialize , Deserialize , PartialEq ) ]
282
+ pub enum LeaguesBroadCastType {
283
+ AreaUnlock ,
284
+ LeaguesRank ,
285
+ CombatMasteries ,
286
+ RelicTier ,
287
+ //Normal broadcast but for leagues, like drops
288
+ NormalBroadCast
289
+ }
290
+
291
+ impl LeaguesBroadCastType {
292
+ pub fn to_broadcast_type ( & self ) -> BroadcastType {
293
+ match self {
294
+ LeaguesBroadCastType :: AreaUnlock => BroadcastType :: AreaUnlock ,
295
+ LeaguesBroadCastType :: LeaguesRank => BroadcastType :: LeaguesRank ,
296
+ LeaguesBroadCastType :: CombatMasteries => BroadcastType :: CombatMasteries ,
297
+ LeaguesBroadCastType :: RelicTier => BroadcastType :: RelicTier ,
298
+ LeaguesBroadCastType :: NormalBroadCast => BroadcastType :: Unknown ,
299
+ }
300
+ }
301
+ }
302
+
260
303
#[ derive( PartialEq , Deserialize , Serialize , Debug , Clone ) ]
261
304
pub enum BroadcastType {
262
305
ItemDrop ,
@@ -274,7 +317,12 @@ pub mod osrs_broadcast_extractor {
274
317
ExpelledFromClan ,
275
318
CofferDonation ,
276
319
CofferWithdrawal ,
277
- PersonalBest ,
320
+ PersonalBest ,
321
+ //Leagues Broadcasts
322
+ AreaUnlock ,
323
+ LeaguesRank ,
324
+ CombatMasteries ,
325
+ RelicTier ,
278
326
Unknown ,
279
327
}
280
328
@@ -297,7 +345,12 @@ pub mod osrs_broadcast_extractor {
297
345
BroadcastType :: ExpelledFromClan => "Expelled From Clan" . to_string ( ) ,
298
346
BroadcastType :: CofferDonation => "Coffer Donation" . to_string ( ) ,
299
347
BroadcastType :: CofferWithdrawal => "Coffer Withdrawal" . to_string ( ) ,
300
- BroadcastType :: PersonalBest => "Personal Best" . to_string ( ) ,
348
+ BroadcastType :: PersonalBest => "Personal Best" . to_string ( ) ,
349
+ //Leagues Broadcasts
350
+ BroadcastType :: AreaUnlock => "Area Unlock" . to_string ( ) ,
351
+ BroadcastType :: LeaguesRank => "Leagues Rank" . to_string ( ) ,
352
+ BroadcastType :: CombatMasteries => "Combat Masteries" . to_string ( ) ,
353
+ BroadcastType :: RelicTier => "Relic Tier" . to_string ( ) ,
301
354
}
302
355
}
303
356
@@ -315,6 +368,11 @@ pub mod osrs_broadcast_extractor {
315
368
"Level Milestone" => BroadcastType :: LevelMilestone ,
316
369
"Collection Log" => BroadcastType :: CollectionLog ,
317
370
"Personal Best" => BroadcastType :: PersonalBest ,
371
+ //Leagues Broadcasts
372
+ "Area Unlock" => BroadcastType :: AreaUnlock ,
373
+ "Leagues Rank" => BroadcastType :: LeaguesRank ,
374
+ "Combat Masteries" => BroadcastType :: CombatMasteries ,
375
+ "Relic Tier" => BroadcastType :: RelicTier ,
318
376
_ => BroadcastType :: Unknown ,
319
377
}
320
378
}
@@ -338,6 +396,11 @@ pub mod osrs_broadcast_extractor {
338
396
BroadcastType :: CofferDonation ,
339
397
BroadcastType :: CofferWithdrawal ,
340
398
BroadcastType :: PersonalBest ,
399
+ //Leagues Broadcasts
400
+ BroadcastType :: AreaUnlock ,
401
+ BroadcastType :: LeaguesRank ,
402
+ BroadcastType :: CombatMasteries ,
403
+ BroadcastType :: RelicTier ,
341
404
]
342
405
}
343
406
@@ -650,6 +713,23 @@ pub mod osrs_broadcast_extractor {
650
713
}
651
714
}
652
715
716
+ pub fn leagues_catch_all_broadcast_extractor (
717
+ message : String ,
718
+ ) -> Option < LeaguesBroadCastType > {
719
+ if message. contains ( "has earned" ) && message. contains ( "Combat mastery" ) {
720
+ return Some ( LeaguesBroadCastType :: CombatMasteries ) ;
721
+ }
722
+
723
+ if message. contains ( "has unlocked" ) && message. contains ( "League area" ) {
724
+ return Some ( LeaguesBroadCastType :: AreaUnlock ) ;
725
+ }
726
+
727
+ if message. contains ( "has unlocked" ) && message. contains ( "League relic!" ) {
728
+ return Some ( LeaguesBroadCastType :: RelicTier ) ;
729
+ }
730
+ None
731
+ }
732
+
653
733
/// Parses a time string in the format of `HH:MM:SS` or `MM:SS` and returns the time in seconds
654
734
pub fn osrs_time_parser ( time : & str ) -> f64 {
655
735
let split_sub_second: Vec < & str > = time. split ( "." ) . collect ( ) ;
@@ -826,6 +906,7 @@ mod tests {
826
906
LevelMilestoneBroadcast , PersonalBestBroadcast , PetDropBroadcast , PkBroadcast ,
827
907
QuestCompletedBroadcast , XPMilestoneBroadcast ,
828
908
} ;
909
+ use osrs_broadcast_extractor:: LeaguesBroadCastType ;
829
910
use rstest:: rstest;
830
911
use tracing:: info;
831
912
@@ -1453,6 +1534,21 @@ mod tests {
1453
1534
}
1454
1535
}
1455
1536
1537
+ #[ test]
1538
+ fn test_leagues_catch_all_broadcast_extractor ( ) {
1539
+ let test_leagues_catch_all = get_leagues_catch_all_broadcast_messages ( ) ;
1540
+ for test_leagues_catch_all in test_leagues_catch_all {
1541
+ let possible_leagues_catch_all_extract =
1542
+ osrs_broadcast_extractor:: leagues_catch_all_broadcast_extractor (
1543
+ test_leagues_catch_all. message . clone ( ) ,
1544
+ ) ;
1545
+ let leagues_catch_all = possible_leagues_catch_all_extract. unwrap ( ) ;
1546
+ info ! ( "{:?}" , leagues_catch_all) ;
1547
+ assert_eq ! ( leagues_catch_all, test_leagues_catch_all. broadcast) ;
1548
+ }
1549
+ }
1550
+
1551
+
1456
1552
#[ rstest]
1457
1553
#[ case( "0:56.40" , 56.40 ) ]
1458
1554
#[ case( "1:25" , 85.0 ) ]
@@ -2302,4 +2398,27 @@ mod tests {
2302
2398
2303
2399
messages
2304
2400
}
2401
+
2402
+ fn get_leagues_catch_all_broadcast_messages ( ) -> Vec < TestBroadcast < LeaguesBroadCastType > > {
2403
+ let mut messages: Vec < TestBroadcast < LeaguesBroadCastType > > = Vec :: new ( ) ;
2404
+
2405
+ messages. push ( TestBroadcast {
2406
+ message : "RuneScape Player has earned their 6th Combat mastery point!" . to_string ( ) ,
2407
+ broadcast : LeaguesBroadCastType :: CombatMasteries ,
2408
+ } ) ;
2409
+
2410
+ messages. push ( TestBroadcast {
2411
+ message : "RuneScape Player has unlocked their 3rd League area!" . to_string ( ) ,
2412
+ broadcast : LeaguesBroadCastType :: AreaUnlock ,
2413
+ } ) ;
2414
+
2415
+ messages. push ( TestBroadcast {
2416
+ message : "RuneScape Player has unlocked their tier 3 League relic!" . to_string ( ) ,
2417
+ broadcast : LeaguesBroadCastType :: RelicTier ,
2418
+ } ) ;
2419
+
2420
+ //TODO add rank as we find more examples
2421
+
2422
+ messages
2423
+ }
2305
2424
}
0 commit comments