packages feed

werewolf-slack-0.1.0.0: app/Werewolf/Slack/Application.hs

{-|
Module      : Werewolf.Slack.Application

Copyright   : (c) Henry J. Wylde, 2016
License     : BSD3
Maintainer  : public@hjwylde.com
-}

{-# LANGUAGE OverloadedStrings #-}

module Werewolf.Slack.Application (
    -- * Application
    runApplication,
) where

import Control.Concurrent
import Control.Monad.Extra

import qualified Data.ByteString.Char8      as BSC
import qualified Data.ByteString.Lazy.Char8 as BSLC
import           Data.Maybe

import Network.HTTP.Types       (status202, status400)
import Network.Wai              hiding (Response, requestBody, responseStatus)
import Network.Wai.Handler.Warp

import Werewolf.Slack.Werewolf

runApplication :: [String] -> IO ()
runApplication args = run port (application args)
    where
        port = 8080

application :: [String] -> Application
application args request respond = maybe failure (\action -> forkIO action >> success) mAction
    where
        failure = respond $ responseLBS status400 [] "bad request"
        success = respond $ responseLBS status202 [] (BSLC.pack $ fromJust mUserCommand)

        param name      = join . lookup name $ queryString request
        accessToken     = head args
        mUser           = BSC.unpack <$> param "user_name"
        mUserCommand    = BSC.unpack <$> param "text"
        mAction         = executeUserCommand accessToken <$> mUser <*> mUserCommand