1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
{-# LANGUAGE ViewPatterns, StandaloneDeriving #-}
import System.FilePath.Glob (glob)
import System.Environment (setEnv, getArgs)
import System.Process (spawnProcess, waitForProcess)
import System.Exit (exitWith, ExitCode(..))
import Data.List (isPrefixOf, dropWhile, dropWhileEnd, init)
import Data.Char (isSpace, toLower, toUpper)
import Control.Monad (forM_, void)
import qualified Libnotify as Notify
import Data.Monoid
import System.Console.GetOpt.Simple
import qualified Data.Map as Map
import Data.Maybe
import Text.Read (readMaybe)
deriving instance Read Notify.Urgency
main :: IO ()
main = do
envFiles <- glob "@home@/.dbus/session-bus/*"
forM_ envFiles $ \envFile -> do
sessionAddr <- unQuote . tail . snd . break (== '=') . head . filter ("DBUS_SESSION_BUS_ADDRESS=" `isPrefixOf`) . lines <$> readFile envFile
setEnv "DBUS_SESSION_BUS_ADDRESS" sessionAddr
lines <- lines <$> getContents
case lines of
((trim -> summary):(trim . unlines -> contents)) -> do
(opts, _) <- flip getUsingConf [] [ (arg, "urgency", Optional, "")
, (arg, "app-name", Optional, "")
, (arg, "category", Optional, "")
]
let
urgency = fromMaybe Notify.Normal $ readMaybe . caseForRead =<< Map.lookup "urgency" opts
appName = fromMaybe "notify-@user@" $ Map.lookup "app-name" opts
category = fromMaybe "" $ Map.lookup "category" opts
Notify.display_ $ Notify.summary summary <> Notify.body contents <> Notify.appName appName <> Notify.urgency urgency <> Notify.category category
_ -> exitWith $ ExitFailure 2
where
trim = dropWhileEnd isSpace . dropWhile isSpace
unQuote ('\'':xs) = init xs
unQuote ('"':xs) = init xs
unQuote xs = xs
caseForRead [] = []
caseForRead (x:xs) = toUpper x : map toLower xs
|