{-# LANGUAGE OverloadedStrings, QuasiQuotes, LambdaCase #-} module Main where import Control.Concurrent import Control.Monad.Except import Data.IORef import Data.String.Interpolate.IsString import qualified Data.Text as T import Web.Slack.ProgressBar mySlackConfig :: SlackConfig mySlackConfig = SlackConfig { slackApiToken = "my-slack-api-token" } main :: IO () main = runProgressBar >>= \case Left err -> error [i|Progress bar failed: '#{err}'|] Right () -> return () runProgressBar :: IO (Either T.Text ()) runProgressBar = runExceptT $ do let progressBarInfo = ProgressBarInfo { progressBarInfoTopMessage = Just "Top message" , progressBarInfoBottomMessage = Just "Bottom message" , progressBarInfoSize = Just 0 , progressBarInfoAttachments = Just [] } progressBar <- ExceptT $ createProgressBar mySlackConfig "test-channel" progressBarInfo attachmentsRef <- liftIO $ newIORef [] forM_ [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] $ \size -> do liftIO $ threadDelay 1000000 -- Add attachments on a few examples when (size `elem` [30, 60, 90]) $ liftIO $ modifyIORef attachmentsRef (<> [[i|Got failure at #{size}|]]) attachments <- liftIO $ readIORef attachmentsRef ExceptT $ updateProgressBar mySlackConfig progressBar ( progressBarInfo { progressBarInfoSize = Just size , progressBarInfoAttachments = Just [ProgressBarAttachment x "#ff4136" | x <- attachments] , progressBarInfoBottomMessage = Just [i|Currently running at #{size}|] })