1 -- This file is part of htalkat
2 -- Copyright (C) 2021 Martin Bays <mbays@sdf.org>
4 -- This program is free software: you can redistribute it and/or modify
5 -- it under the terms of version 3 of the GNU General Public License as
6 -- published by the Free Software Foundation, or any later version.
8 -- You should have received a copy of the GNU General Public License
9 -- along with this program. If not, see http://www.gnu.org/licenses/.
13 module Opts
(globalHelp
, localHelp
, parseGlobal
, parseLocal
, Opt
(..)) where
15 import System
.Console
.GetOpt
17 import qualified Command
as C
32 | SpawnInteractive
FilePath
39 deriving (Eq
, Ord
, Show)
41 globalOptions
:: [OptDescr Opt
]
43 [ Option
['d
'] ["datadir"] (ReqArg DataDir
"PATH") "default: ~/.htalkat, or $HTALKAT_DIR if set"
44 , Option
['S
'] ["socks-host"] (ReqArg SocksHost
"HOST") "use SOCKS5 proxy"
45 , Option
['P
'] ["socks-port"] (ReqArg SocksPort
"PORT") "port for SOCKS5 proxy (default: 1080)"
46 , Option
['v
'] ["version"] (NoArg Version
) "show version information"
47 , Option
['h
'] ["help"] (NoArg Help
) "show usage information"
50 localOptions
:: C
.Command
-> [OptDescr Opt
]
52 Option
['h
'] ["help"] (NoArg Help
) "show usage information" :
55 [ Option
['p
'] ["port"] (ReqArg Port
"PORT") "Port to listen on (default: 5518)"
56 , Option
['H
'] ["host"] (ReqArg Host
"HOST") "Host to listen on (empty means bind all available)"
57 , Option
['b
'] ["block-unnamed"] (NoArg BlockUnnamed
) "Reject connections from unnamed users"
58 , Option
['a
'] ["accept-unnamed"] (NoArg AcceptUnnamed
) "Accept connections from unnamed users (default)"
61 [ Option
['l
'] ["list"] (NoArg ListPending
) "List unanswered incoming connections"
62 , Option
['i
'] ["interactive-client"] (ReqArg SpawnInteractive
"SOCKET_PATH") "Directly invoke interactive client"
63 ] <> interactiveClientOptions
64 C
.Connect
-> interactiveClientOptions
66 where interactiveClientOptions
=
67 [ Option
['d
'] ["dumb"] (NoArg DumbClient
) "Use dumb line-based client"
68 , Option
['c
'] ["curses"] (NoArg CursesClient
) "Use curses client (default)"
69 , Option
['t
'] ["top"] (NoArg LocalTop
) "Put you on top in curses client"
70 , Option
['b
'] ["bottom"] (NoArg LocalBottom
) "Put you on bottom in curses client (default)"
71 , Option
['L
'] ["log"] (NoArg Log
) "Log conversation"
72 , Option
['N
'] ["no-log"] (NoArg NoLog
) "Don't log conversation (default)"
75 globalHelp
:: String -> String
76 globalHelp
= (`usageInfo` globalOptions
)
78 localHelp
:: C
.Command
-> String -> String
79 localHelp c
= (`usageInfo` localOptions c
)
81 parseArgs
:: [OptDescr Opt
] -> [String] -> IO ([Opt
],[String])
83 case getOpt RequireOrder opts argv
of
84 (o
,n
,[]) -> return (o
,n
)
85 (_
,_
,errs
) -> ioError . userError $ concat errs
87 parseGlobal
:: [String] -> IO ([Opt
],[String])
88 parseGlobal
= parseArgs globalOptions
90 parseLocal
:: C
.Command
-> [String] -> IO ([Opt
],[String])
91 parseLocal
= parseArgs
. localOptions