import Network.GrowlNotify import System (getArgs) import System.Console.GetOpt import Data.Maybe ( fromMaybe ) main = do args <- getArgs (opts, message) <- growlOpts args let Options { optSticky = sticky , optName = name , optNotification = notification , optTitle = title , optServer = server , optPassword = password } = opts let b = registrationPacket name [notification] let m = addMD5Sum password b let b2 = notificationPacket sticky name notification title (unwords message) let m2 = addMD5Sum password b2 sendMessage server m sendMessage server m2 data Options = Options { optSticky :: Bool , optNotification :: String , optName :: String , optTitle :: String , optServer :: String , optPassword :: String } startOptions :: Options startOptions = Options { optSticky = False , optNotification = "Cmdline Growl Notification" , optName = "growlnotify" , optTitle = "Network Notification" , optServer = "127.0.0.1" , optPassword = "" } options :: [OptDescr (Options -> IO Options)] options = [ Option ['k'] ["sticky"] (NoArg (\opt -> return opt {optSticky=True}) ) "sticky message" , Option ['n'] ["programname"] (ReqArg (\arg opt -> return opt {optName=arg}) "NAME") "program registration NAME" , Option ['s'] ["server"] (ReqArg (\arg opt -> return opt {optServer=arg}) "SERVER") "growl SERVER" , Option ['p'] ["password"] (ReqArg (\arg opt -> return opt {optPassword=arg}) "PASSWORD") "growl PASSWORD" , Option ['N'] ["notification"] (ReqArg (\arg opt -> return opt {optNotification=arg}) "NOTIFICATION") "NOTIFICATION" , Option ['t'] ["title"] (ReqArg (\arg opt -> return opt {optTitle=arg}) "TITLE") "message TITLE" ] growlOpts :: [String] -> IO (Options, [String]) growlOpts argv = do -- Parse options, getting a list of option actions let (actions, nonOptions, errors) = getOpt RequireOrder options argv -- Here we thread startOptions through all supplied option actions opts <- foldl (>>=) (return startOptions) actions return (opts, nonOptions)