summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Dessaux2010-02-04 20:38:06 +0100
committerJulien Dessaux2010-02-04 20:38:06 +0100
commitd2f40f64819ec0b19911c684ea919beebf16af6d (patch)
tree18c7393fcd62d894741bdaede8f13e2bb708a437
parentReorganized code and types, changed slightly the architecture. (diff)
downloadhsbot-d2f40f64819ec0b19911c684ea919beebf16af6d.tar.gz
hsbot-d2f40f64819ec0b19911c684ea919beebf16af6d.tar.bz2
hsbot-d2f40f64819ec0b19911c684ea919beebf16af6d.zip
Finished changing plugin data structure to Maps.
-rw-r--r--Hsbot/Core.hs5
-rw-r--r--Hsbot/IRC.hs3
-rw-r--r--Hsbot/Plugin.hs25
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
+