diff --git a/slack-api.cabal b/slack-api.cabal index f58ffc3..4d00ed4 100755 --- a/slack-api.cabal +++ b/slack-api.cabal @@ -70,7 +70,7 @@ library , bytestring >= 0.9.1 , containers >= 0.4 -- Normal Packages - , aeson >= 1.0 + , aeson >= 2.0 , errors >= 1.4 && < 3.0 , hashable >= 1.2 , io-streams >= 1.2 diff --git a/src/Web/Slack.hs b/src/Web/Slack.hs index 1c3350d..dc92c6a 100644 --- a/src/Web/Slack.hs +++ b/src/Web/Slack.hs @@ -103,8 +103,8 @@ withSlackHandle conf fn = crashOnError $ do , _shSession = sessionInfo , _shCounter = freshCounter } - WS.forkPingThread conn 10 - fn h + WS.withPingThread conn 10 (pure ()) $ + fn h parseWebSocketUrl :: Monad m => T.Text -> ExceptT T.Text m (String, String) parseWebSocketUrl url = do diff --git a/src/Web/Slack/Types/Channel.hs b/src/Web/Slack/Types/Channel.hs index e875e0a..7f63ba8 100644 --- a/src/Web/Slack/Types/Channel.hs +++ b/src/Web/Slack/Types/Channel.hs @@ -30,7 +30,7 @@ data Channel = Channel { _channelId :: ChannelId makeLenses ''Channel -defaultToFalse :: Object -> Text -> Parser Bool +defaultToFalse :: Object -> Key -> Parser Bool defaultToFalse o tag = fmap (fromMaybe False) $ o .:? tag instance FromJSON Channel where diff --git a/src/Web/Slack/Types/Event.hs b/src/Web/Slack/Types/Event.hs index aa82772..b736f2a 100644 --- a/src/Web/Slack/Types/Event.hs +++ b/src/Web/Slack/Types/Event.hs @@ -202,10 +202,9 @@ data ChannelRenameInfo = ChannelRenameInfo , _channelRenameName :: Text , _channelRenameCreated :: Time } deriving Show -makeLenses ''ChannelRenameInfo - instance FromJSON ChannelRenameInfo where parseJSON = withObject "ChannelRenameInfo" (\o -> ChannelRenameInfo <$> o .: "id" <*> o .: "name" <*> o .: "created") +makeLenses ''ChannelRenameInfo makePrisms ''Event diff --git a/src/Web/Slack/Types/File.hs b/src/Web/Slack/Types/File.hs index be91199..495eb74 100644 --- a/src/Web/Slack/Types/File.hs +++ b/src/Web/Slack/Types/File.hs @@ -62,6 +62,15 @@ data File = File { _fileId :: FileId data Mode = Hosted | External | Snippet | Post deriving Show +instance FromJSON Mode where + parseJSON = withText "mode" + (\case + "hosted" -> pure Hosted + "external" -> pure External + "snippet" -> pure Snippet + "post" -> pure Post + s -> fail $ "Unrecognised mode: " ++ T.unpack s) + instance FromJSON File where parseJSON = withObject "File" (\o -> File <$> o .: "id" <*> o .: "timestamp" <*> o .: "name" <*> o .: "title" @@ -93,13 +102,3 @@ makeLenses ''FileUrl makeLenses ''FileReference makeLenses ''Thumbnail makeLenses ''Preview - - -instance FromJSON Mode where - parseJSON = withText "mode" - (\case - "hosted" -> pure Hosted - "external" -> pure External - "snippet" -> pure Snippet - "post" -> pure Post - s -> fail $ "Unrecognised mode: " ++ T.unpack s) diff --git a/src/Web/Slack/Types/Item.hs b/src/Web/Slack/Types/Item.hs index b5491b3..2191314 100644 --- a/src/Web/Slack/Types/Item.hs +++ b/src/Web/Slack/Types/Item.hs @@ -67,6 +67,9 @@ instance FromJSON MessageUpdate where data Edited = Edited { _editedUser :: UserId, _editTimestap :: SlackTimeStamp } deriving Show +instance FromJSON Edited where + parseJSON = withObject "Edited" (\o -> Edited <$> o .: "user" <*> o .: "ts") + data MessageReplied = MessageReplied { _messageRepliedThreadTS :: SlackTimeStamp @@ -126,6 +129,3 @@ makeLenses ''Edited makeLenses ''MessageReplied makeLenses ''MessageUpdate makeLenses ''ThreadBroadcastRoot - -instance FromJSON Edited where - parseJSON = withObject "Edited" (\o -> Edited <$> o .: "user" <*> o .: "ts") diff --git a/src/Web/Slack/Types/Message.hs b/src/Web/Slack/Types/Message.hs index 8a1d26b..8692309 100644 --- a/src/Web/Slack/Types/Message.hs +++ b/src/Web/Slack/Types/Message.hs @@ -116,5 +116,5 @@ instance ToJSON AttachmentColor where $(deriveToJSON defaultOptions {fieldLabelModifier = toSnake . drop 7} ''MessagePayload) $(deriveToJSON defaultOptions {fieldLabelModifier = toSnake . drop 4} ''PingPayload) -$(deriveToJSON defaultOptions {fieldLabelModifier = toSnake . drop 10} ''Attachment) $(deriveToJSON defaultOptions {fieldLabelModifier = toSnake . drop 5} ''Field) +$(deriveToJSON defaultOptions {fieldLabelModifier = toSnake . drop 10} ''Attachment) diff --git a/src/Web/Slack/Types/Preferences.hs b/src/Web/Slack/Types/Preferences.hs index 32f5de9..88e568e 100755 --- a/src/Web/Slack/Types/Preferences.hs +++ b/src/Web/Slack/Types/Preferences.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell, LambdaCase #-} +{-# LANGUAGE TemplateHaskell, LambdaCase, TypeApplications #-} module Web.Slack.Types.Preferences where import Data.Aeson.TH @@ -82,7 +82,7 @@ data Preferences = Preferences $(deriveJSON defaultOptions {fieldLabelModifier = \case "_prefTime24" -> "time24" - s -> toSnake . drop (length "_pref") $ s} ''Preferences) + s -> toSnake . drop (length @[] "_pref") $ s} ''Preferences) -- Bad performance regression from lens 4.6 causes GHC to run out of memory -- on compilation diff --git a/src/Web/Slack/Types/Subteam.hs b/src/Web/Slack/Types/Subteam.hs index 06b1f74..6dd9f92 100644 --- a/src/Web/Slack/Types/Subteam.hs +++ b/src/Web/Slack/Types/Subteam.hs @@ -4,7 +4,6 @@ module Web.Slack.Types.Subteam where import Data.Aeson (FromJSON(parseJSON), (.:), withObject) import Data.Text (Text) -import Data.Word (Word) import Web.Slack.Types.Id (SubteamId, TeamId, UserId) data Subteam = diff --git a/src/Web/Slack/Types/User.hs b/src/Web/Slack/Types/User.hs index b19c56b..8a4f7b3 100644 --- a/src/Web/Slack/Types/User.hs +++ b/src/Web/Slack/Types/User.hs @@ -76,11 +76,6 @@ data Profile = Profile , _profileImage192 :: URL } deriving (Show) -makeLenses ''Profile -makeLenses ''Permissions -makeLenses ''Timezone -makeLenses ''User - instance FromJSON Profile where parseJSON = withObject "Profile" (\o -> let v = (o .:) @@ -90,4 +85,9 @@ instance FromJSON Profile where <*> vm "skype" <*> vm "phone" <*> v "image_24" <*> v "image_32" <*> v "image_48" <*> v "image_72" <*> v "image_192") +makeLenses ''Profile +makeLenses ''Permissions +makeLenses ''Timezone +makeLenses ''User + type Username = Text