{-# LANGUAGE OverloadedStrings, TemplateHaskell, TypeOperators #-} import Network.Protocol.XMPP (Message(..), MessageType(..), ReceivedStanza(..), parseJID, getStanza, putStanza) import qualified Data.Text as T import qualified Data.Text.IO as T import Network (PortID(..), PortNumber) import System.Environment (getArgs) import System.Exit (exitSuccess, exitFailure) import System.IO (stderr) import Control.Monad import Control.Monad.IO.Class import Data.Functor import EasyXMPP import Data.Label -- import Control.Arrow import System.Console.GetOpt data Settings = Settings { _user :: T.Text , _pass :: T.Text , _host :: String , _port :: PortNumber , _help :: Bool } $(mkLabels [''Settings]) type Flag = Settings -> Settings defaultSettings :: Settings defaultSettings = Settings { _user = "" , _pass = "" , _host = "" , _port = 5222 , _help = False } options :: [OptDescr Flag] options = [ Option "u" ["user"] (ReqArg (set user . T.pack) "USER") "Username (example: foo@jabber.org)" , Option "p" ["pass"] (ReqArg (set pass . T.pack) "PASS") "Password" , Option "h" ["host"] (ReqArg (set host) "HOST") "Hostname (example: jabber.org)" , Option "P" ["port"] (ReqArg (set port . fromInteger . read) "PORT") "Port" , Option "?" ["help"] (NoArg (set help True)) "Show this help message" ] usage :: MonadIO m => T.Text -> m b usage msg = liftIO $ T.hPutStrLn stderr msg' >> exitFailure where msg' = T.unlines [T.pack $ usageInfo "Usage: hxmppc [