Archived
1
0
Fork 0

Began to write the commands' stuff, and made a working reboot.

This commit is contained in:
Julien Dessaux 2009-08-07 00:20:58 +02:00
parent 14f87adb8b
commit 7a9d187421
2 changed files with 29 additions and 3 deletions

View file

@ -38,7 +38,7 @@ data IrcOutput = Str String -- a regular string
-- | Parses an IrcInput -- | Parses an IrcInput
parseIrcMsg :: String -> IrcInput parseIrcMsg :: String -> IrcInput
parseIrcMsg _ = Err "Parsing not yet implemented" parseIrcMsg str = (Cmd "user" "channel" (str, Just "args"))
-- | Connects to a server -- | Connects to a server
connectServer :: IrcServer -> IO (IrcServer, Handle) connectServer :: IrcServer -> IO (IrcServer, Handle)

View file

@ -1,5 +1,6 @@
module Hsbot.Main module Hsbot.Main
( imain ( imain
, imain'
) where ) where
import Control.Concurrent import Control.Concurrent
@ -26,7 +27,23 @@ imain' modul' reboot bot = do
servers' <- mapM connectServer (ircServers C.config) servers' <- mapM connectServer (ircServers C.config)
putStrLn "Joining channels..." putStrLn "Joining channels..."
mapM_ initServer servers' mapM_ initServer servers'
return () putStrLn "Spawning threads..."
chan <- newChan :: IO (Chan IrcOutput)
mapM_ (forkIO . listener chan) servers'
state <- monitor chan bot
reboot modul' bot
-- | Bot main loop, monitors the threads states and handle reboot
monitor :: (Chan IrcOutput) -> Bot -> IO Bot
monitor chan bot = do
loop bot
where loop bot' = do
input <- readChan chan
case input of
Reboot ->do
putStrLn "Got reboot message, rebooting"
return bot'
Str str -> putStrLn ("received : " ++ str) >> loop bot'
-- | Thread entry point for socket listeners -- | Thread entry point for socket listeners
listener :: (Chan IrcOutput) -> (IrcServer, Handle) -> IO () listener :: (Chan IrcOutput) -> (IrcServer, Handle) -> IO ()
@ -34,5 +51,14 @@ listener chan (server, handle) = forever $ do
str <- hGetLine handle str <- hGetLine handle
writeChan chan (Str str) writeChan chan (Str str)
if ping str then pong handle str if ping str then pong handle str
else return () else eval (parseIrcMsg str)
where
eval str
| (Cmd user channel (cmd, args)) <- str = do
let cmd' = tail cmd
unless (null cmd') (parseCmds user cmd' args channel)
parseCmds user cmd args channel
| cmd == "reboot" = writeChan chan Reboot
| otherwise = do
putStrLn $"Unknown command : " ++ cmd