Archived
1
0
Fork 0

Finished changing plugin data structure to Maps.

This commit is contained in:
Julien Dessaux 2010-02-04 20:38:06 +01:00
parent 884c6c9f2e
commit d2f40f6481
3 changed files with 24 additions and 9 deletions

View file

@ -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 ()

View file

@ -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 ->

View file

@ -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