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 84 85 86 87 88 89 90 91 92 93 94 95
|
{-# LANGUAGE OverloadedStrings #-}
module Network.IRC.Bot.Options
( execBotOptsParser
, parseBotConf
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8
import qualified Data.Set
import Options.Applicative
import Data.Semigroup ((<>))
import Network.IRC.Bot.Core (BotConf(..), User(..))
import Network.IRC.Bot.Log (Logger, LogLevel(..), stdoutLogger)
execBotOptsParser :: Parser extra -> IO (BotConf, extra)
execBotOptsParser parseExtra = execParser
$ info (((,) <$> parseBotConf <*> parseExtra) <**> helper)
( fullDesc
<> progDesc "ircbot"
<> header "ircbot - Haskell IRC bot" )
parseBotConf :: Parser BotConf
parseBotConf = BotConf
<$> pure Nothing
<*> parseLogger
<*> strOption
(long "server"
<> short 's'
<> metavar "HOST_OR_IP"
<> value "localhost"
<> help "IRC server to connect to")
<*> option auto
(long "port"
<> short 'p'
<> metavar "PORT"
<> value 6667
<> help "Port of the IRC server to use")
<*> strOption
(long "nick"
<> short 'n'
<> help "IRC nick")
<*> strOption
(long "cmd-prefix"
<> short 'c'
<> value "#"
<> help "Bot command prefix")
<*> parseUser
<*> (Data.Set.fromList . map coercePrefixes <$>
some (argument str
(metavar "CHANNEL [CHANNEL]"
<> help "IRC channels to join to, channel prefix # not required")
))
<*> parseLimits
-- | Prefix channel name with '#' if needed
coercePrefixes :: ByteString -> ByteString
coercePrefixes x | "#" `Data.ByteString.Char8.isPrefixOf` x = x
coercePrefixes x | otherwise = Data.ByteString.Char8.cons '#' x
parseLogger :: Parser Logger
parseLogger = stdoutLogger
<$> flag Normal Debug
(long "debug"
<> short 'd'
<> help "Enable debug output")
parseUser :: Parser User
parseUser = User
<$> strOption
(long "username"
<> help "Ident username")
<*> strOption
(long "hostname"
<> help "Hostname of the client system")
<*> pure "."
<*> strOption
(long "realname"
<> help "Clients real name")
parseLimits :: Parser (Maybe (Int, Int))
parseLimits = optional $ (,)
<$> option auto
(long "burst-length"
<> metavar "BURST"
<> value 2
<> help "Rate limit after a BURST limit of messages is reached")
<*> option auto
(long "delay-ms"
<> metavar "MS"
<> value 2
<> help "Delay in microseconds for rate limiting")
|