🚴 A Haskell client for the Strava V3 API.
Haskell
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
library Upgrade to the latest Stackage snapshot Jul 15, 2016
test-suite Fix indentation Sep 18, 2014
.gitignore
.travis.yml
CHANGELOG.md Update project metadata Mar 16, 2016
LICENSE.md
README.lhs 🚴 2.2.1 Mar 18, 2016
README.md
Setup.hs
package.yaml 🚴 3.0.2 Jan 2, 2017
stack.yaml Upgrade to Stackage LTS 8.0 Feb 14, 2017

README.md

Strive

Version badge Build badge

Strive is a Haskell client for the Strava V3 API.


Installation

Add it to your Cabal file:

build-depends:
  strive

Or install it manually:

$ cabal update
$ cabal install strive

Strive uses Semantic Versioning. See the change log for a detailed list of changes.

Usage

To use the API, you'll need an access token. Once you have that, create a new client using the default HTTP manager.

{-# LANGUAGE OverloadedStrings #-}
import Strive
let token = "..."
client <- buildClient (Just 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 = "record token" })
-- "record token"

Do this:

get accessToken (set accessToken "lens token" client)
-- "lens token"

Authentication

Request access

  let authorizeUrl = buildAuthorizeUrl 1790 "http://localhost" $ with
        [ set approvalPrompt False
        , set privateScope True
        , set writeScope True
        , set state "..."
        ]
  print (authorizeUrl :: String)

Token exchange

  tokenExchangeResponse <- exchangeToken 1790 "secret" "code"
  print (tokenExchangeResponse :: Result TokenExchangeResponse)

Deauthorization

  deauthorizationResponse <- deauthorize client
  print (deauthorizationResponse :: Result DeauthorizationResponse)

Athletes

Retrieve current athlete

  currentAthlete <- getCurrentAthlete client
  print (currentAthlete :: Result AthleteDetailed)

Retrieve another athlete

  anotherAthlete <- getAthlete client 65516
  print (anotherAthlete :: Result AthleteSummary)

Update current athlete

  updatedAthlete <- updateCurrentAthlete client $ with
    [ set city (Just "Dallas")
    , set state (Just "Texas")
    , set country (Just "United States")
    , set sex (Just Male)
    , set weight (Just 72.57)
    ]
  print (updatedAthlete :: Result AthleteDetailed)

Totals and stats

  athleteStats <- getAthleteStats client 65516
  print (athleteStats :: Result AthleteStats)

List athlete K/QOMs/CRs

  athleteCrs <- getAthleteCrs client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (athleteCrs :: Result [EffortDetailed])

Friends and followers

List athlete friends

  currentFriends <- getCurrentFriends client $ with
    [ set page 1
    , set perPage 2
    ]
  print (currentFriends :: Result [AthleteSummary])
  friends <- getFriends client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (friends :: Result [AthleteSummary])

List athlete followers

  currentFollowers <- getCurrentFollowers client $ with
    [ set page 1
    , set perPage 2
    ]
  print (currentFollowers :: Result [AthleteSummary])
  followers <- getFollowers client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (followers :: Result [AthleteSummary])

List both following

  commonFriends <- getCommonFriends client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (commonFriends :: Result [AthleteSummary])

Activities

Create an activity

  createdActivity <- createActivity client "An Example" Run (UTCTime (fromGregorian 1970 0 0) 0) 10 $ with
    [ set description (Just "...")
    , set distance (Just 100.0)
    ]
  print (createdActivity :: Result ActivityDetailed)

Retrieve an activity

  activity <- getActivity client 141273622 $ with
    [ set allEfforts True
    ]
  print (activity :: Result ActivitySummary)

Update an activity

  updatedActivity <- updateActivity client 141273622 $ with
    [ 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 :: Result ActivityDetailed)

Delete an activity

  deletedActivity <- deleteActivity client 162674281
  print (deletedActivity :: Result ())

List athlete activities

  currentActivities <- getCurrentActivities client $ with
    [ 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 :: Result [ActivitySummary])

List related activities

  relatedActivities <- getRelatedActivities client 141273622 $ with
    [ set page 1
    , set perPage 2
    ]
  print (relatedActivities :: Result [ActivitySummary])

List friends' activities

  feed <- getFeed client $ with
    [ set page 1
    , set perPage 2
    ]
  print (feed :: Result [ActivitySummary])

