Archived
1
0
Fork 0

Rethought the way I handled IRC data.

This commit is contained in:
Julien Dessaux 2009-08-11 00:38:36 +02:00
parent 8caf09e50b
commit 7a86235906
2 changed files with 7 additions and 13 deletions

View file

@ -1,6 +1,5 @@
module Hsbot.IRC module Hsbot.IRC
( IrcInput(..) ( IrcLine(..)
, IrcOutput(..)
, connectServer , connectServer
, initServer , initServer
, parseIrcMsg , parseIrcMsg
@ -21,17 +20,12 @@ type Channel = String
type Command = String type Command = String
type Args = [String] type Args = [String]
-- | Information from IRC -- | An IRC line
data IrcInput = Cmd User Channel (Command, Maybe String) -- a regular command data IrcLine = Str String -- a regular string
| Line User Channel String -- a normal line of little significance
| Err String -- an error occured in parsing
deriving (Eq,Show)
-- | Data that can go over the remote channel
data IrcOutput = Str String -- a regular string
| Quit (IrcServer, Handle) -- a quit message from a server | Quit (IrcServer, Handle) -- a quit message from a server
| Join (IrcServer, Channel) -- joined a channel | Join (IrcServer, Channel) -- joined a channel
| Part (IrcServer, Channel) -- parted the channel | Part (IrcServer, Channel) -- parted the channel
| Ping (String) -- pinged by the server
| Reboot -- reboot message sent | Reboot -- reboot message sent
| Nil -- signifies thread death, only happens after reboot | Nil -- signifies thread death, only happens after reboot
deriving (Eq,Show) deriving (Eq,Show)

View file

@ -28,13 +28,13 @@ imain' modul' reboot bot = do
putStrLn "Joining channels..." putStrLn "Joining channels..."
mapM_ initServer servers' mapM_ initServer servers'
putStrLn "Spawning threads..." putStrLn "Spawning threads..."
chan <- newChan :: IO (Chan IrcOutput) chan <- newChan :: IO (Chan IrcLine)
mapM_ (forkIO . listener chan) servers' mapM_ (forkIO . listener chan) servers'
state <- monitor chan bot state <- monitor chan bot
reboot modul' bot reboot modul' bot
-- | Bot main loop, monitors the threads states and handle reboot -- | Bot main loop, monitors the threads states and handle reboot
monitor :: (Chan IrcOutput) -> Bot -> IO Bot monitor :: (Chan IrcLine) -> Bot -> IO Bot
monitor chan bot = do monitor chan bot = do
loop bot loop bot
where loop bot' = do where loop bot' = do
@ -46,7 +46,7 @@ monitor chan bot = do
Str str -> putStrLn ("received : " ++ str) >> loop 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 IrcLine) -> (IrcServer, Handle) -> IO ()
listener chan (server, handle) = forever $ do listener chan (server, handle) = forever $ do
str <- hGetLine handle str <- hGetLine handle
writeChan chan (Str str) writeChan chan (Str str)