packages feed

pr-tools-0.1.0.0: app/pr-send.hs

{-# LANGUAGE OverloadedStrings #-}

import PRTools.Config (trimTrailing, sanitizeBranch, getSlackWebhook, getSlackToken, getSlackChannel)

import Data.Aeson (encode, object, (.=))
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import Data.CaseInsensitive (mk)
import Network.HTTP.Client (RequestBody(RequestBodyLBS), httpLbs, method, newManager, parseRequest, requestBody, requestHeaders, responseStatus)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Network.HTTP.Types (statusCode)
import System.Directory (doesFileExist, getHomeDirectory)
import System.Environment (getArgs)
import System.Exit (exitWith, ExitCode(..))
import System.FilePath ((</>))
import System.IO (hPutStrLn, stderr)
import System.Process (readProcess)
import PRTools.Slack (sendViaApi, sendViaWebhook)

main :: IO ()
main = do
  args <- getArgs
  branch <- if not (null args) then return (head args) else fmap trimTrailing (readProcess "git" ["rev-parse", "--abbrev-ref", "HEAD"] "")
  root <- fmap trimTrailing (readProcess "git" ["rev-parse", "--show-toplevel"] "")
  let safeBranch = sanitizeBranch branch
  let mdPath = root </> ".pr-drafts" </> (safeBranch ++ ".md")
  exists <- doesFileExist mdPath
  if not exists
    then do
      hPutStrLn stderr $ "Error: Snapshot not found at " ++ mdPath
      exitWith (ExitFailure 1)
    else do
      md <- readFile mdPath
      let summary = "New PR: " ++ branch ++ ". See attached for details.\n\nReact with :thumbsup: to approve or :thumbsdown: to request changes."
      let fileContent = md
      let filename = "pr-snapshot-" ++ safeBranch ++ ".md"
      mbToken <- getSlackToken
      mbChannel <- getSlackChannel
      mbWebhook <- getSlackWebhook
      case (mbToken, mbChannel) of
        (Just token, Just channel) -> sendViaApi summary fileContent filename channel token
        _ -> case mbWebhook of
          Nothing -> do
            hPutStrLn stderr "Slack not configured"
            exitWith (ExitFailure 1)
          Just webhook -> do
            let message = "New PR: " ++ branch ++ "\n\n" ++ md ++ "\n\nReact with :thumbsup: to approve or :thumbsdown: to request changes."
            sendViaWebhook webhook message