
A Haskell client for the Strava V3 API.
Installation
Add it to your Cabal file:
library
build-depends:
strive ==0.5.*
Or install it manually:
$ cabal update
$ cabal install strive
This package uses Semantic Versioning.
Usage
To use the API, you'll need an access token. Once you have that, create a new
client using the default HTTP manager.
import Strive
let token = "..."
client <- buildClient token
Most types implement lenses for their fields. Lenses are preferred over directly
accessing the fields. For instance, instead of doing this:
client_accessToken (client { client_accessToken = "..." })
-- "..."
Do this:
get accessToken (set accessToken "..." client)
-- "..."
let authorizeUrl = buildAuthorizeUrl 1790 "http://localhost" ?
[ set approvalPrompt False
, set privateScope True
, set writeScope True
, set state "..."
]
print (authorizeUrl :: String)
tokenExchangeResponse <- exchangeToken 1790 "secret" "code"
print (tokenExchangeResponse :: Either String TokenExchangeResponse)
deauthorizationResponse <- deauthorize client
print (deauthorizationResponse :: Either String DeauthorizationResponse)
currentAthlete <- getCurrentAthlete client
print (currentAthlete :: Either String AthleteDetailed)
anotherAthlete <- getAthlete client 65516
print (anotherAthlete :: Either String AthleteSummary)
updatedAthlete <- updateCurrentAthlete client ?
[ set city (Just "Dallas")
, set state (Just "Texas")
, set country (Just "United States")
, set sex (Just 'M')
, set weight (Just 72.57)
]
print (updatedAthlete :: Either String AthleteDetailed)
athleteCrs <- getAthleteCrs client 65516 ?
[ set page 1
, set perPage 2
]
print (athleteCrs :: Either String [EffortDetailed])
currentFriends <- getCurrentFriends client ?
[ set page 1
, set perPage 2
]
print (currentFriends :: Either String [AthleteSummary])
friends <- getFriends client 65516 ?
[ set page 1
, set perPage 2
]
print (friends :: Either String [AthleteSummary])
currentFollowers <- getCurrentFollowers client ?
[ set page 1
, set perPage 2
]
print (currentFollowers :: Either String [AthleteSummary])
followers <- getFollowers client 65516 ?
[ set page 1
, set perPage 2
]
print (followers :: Either String [AthleteSummary])
commonFriends <- getCommonFriends client 65516 ?
[ set page 1
, set perPage 2
]
print (commonFriends :: Either String [AthleteSummary])
createdActivity <- createActivity client "An Example" "run" (UTCTime (fromGregorian 1970 0 0) 0) 10 ?
[ set description (Just "...")
, set distance (Just 100.0)
]
print (createdActivity :: Either String ActivityDetailed)
activity <- getActivity client 141273622 ?
[ set allEfforts True
]
print (activity :: Either String ActivitySummary)
updatedActivity <- updateActivity client 141273622 ?
[ set name (Just "WedEx Pit Stop")
, set type_ (Just "Ride")
, set private (Just False)
, set commute (Just True)
, set trainer (Just False)
, set gearId (Just "b387882")
, set description Nothing
]
print (updatedActivity :: Either String ActivityDetailed)
nothing <- deleteActivity client 162674281
print (nothing :: Either String ())
currentActivities <- getCurrentActivities client ?
[ set before (Just (UTCTime (fromGregorian 1970 0 0) 0))
, set after (Just (UTCTime (fromGregorian 1970 0 0) 0))
, set page 1
, set perPage 2
]
print (currentActivities :: Either String [ActivitySummary])
feed <- getFeed client ?
[ set page 1
, set perPage 2
]
print (feed :: Either String [ActivitySummary])
activityZones <- getActivityZones client 141273622
print (activityZones :: Either String [ActivityZoneDetailed])
activityLaps <- getActivityLaps client 141273622
print (activityLaps :: Either String [ActivityLapSummary])
activityComments <- getActivityComments client 90112360 ?
[ set markdown True
, set page 1
, set perPage 2
]
print (activityComments :: Either String [CommentSummary])
activityKudoers <- getActivityKudoers client 141273622 ?
[ set page 1
, set perPage 2
]
print (activityKudoers :: Either String [AthleteSummary])
activityPhotos <- getActivityPhotos client 141273622
print (activityPhotos :: Either String [PhotoSummary])
club <- getClub client 11193
print (club :: Either String ClubDetailed)
currentClubs <- getCurrentClubs client
print (currentClubs :: Either String [ClubSummary])
clubMembers <- getClubMembers client 11193 ?
[ set page 1
, set perPage 2
]
print (clubMembers :: Either String [AthleteSummary])
clubActivities <- getClubActivities client 11193 ?
[ set page 1
, set perPage 2
]
print (clubActivities :: Either String [ActivitySummary])
theGear <- getGear client "b387855"
print (theGear :: Either String GearDetailed)
theSegment <- getSegment client 4773104
print (theSegment :: Either String SegmentDetailed)
starredSegments <- getStarredSegments client ?
[ set page 1
, set perPage 2
]
print (starredSegments :: Either String [SegmentSummary])
theSegmentEfforts <- getSegmentEfforts client 4773104 ?
[ set athleteId (Just 65516)
, set range (Just ((UTCTime (fromGregorian 1970 0 0) 0), (UTCTime (fromGregorian 1970 0 0) 0)))
, set page 1
, set perPage 2
]
print (theSegmentEfforts :: Either String [EffortDetailed])
segmentLeaderboardResponse <- getSegmentLeaderboard client 4773104 ?
[ set gender (Just 'M')
, set ageGroup (Just "0_24")
, set weightClass (Just "65_74")
, set following (Just True)
, set clubId (Just 11193)
, set dateRange (Just "this_year")
, set page 1
, set perPage 2
]
print (segmentLeaderboardResponse :: Either String SegmentLeaderboardResponse)
segmentExplorerResponse <- exploreSegments client (32.0, -96.0, 33.0, -95.0) ?
[ set activityType "riding"
, set minCat 0
, set maxCat 5
]
print (segmentExplorerResponse :: Either String SegmentExplorerResponse)
segmentEffort <- getSegmentEffort client 1595370098
print (segmentEffort :: Either String EffortDetailed)
activityStreams <- getActivityStreams client 141273622 ["latlng", "watts"] ?
[ set resolution (Just "low")
, set seriesType "time"
]
print (activityStreams :: Either String [StreamDetailed])
effortStreams <- getEffortStreams client 1595370098 ["latlng", "watts"] ?
[ set resolution (Just "low")
, set seriesType "time"
]
print (effortStreams :: Either String [StreamDetailed])
segmentStreams <- getSegmentStreams client 4773104 ["latlng", "watts"] ?
[ set resolution (Just "low")
, set seriesType "time"
]
print (segmentStreams :: Either String [StreamDetailed])
uploadedActivity <- uploadActivity client (pack "...") "gpx.gz" ?
[ set activityType (Just "ride")
, set name (Just "An Example")
, set description (Just "...")
, set private True
, set trainer False
, set externalId (Just "...")
]
print (uploadedActivity :: Either String UploadStatus)
upload <- getUpload client 16486788
print (upload :: Either String UploadStatus)