List activity zones

  activityZones <- getActivityZones client 141273622
  print (activityZones :: Result [ActivityZoneDetailed])

List activity laps

  activityLaps <- getActivityLaps client 141273622
  print (activityLaps :: Result [ActivityLapSummary])

Comments

List activity comments

  activityComments <- getActivityComments client 90112360 $ with
    [ set markdown True
    , set page 1
    , set perPage 2
    ]
  print (activityComments :: Result [CommentSummary])

Kudos

List activity kudoers

  activityKudoers <- getActivityKudoers client 141273622 $ with
    [ set page 1
    , set perPage 2
    ]
  print (activityKudoers :: Result [AthleteSummary])

Photos

List activity photos

  activityPhotos <- getActivityPhotos client 141273622
  print (activityPhotos :: Result [PhotoSummary])

Clubs

Retrieve a club

  club <- getClub client 11193
  print (club :: Result ClubDetailed)

List athlete clubs

  currentClubs <- getCurrentClubs client
  print (currentClubs :: Result [ClubSummary])

List club members

  clubMembers <- getClubMembers client 11193 $ with
    [ set page 1
    , set perPage 2
    ]
  print (clubMembers :: Result [AthleteSummary])

List club activities

  clubActivities <- getClubActivities client 11193 $ with
    [ set page 1
    , set perPage 2
    ]
  print (clubActivities :: Result [ActivitySummary])

Join a club

  joinedClub <- joinClub client 165
  print (joinedClub :: Result ())

Leave a club

  leftClub <- leaveClub client 165
  print (leftClub :: Result ())

Gear

Retrieve gear

  theGear <- getGear client "b387855"
  print (theGear :: Result GearDetailed)

Segments

Retrieve a segment

  theSegment <- getSegment client 4773104
  print (theSegment :: Result SegmentDetailed)

List starred segments

  starredSegments <- getStarredSegments client $ with
    [ set page 1
    , set perPage 2
    ]
  print (starredSegments :: Result [SegmentSummary])

List efforts

  theSegmentEfforts <- getSegmentEfforts client 4773104 $ with
    [ 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 :: Result [EffortDetailed])

Segment leaderboard

  segmentLeaderboardResponse <- getSegmentLeaderboard client 4773104 $ with
    [ set gender (Just Male)
    , set ageGroup (Just Ages0To24)
    , set weightClass (Just Kilograms65To74)
    , set following (Just True)
    , set clubId (Just 11193)
    , set dateRange (Just "this_year")
    , set contextEntries (Just 15)
    , set page 1
    , set perPage 2
    ]
  print (segmentLeaderboardResponse :: Result SegmentLeaderboardResponse)

Segment explorer

  segmentExplorerResponse <- exploreSegments client (32.0, -96.0, 33.0, -95.0) $ with
    [ set activityType Riding
    , set minCat 0
    , set maxCat 5
    ]
  print (segmentExplorerResponse :: Result SegmentExplorerResponse)

Segment efforts

Retrieve a segment effort

  segmentEffort <- getSegmentEffort client 1595370098
  print (segmentEffort :: Result EffortDetailed)

Streams

Retrieve activity streams

  activityStreams <- getActivityStreams client 141273622 [LatlngStream, WattsStream] $ with
    [ set resolution (Just Low)
    , set seriesType Time
    ]
  print (activityStreams :: Result [StreamDetailed])

Retrieve effort streams

  effortStreams <- getEffortStreams client 1595370098 [LatlngStream, WattsStream] $ with
    [ set resolution (Just Low)
    , set seriesType Time
    ]
  print (effortStreams :: Result [StreamDetailed])

Retrieve segment streams

  segmentStreams <- getSegmentStreams client 4773104 [LatlngStream, WattsStream] $ with
    [ set resolution (Just Low)
    , set seriesType Time
    ]
  print (segmentStreams :: Result [StreamDetailed])

Uploads

Upload an activity

  uploadedActivity <- uploadActivity client (pack "...") "gpx.gz" $ with
    [ set activityType (Just Ride)
    , set name (Just "An Example")
    , set description (Just "...")
    , set private True
    , set trainer False
    , set externalId (Just "...")
    ]
  print (uploadedActivity :: Result UploadStatus)

Check upload status

  upload <- getUpload client 16486788
  print (upload :: Result UploadStatus)