werewolf-slack-0.2.0.0: app/Werewolf/Slack/Slack.hs
{-|
Module : Werewolf.Slack.Slack
Copyright : (c) Henry J. Wylde, 2016
License : BSD3
Maintainer : public@hjwylde.com
-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
module Werewolf.Slack.Slack (
-- * Slack
notify,
) where
import Control.Monad.Extra
import Control.Monad.Reader
import Control.Monad.State
import Data.Aeson
import Network.HTTP.Client
import Network.HTTP.Types.Method
import Werewolf.Slack.Options
url :: MonadReader Options m => m String
url = asks $ ("https://hooks.slack.com/services/" ++) . optAccessToken
notify :: (MonadIO m, MonadReader Options m, MonadState Manager m) => String -> String -> m ()
notify to message = do
manager <- get
initialRequest <- url >>= liftIO . parseUrl
let request = initialRequest { method = methodPost, requestBody = body }
whenM (asks optDebug) $ liftIO (print request)
response <- liftIO $ httpLbs request manager
whenM (asks optDebug) $ liftIO (print response)
where
body = RequestBodyLBS $ encode payload
payload = object
[ "channel" .= to
, "text" .= message
]