packages feed

i3blocks-hs-contrib-2.0.0: Volume/Main.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import           Common
import           Control.Applicative (liftA2)
import           Data.Maybe          (maybe, fromMaybe)
import           System.Environment (getArgs)
import           Data.Text           (pack, strip, unpack)
import           Turtle
import           Data.Text.IO (putStrLn)
import           Prelude      hiding (putStrLn)

main :: IO ()
main = sh $ do
  icons <- liftIO getArgs
  liftIO . putStrLn =<< liftA2 (formatVol icons) isMuted getVolume
  maybe (return ExitSuccess) handleButton =<< currentButton

getMutedIcon :: [String] -> Maybe Text
getMutedIcon icons = case icons of
  mutedIcon : _ -> Just $ pack mutedIcon
  _             -> Nothing

getLowVolIcon :: [String] -> Maybe Text
getLowVolIcon icons = case icons of
  _ : lowVolIcon : _ -> Just $ pack lowVolIcon
  _                  -> Nothing

getHighVolIcon :: [String] -> Maybe Text
getHighVolIcon icons = case icons of
  _ : _ : highVolIcon : _ -> Just $ pack highVolIcon
  _                       -> Nothing

handleButton :: MonadIO io => Button -> io ExitCode
handleButton LeftClick  = shell "pavucontrol" empty
handleButton RightClick = shell "ponymix toggle >/dev/null" empty
handleButton WheelUp    = shell "ponymix increase 5 >/dev/null" empty
handleButton WheelDown  = shell "ponymix decrease 5 >/dev/null" empty
handleButton _          = pure . ExitFailure $ 1

formatVol :: [String] -> Bool -> Integer -> Text
formatVol icons True _    = fromMaybe "Muted" $ getMutedIcon icons
formatVol icons False vol = icon icons vol <> (pack $ show vol) <> "%"

icon :: [String] -> Integer -> Text
icon icons v | v < 33 = fromMaybe "Volume " $ getLowVolIcon icons
icon icons _ = fromMaybe "Volume " $ getHighVolIcon icons

isMuted :: Shell Bool
isMuted = (== ExitSuccess) <$> shell (pack "ponymix is-muted") empty

getVolume :: Shell Integer
getVolume = toVolumeInt <$> strict (inshell (pack "ponymix get-volume") empty)
  where toVolumeInt = read . unpack . strip