packages feed

hipchat-hs-0.0.2: lib/Network/Hipchat/Client.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators     #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE DeriveGeneric     #-}

module Network.Hipchat.Client where

import           Network.Hipchat.Types.API

import           Control.Monad.Trans.Either
import           Data.Proxy
import           Data.Text                           (Text)
import Data.Aeson
import           Servant.API
import GHC.Generics
import           Servant.Client
import qualified Data.Text as T
import System.IO
import Data.Time.Clock
import Data.Monoid
import Data.Time.Format

import           Network.Hipchat.Types.Common
import           Network.Hipchat.Types.Rooms
import           Network.Hipchat.Types.TokenRequest
import           Network.Hipchat.Types.TokenResponse
import           Network.Hipchat.Types.User

hipChatAPI :: Proxy HipchatAPI
hipChatAPI = Proxy

sendMessage       :: Maybe Token -> Text -> Message -> EitherT ServantError IO SendMessageResponse
createRoom        :: Maybe Token -> CreateRoomRequest -> EitherT ServantError IO CreateRoomResponse
getRoomStatistics :: Maybe Token -> Text -> EitherT ServantError IO RoomStatistics
generateToken     :: Maybe Token -> TokenRequest -> EitherT ServantError IO TokenResponse
viewUser          :: Maybe Token -> Text -> EitherT ServantError IO User
createWebhook     :: Maybe Token -> IdOrName -> WebhookKey -> CreateWebhookRequest -> EitherT ServantError IO CreateWebhookResponse
getAllMembers     :: Maybe Token -> IdOrName -> Maybe Int -> Maybe Int -> EitherT ServantError IO GetAllMembersResponse
sendMessage :<|> createRoom :<|> getRoomStatistics :<|> generateToken :<|> viewUser :<|> createWebhook :<|> getAllMembers = client hipChatAPI host
  where
    host = BaseUrl Https "api.hipchat.com" 443


shame :: Text -> Maybe Token -> IO ()
shame id_or_email token = do
    user <- getShame id_or_email token
    putStrLn $ T.unpack user
    shameResp <- runEitherT $ lookupShame user
    case shameResp of
        Left err -> print $ show err
        Right DirectoryResponse{..} -> do
--            currentTime <- getCurrentTime
--            let seconds = diffUTCTime currentTime (unDirectoryTime drHireDate)
--            let days = floor $ seconds / 60 / 60 / 24 :: Int
   --         let (Manager mName mUsername) = head drManagers
--            let shameMessage = full_name <> " used @_here, " <>
--                    if days < 90 then
--                        " but has only been here for " <> T.pack (show days) <> " days, lets be nice."
--                    else
--                        " and has been here for " <> T.pack (show days) <> " days, SHAME!\n" <>
--                        "Maybe we should tell their manager, " <> mName <> "..."
            -- putStrLn $ T.unpack shameMessage
            --result <- runEitherT $ sendMessage "Build Engineering - Private" (Message shameMessage) token
            result <- runEitherT $ sendMessage token "top secrat" (Message $ drFullName <> ": " <> drTenure)
            case result of
                Left err -> print $ show err
                Right resp -> print resp

getShame :: Text -> Maybe Token -> IO Text
getShame id_or_email token = do
    result <- runEitherT $ viewUser token id_or_email
    case result of
        Left err -> return "" -- $ fromString $ show err
        Right User{..} -> case userEmail of
            Nothing -> return "no email =("
            Just email -> return $ head (T.splitOn "@" email)

type Directory = "api" :> "staffData" :> Capture "staff_name" Text :> Get '[JSON] DirectoryResponse

directory :: Proxy Directory
directory = Proxy

lookupShame = client directory host
  where
    host = BaseUrl Https "directory.atlassian.io" 443
data Manager = Manager Text Text deriving (Show)

instance FromJSON Manager where
    parseJSON (Object v) = Manager <$> v .: "full_name" <*> v .: "username"

data DirectoryResponse = DirectoryResponse
  { drFullName  :: Text
  --, drHireDate  :: DirectoryTime
  , drTenure     :: Text
  , drManagers   :: [Manager]
--  , drBlogPosts :: [()]
  } deriving (Generic, Show)

instance FromJSON DirectoryResponse where
  parseJSON = genericHipchatParseJSON 2

newtype DirectoryTime = DirectoryTime
  { unDirectoryTime :: UTCTime
  } deriving Show

instance FromJSON DirectoryTime where
    parseJSON (String x) = do
        utcTime <- parseTimeM False defaultTimeLocale "%F %X" (T.unpack x)
        return $ DirectoryTime utcTime