File: Options.hs

package info (click to toggle)
haskell-ircbot 0.6.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 144 kB
  • sloc: haskell: 881; makefile: 2
file content (95 lines) | stat: -rw-r--r-- 2,479 bytes parent folder | download
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")