From d97177ce3b392f80e36a93ca41ca1426b0220733 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Thu, 10 Jun 2010 23:30:09 +0200 Subject: Wrote most of the resume code for the core and the irc plugin. --- Hsbot/Irc/Core.hs | 33 +++++++++++++++++++++------------ Hsbot/Irc/Types.hs | 4 +--- 2 files changed, 22 insertions(+), 15 deletions(-) (limited to 'Hsbot/Irc') diff --git a/Hsbot/Irc/Core.hs b/Hsbot/Irc/Core.hs index 51032a8..d65e975 100644 --- a/Hsbot/Irc/Core.hs +++ b/Hsbot/Irc/Core.hs @@ -7,11 +7,11 @@ import Control.Exception (AsyncException, Handler (..), IOException, catch, catc import Control.Monad.State import qualified Data.Map as M import Data.Maybe (fromMaybe) -import Data.Time import Network import Prelude hiding (catch) import System.IO -import System.Posix.IO (handleToFd) +import System.Posix.IO (fdToHandle, handleToFd) +import System.Posix.Types (Fd) import Hsbot.Irc.Command import Hsbot.Irc.Config @@ -22,14 +22,24 @@ import Hsbot.Irc.Types import Hsbot.Types -- | IrcBot's main entry point -startIrcbot :: IrcConfig -> Chan BotMsg -> Chan BotMsg -> IO () -startIrcbot config masterChan myChan = do - startTime <- getCurrentTime +startIrcbot :: IrcConfig -> Chan BotMsg -> Chan BotMsg -> Maybe String -> IO () +startIrcbot config masterChan myChan txtResumeData = do + let resumeData = case txtResumeData of + Just txtData -> read txtData :: ResumeData -- TODO : catch exception + Nothing -> M.empty :: ResumeData + print resumeData putStrLn "[IrcBot] Opening communication channel... " chan <- newChan :: IO (Chan IrcBotMsg) - putStrLn $ concat ["[IrcBot] Connecting to ", ircConfigAddress config, "... "] - handle <- connectTo (ircConfigAddress config) (ircConfigPort config) - hSetBuffering handle NoBuffering + handle <- case M.lookup "HANDLE" resumeData of + Just txtFd -> do + let fd = read txtFd :: Fd + fdToHandle fd + Nothing -> do + putStrLn $ concat ["[IrcBot] Connecting to ", ircConfigAddress config, "... "] + handle <- connectTo (ircConfigAddress config) (ircConfigPort config) + hSetBuffering handle NoBuffering + hSetEncoding handle utf8 + return handle fd <- handleToFd handle putStrLn "[IrcBot] Spawning reader threads..." myOwnThreadId <- myThreadId @@ -41,8 +51,7 @@ startIrcbot config masterChan myChan = do , ircServerNickname = ircConfigNickname config , ircServerCommandPrefix = ircConfigCommandPrefix config , ircServerChan = chan } - ircBotState = IrcBotState { ircBotStartTime = startTime - , ircBotPlugins = M.empty + ircBotState = IrcBotState { ircBotPlugins = M.empty , ircBotCommands = M.empty , ircBotChan = chan , ircBotMasterChan = masterChan @@ -60,8 +69,8 @@ startIrcbot config masterChan myChan = do killThread readerThreadId killThread masterReaderThreadId putStrLn "[IrcBot] Killing active plugins... " - let resumeData = ircBotResumeData ircBotState''' - ircPlugins = read (fromMaybe [] (M.lookup "PLUGINS" resumeData)) :: [String] + let resumeData' = ircBotResumeData ircBotState''' + ircPlugins = read (fromMaybe [] (M.lookup "PLUGINS" resumeData')) :: [String] evalStateT (mapM_ killIrcPlugin ircPlugins) ircBotState''' return () diff --git a/Hsbot/Irc/Types.hs b/Hsbot/Irc/Types.hs index 4b75085..63411df 100644 --- a/Hsbot/Irc/Types.hs +++ b/Hsbot/Irc/Types.hs @@ -9,7 +9,6 @@ module Hsbot.Irc.Types import Control.Concurrent import Control.Monad.State import qualified Data.Map as M -import Data.Time import System.IO import Hsbot.Irc.Config @@ -22,8 +21,7 @@ type IrcBot = StateT IrcBotState IO -- | An Ircbot state data IrcBotState = IrcBotState - { ircBotStartTime :: UTCTime -- the bot's uptime - , ircBotPlugins :: M.Map String (IrcPluginState, MVar (), ThreadId) -- Loaded plugins + { ircBotPlugins :: M.Map String (IrcPluginState, MVar (), ThreadId) -- Loaded plugins , ircBotCommands :: M.Map String [String] -- Loaded plugins , ircBotChan :: Chan IrcBotMsg -- The IrcBot's communication channel , ircBotMasterChan :: Chan BotMsg -- The Hsbot communication channel -- cgit v1.2.3