1+ using Activities . Strava . Endpoints . Models ;
2+ using System ;
3+ using System . Collections . Generic ;
4+ using System . Linq ;
5+
6+ namespace Activities . Strava . Activities ;
7+
8+ public static class BislettService
9+ {
10+ // Update when logic is modified to trigger recalculation.
11+ private const string Version = "2022-11-30" ;
12+ private const int BislettLap = 546 ;
13+
14+ public static bool TryAdjustBislettLaps ( this DetailedActivity activity )
15+ {
16+ if ( activity . _BislettVersion == Version )
17+ {
18+ return false ;
19+ }
20+
21+ activity . _BislettVersion = Version ;
22+
23+ var intervalLaps = activity . Laps ? . Where ( lap => lap . IsInterval ) . ToList ( ) ?? new List < Lap > ( ) ;
24+ var distanceFactors = new List < double > ( ) ;
25+
26+ if ( intervalLaps . Any ( lap => lap . TotalElevationGain > 0 ) )
27+ {
28+ return true ;
29+ }
30+
31+ foreach ( var lap in intervalLaps )
32+ {
33+ var laps = lap . Distance / BislettLap ;
34+ var distanceFactor = laps % 1 ;
35+
36+ if ( distanceFactor > 0.5 )
37+ {
38+ distanceFactor = 1.0 - distanceFactor ;
39+ }
40+
41+ distanceFactor = distanceFactor / Math . Round ( laps ) ;
42+ distanceFactors . Add ( distanceFactor ) ;
43+ }
44+
45+ if ( ! distanceFactors . Any ( ) )
46+ {
47+ return true ;
48+ }
49+
50+ var name = activity . Name ;
51+ var averageFactor = distanceFactors . Average ( ) ;
52+ var maxFactor = distanceFactors . Max ( ) ;
53+
54+ // Is Bislett lap
55+ if ( maxFactor < 0.1 && averageFactor < 0.08 )
56+ {
57+ activity . IsBislettInterval = true ;
58+
59+ foreach ( var lap in intervalLaps )
60+ {
61+ var laps = lap . Distance / BislettLap ;
62+
63+ lap . OriginalDistance = lap . Distance ;
64+ lap . OriginalAverageSpeed = lap . AverageSpeed ;
65+
66+ lap . Distance = BislettLap * Math . Round ( laps ) ;
67+ lap . AverageSpeed = lap . Distance / lap . ElapsedTime ;
68+ }
69+ }
70+ else if ( activity . IsBislettInterval )
71+ {
72+ activity . IsBislettInterval = false ;
73+
74+ foreach ( var lap in intervalLaps )
75+ {
76+ if ( lap . OriginalDistance > 0 )
77+ {
78+ lap . Distance = lap . OriginalDistance ;
79+ }
80+
81+ if ( lap . OriginalAverageSpeed > 0 )
82+ {
83+ lap . AverageSpeed = lap . OriginalAverageSpeed ;
84+ }
85+ }
86+ }
87+
88+ return true ;
89+ }
90+ }
0 commit comments