diff options
-rw-r--r-- | Hsbot/Core.hs | 5 | ||||
-rw-r--r-- | Hsbot/IRC.hs | 3 | ||||
-rw-r--r-- | Hsbot/Plugin.hs | 25 |
3 files changed, 24 insertions, 9 deletions
diff --git a/Hsbot/Core.hs b/Hsbot/Core.hs index b0efc03..621e670 100644 --- a/Hsbot/Core.hs +++ b/Hsbot/Core.hs @@ -7,6 +7,7 @@ import Control.Concurrent import Control.Concurrent.Chan import Control.Monad.State import Data.List +import qualified Data.Map as M import Network import System.IO import System.Time (getClockTime) @@ -28,13 +29,13 @@ connectServer server = do chan <- newChan :: IO (Chan BotMsg) threadId <- forkIO $ botReader handle chan putStrLn "done." - return (Bot server starttime handle [] [] chan threadId) + return (Bot server starttime handle [] M.empty chan threadId M.empty) -- | Disconnect from the server disconnectServer :: Bot -> IO () -- IO Bot ? disconnectServer bot = do killThread $ readerThreadId bot - mapM_ (killThread . pluginThreadId) (botPlugins bot) + mapM_ (killThread . pluginThreadId . snd) (M.toList $ botPlugins bot) hClose $ botHandle bot return () diff --git a/Hsbot/IRC.hs b/Hsbot/IRC.hs index 3fe2181..a8f3fcb 100644 --- a/Hsbot/IRC.hs +++ b/Hsbot/IRC.hs @@ -5,6 +5,7 @@ module Hsbot.IRC import Control.Concurrent.Chan import Control.Monad.State +import qualified Data.Map as M import Hsbot.IRCParser import Hsbot.Plugin @@ -30,7 +31,7 @@ runServer = do msg <- liftIO input case msg of InputMsg inputMsg -> - mapM_ (sendToPlugin $ InputMsg inputMsg) plugins + mapM_ (sendToPlugin (InputMsg inputMsg) . snd) (M.toList plugins) OutputMsg outputMsg -> sendstr (serializeIrcMsg outputMsg) InternalCmd internalCmd -> diff --git a/Hsbot/Plugin.hs b/Hsbot/Plugin.hs index 662f8e9..2121c7d 100644 --- a/Hsbot/Plugin.hs +++ b/Hsbot/Plugin.hs @@ -1,27 +1,34 @@ module Hsbot.Plugin ( loadPlugin + , pluginExists , sendToPlugin ) where import Control.Concurrent import Control.Concurrent.Chan import Control.Monad.State +import qualified Data.Map as M import System.IO import System.Plugins import Hsbot.Types import Hsbot.Utils +-- TODO : unload plugin, reload plugin, list plugins, etc + -- | Loads a plugin into an ircBot loadPlugin :: String -> IrcBot () loadPlugin name = do bot <- get - plugin <- liftIO $ effectivelyLoadPlugin name (botChannel bot) - case plugin of - Just plugin' -> do - let oldPlugins = botPlugins bot - put $ bot { botPlugins = plugin' : oldPlugins } -- TODO : clean with a correct append - Nothing -> return () + let oldPlugins = botPlugins bot + if name `M.member` oldPlugins + then traceM $ inColor ("Can't load plugin \"" ++ name ++ "\", this identifier has already been registered.") [31] + else do + plugin <- liftIO $ effectivelyLoadPlugin name (botChannel bot) + case plugin of + Just plugin' -> do + put $ bot { botPlugins = M.insert name plugin' oldPlugins} + Nothing -> return () -- | Effectively try to load a plugin effectivelyLoadPlugin :: String -> Chan BotMsg -> IO (Maybe Plugin) @@ -54,3 +61,9 @@ sendToPlugin msg plugin = do let chan = pluginChannel plugin liftIO $ writeChan chan msg +-- | Tells if a plugin is loaded or not +pluginExists :: String -> IrcBot Bool +pluginExists name = do + plugins <- gets botPlugins + return $ name `M.member` plugins + |