From 65646eb07fa559e072ed53b32d168ecd314cae14 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Thu, 13 Aug 2009 00:04:49 +0200 Subject: Added server states, in order to handle rebooting more cleanly (still missing saving the chan) --- Hsbot/Core.hs | 16 +++++++++++++++- Hsbot/Main.hs | 16 ++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Hsbot/Core.hs b/Hsbot/Core.hs index 5e4853f..c62ae58 100644 --- a/Hsbot/Core.hs +++ b/Hsbot/Core.hs @@ -2,8 +2,10 @@ module Hsbot.Core ( Bot(..) , Config(..) , IrcServer(..) + , isConnected , newbot , sendstr + , saveServersStates ) where import qualified Data.Map as M @@ -30,7 +32,7 @@ data IrcServer = IrcServer , password :: String -- the hsbot's password, optional , realname :: String -- the hsbot's real name, optional , administrators :: [String] -- bot admins nicknames - } deriving (Eq, Show) + } deriving (Eq, Ord, Show) -- | Returns a new, empty bot newbot :: Bot @@ -40,3 +42,15 @@ newbot = Bot (M.empty) sendstr :: Handle -> String -> IO () sendstr handle str = hPrintf handle "%s\r\n" str +-- | Are we already connected to this server? +isConnected :: Bot -> IrcServer -> Bool +isConnected (Bot bot) ircServer = ircServer `M.member` bot + +saveServerState :: Handle -> IrcServer -> Bot -> Bot +saveServerState handle ircServer x@(Bot bot) = + if ircServer `M.member` bot then x + else (Bot $ M.insert ircServer handle bot) + +saveServersStates :: [(IrcServer,Handle)] -> Bot -> Bot +saveServersStates liste bot = foldr (\(ircServer,handle) bot' -> saveServerState handle ircServer bot') bot liste + diff --git a/Hsbot/Main.hs b/Hsbot/Main.hs index 9edd807..8c4be63 100644 --- a/Hsbot/Main.hs +++ b/Hsbot/Main.hs @@ -6,6 +6,7 @@ module Hsbot.Main import Control.Concurrent import Control.Concurrent.Chan import Control.Monad +import qualified Data.Map as M import System.IO import System.Plugins @@ -22,16 +23,19 @@ imain modul' reboot = imain' modul' reboot newbot -- | Bot's main entry point imain' :: Module -> Reboot -> Bot -> IO () imain' modul' reboot bot = do - putStrLn "yeah" + -- The chan passing to reboot (or another way to keep it) is still missing putStrLn "Connecting servers..." - servers' <- mapM connectServer (ircServers C.config) + let newServers = filter (not . isConnected bot) (ircServers C.config) + newServers' <- mapM connectServer newServers putStrLn "Joining channels..." - mapM_ initServer servers' + mapM_ initServer newServers' putStrLn "Spawning threads..." + let bot' = saveServersStates newServers' bot + Bot x = bot' chan <- newChan :: IO (Chan IrcLine) - mapM_ (forkIO . listener chan) servers' - state <- monitor chan bot - reboot modul' bot + mapM_ (forkIO . listener chan) (M.toList x) + bot'' <- monitor chan bot' + reboot modul' bot'' -- | Bot main loop, monitors the threads states and handle reboot monitor :: (Chan IrcLine) -> Bot -> IO Bot -- cgit v1.2.3