-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMembers.hs
71 lines (59 loc) · 1.62 KB
/
Members.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
{-# LANGUAGE DeriveGeneric #-}
module Members
( bagtagWidget
)
where
import Import hiding (for, get, responseBody)
import GHC.Generics (Generic)
import Network.Wreq
import Control.Lens
import Data.Aeson (FromJSON)
import Data.Aeson.Types (typeMismatch)
data Player = Player
{ _number :: String
, _name :: Maybe String
} deriving (Show, Generic)
data Players = Players
{ players :: [Player]
, _errors :: [String]
} deriving (Show, Generic)
instance FromJSON Players where
parseJSON (Object v) = Players
<$> v .: "players"
<*> v .: "Errors"
parseJSON invalid = typeMismatch "Players" invalid
instance FromJSON Player where
parseJSON (Object v) = Player
<$> v .: "Number"
<*> v .: "Name"
parseJSON invalid = typeMismatch "Player" invalid
metrixAPI :: String
metrixAPI = "https://discgolfmetrix.com/api.php?content=bagtag_list&id=6"
getPlayerData :: IO [Player]
getPlayerData = do
response <- asJSON =<< get metrixAPI
return $ players $ response ^. responseBody
getBagtagPlayers :: IO [Player]
getBagtagPlayers = do
catch getPlayerData handler
where
handler :: JSONError -> IO [Player]
handler _ = return []
bagtagWidget :: Handler Widget
bagtagWidget = do
players <- liftIO getBagtagPlayers
return $ bagtagWidget' players
bagtagWidget' :: [Player] -> Widget
bagtagWidget' players = [whamlet|
<div .card .mb-3>
<h3 .card-header>
<a .bagtag-link href=https://dgmtrx.com/bagtag/?bagtag_id=6 target=_blank>Bagtag
<div .card-body>
<ol>
$forall (Player _ mp) <- players
<li>
$maybe p <- mp
#{p}
$nothing
-
|]