From d2f40f64819ec0b19911c684ea919beebf16af6d Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Thu, 4 Feb 2010 20:38:06 +0100 Subject: Finished changing plugin data structure to Maps. --- Hsbot/Plugin.hs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'Hsbot/Plugin.hs') 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 + -- cgit v1.2.3