module Web.Slack.Common
( Color(unColor)
, UserId(unUserId)
, SlackTimestamp(..)
, mkSlackTimestamp
, HistoryReq(..)
, mkHistoryReq
, HistoryRsp(..)
, Message(..)
, MessageType(..)
, SlackClientError(..)
, SlackMessageText(..)
)
where
import Data.Aeson
import Data.Aeson.TH
import Control.Exception
import Data.Typeable
import GHC.Generics (Generic)
import Web.HttpApiData
import Web.FormUrlEncoded
import Servant.Client
import Web.Slack.Types
import Web.Slack.Util
import Data.Text (Text)
data HistoryReq =
HistoryReq
{ historyReqChannel :: Text
, historyReqCount :: Int
, historyReqLatest :: Maybe SlackTimestamp
, historyReqOldest :: Maybe SlackTimestamp
, historyReqInclusive :: Bool
}
deriving (Eq, Generic, Show)
$(deriveFromJSON (jsonOpts "historyReq") ''HistoryReq)
instance ToForm HistoryReq where
toForm HistoryReq{..} =
[ ("channel", toQueryParam historyReqChannel)
, ("count", toQueryParam historyReqCount)
, ("latest", toQueryParam historyReqLatest)
, ("oldest", toQueryParam historyReqOldest)
, ("inclusive", toQueryParam (if historyReqInclusive then 1::Int else 0))
]
mkHistoryReq
:: Text
-> HistoryReq
mkHistoryReq channel =
HistoryReq
{ historyReqChannel = channel
, historyReqCount = 100
, historyReqLatest = Nothing
, historyReqOldest = Nothing
, historyReqInclusive = True
}
data MessageType = MessageTypeMessage
deriving (Eq, Show)
instance FromJSON MessageType where
parseJSON "message" = pure MessageTypeMessage
parseJSON _ = fail "Invalid MessageType"
data Message =
Message
{ messageType :: MessageType
, messageUser :: Maybe UserId
, messageText :: SlackMessageText
, messageTs :: SlackTimestamp
}
deriving (Eq, Generic, Show)
$(deriveFromJSON (jsonOpts "message") ''Message)
data HistoryRsp =
HistoryRsp
{ historyRspMessages :: [Message]
, historyRspHasMore :: Bool
}
deriving (Eq, Generic, Show)
$(deriveFromJSON (jsonOpts "historyRsp") ''HistoryRsp)
data SlackClientError
= ServantError ServantError
| SlackError Text
deriving (Eq, Generic, Show, Typeable)
instance Exception SlackClientError