module Web.Slack.Message (sendMessage, makePingPacket, ping) where
import Control.Applicative
import Control.Lens
import Control.Monad.State
import Data.Aeson (encode)
import Data.Aeson.TH
import Data.Char
import qualified Data.Text as T
import qualified Network.WebSockets as WS
import Web.Slack.State
import Web.Slack.Types
import Data.Time.Clock.POSIX
import Prelude
data MessagePayload = MessagePayload
{ messageId :: Int
, messageType :: T.Text
, messageChannel :: ChannelId
, messageText :: T.Text } deriving Show
$(deriveToJSON defaultOptions {fieldLabelModifier = map toLower . drop 7} ''MessagePayload)
sendMessage :: ChannelId -> T.Text -> Slack s ()
sendMessage cid message = do
conn <- use connection
uid <- counter
let payload = MessagePayload uid "message" cid message
slackLog payload
liftIO $ WS.sendTextData conn (encode payload)
data PingPayload = PingPayload
{ pingId :: Int
, pingType :: T.Text
, pingTimestamp :: Int
} deriving Show
$(deriveToJSON defaultOptions {fieldLabelModifier = map toLower . drop 4} ''PingPayload)
makePingPacket :: Slack s (IO ())
makePingPacket = do
conn <- use connection
uid <- counter
now <- round <$> liftIO getPOSIXTime
let payload = PingPayload uid "ping" now
return (ping conn payload)
ping :: WS.Connection -> PingPayload -> IO ()
ping conn payload =
WS.sendTextData conn (encode payload)