module LMain where
import Shared
import Lambdabot
import Message
import IRCBase
import Lambdabot.Util( listToMaybeAll )
import qualified Data.Map as M
import System.Environment
import Data.Maybe
import Control.Monad.State (get, liftIO)
data Args = Args { initcmds :: [String] }
main' :: Maybe DynLoad -> (LB (), [String]) -> IO ()
main' dyn (loadStaticModules, pl) = do
x <- getArgs
let a = parseArgs x
case a of
Just args -> runIrc (fromMaybe ["offline"] $ listToMaybeAll $ initcmds args) loadStaticModules ld pl
_ -> putStrLn "Usage: lambdabot [-e 'cmd']*"
where ld = fromMaybe (error "no dynamic loading") dyn
parseArgs ("-e":cmd:x) = parseArgs x >>$ \a -> a { initcmds = cmd : initcmds a }
parseArgs [] = Just $ Args { initcmds = [] }
parseArgs _ = Nothing
(>>$) = flip fmap
------------------------------------------------------------------------
received :: IrcMessage -> LB ()
received msg = do s <- get
case M.lookup (command msg) (ircCallbacks s) of
Just cbs -> allCallbacks (map snd cbs) msg
_ -> return ()
-- If an error reaches allCallbacks, then all we can sensibly do is
-- write it on standard out. Hopefully BaseModule will have caught it already
-- if it can see a better place to send it
allCallbacks :: Message a => [a -> LB ()] -> a -> LB ()
allCallbacks [] _ = return ()
allCallbacks (f:fs) msg = do
handleIrc (liftIO . putStrLn . ("Main: caught (and ignoring) "++). show) (f msg)
allCallbacks fs msg
------------------------------------------------------------------------