summaryrefslogtreecommitdiff
path: root/HsbotIrcBot/Main.hs
blob: 070b7b64bc2fa4030d962d2595de8cbdbc7fefc0 (plain)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module Main (main) where

import Control.Monad (when)
import Prelude hiding (catch)
import System.Console.GetOpt
import System.Environment
import System.Exit
import System.IO

import Hsbot.Irc.Config

-- | Main function
main :: IO ()
main = do
    args <- getArgs
    -- Parse options, getting a list of option actions
    let (actions, nonOptions, errors) = getOpt RequireOrder options args
    -- Here we thread startOptions through all supplied option actions
    opts <- case (nonOptions, errors) of
        ([], []) -> foldl (>>=) (return defaultOptions) actions
        (_, _) -> do
            hPutStrLn stderr $ concat errors ++ usageInfo header options
            exitWith $ ExitFailure 1
    -- From there the initialization code truly begins
    when (optDebug opts) . putStrLn $ "Got options : " ++ (show opts)
    -- We find and parse the config file
    ircConfig <- getIrcConfig $ optConfigFile opts
    print $ ircConfigChannels ircConfig
    print $ ircConfigPlugins ircConfig

-- CLI argument parting stuff {{{
-- | CLI options
data Options = Options
    { optDebug      :: Bool
    , optConfigFile :: Maybe String
    , optGroup      :: Maybe String
    , optUser       :: Maybe String
    , optVerbose    :: Bool
    } deriving (Show)

-- | CLI default options
defaultOptions :: Options
defaultOptions = Options { optDebug      = False
                         , optConfigFile = Nothing
                         , optGroup      = Nothing
                         , optUser       = Nothing
                         , optVerbose    = False }

-- | CLI options logic
options :: [ OptDescr (Options -> IO Options) ]
options =
    [ Option "d" ["debug"]
        (NoArg (\opt -> return opt { optDebug = True, optVerbose = True }))
        "Enter verbose debug mode and prevents Hsbot from forking in background"
    , Option "f" ["file"]
        (ReqArg (\arg opt -> return opt { optConfigFile = return arg }) "<config_file>")
        "The config file to use"
    , Option "g" ["group"]
        (ReqArg (\arg opt -> return opt { optGroup = return arg }) "<group>")
        "The group hsbot will run as"
    , Option "h" ["help"]
        (NoArg (\_ -> do
                    putStrLn $ usageInfo header options
                    exitWith ExitSuccess))
        "Print this help message"
    , Option "u" ["user"]
        (ReqArg (\arg opt -> return opt { optUser = return arg }) "<user>")
        "The user hsbot will run as"
    , Option "v" ["verbose"]
        (NoArg (\opt -> return opt { optVerbose = True }))
        "Enable verbose messages"
    , Option "V" ["version"]
        (NoArg (\_ -> do
                    putStrLn "hsbot-irc version 0.3"
                    exitWith ExitSuccess))
        "Show version"
    ]

-- | Usage header
header :: String
header = "Usage: hsbot-irc [-dhvV] [-f config_file] [-u user] [-g group]"
-- }}}