summaryrefslogtreecommitdiff
path: root/Hsbot/Command.hs
diff options
context:
space:
mode:
authorJulien Dessaux2010-02-04 20:40:16 +0100
committerJulien Dessaux2010-02-04 20:40:16 +0100
commitcf68de02be3e9695c95b0d1fafdab5ab2c0fc5f7 (patch)
tree977286771d0f9e126ae599af01a63e06b3c67d2d /Hsbot/Command.hs
parentFinished changing plugin data structure to Maps. (diff)
downloadhsbot-cf68de02be3e9695c95b0d1fafdab5ab2c0fc5f7.tar.gz
hsbot-cf68de02be3e9695c95b0d1fafdab5ab2c0fc5f7.tar.bz2
hsbot-cf68de02be3e9695c95b0d1fafdab5ab2c0fc5f7.zip
Added command registering and dispatching for plugins.
Diffstat (limited to 'Hsbot/Command.hs')
-rw-r--r--Hsbot/Command.hs52
1 files changed, 52 insertions, 0 deletions
diff --git a/Hsbot/Command.hs b/Hsbot/Command.hs
new file mode 100644
index 0000000..20e5525
--- /dev/null
+++ b/Hsbot/Command.hs
@@ -0,0 +1,52 @@
+module Hsbot.Command
+ ( dispatchCommand
+ , registerCommand
+ ) where
+
+import Control.Monad.State
+import qualified Data.Map as M
+import Data.Maybe
+
+import Config
+import Hsbot.Plugin
+import Hsbot.Types
+import Hsbot.Utils
+
+-- TODO : unregister command
+
+dispatchCommand :: BotMsg -> IrcBot ()
+dispatchCommand (InputMsg inputMsg) = do
+ plugins <- gets botPlugins
+ cmds <- gets botCommands
+ if command inputMsg == "PRIVMSG"
+ then -- The first word matters as the command
+ let msg = (parameters inputMsg) !! 1
+ pfx = commandPrefix config
+ in if (head msg) == pfx
+ then
+ let key = tail msg -- all but the cmd prefix
+ pluginNames = fromMaybe [] $ M.lookup key cmds
+ plugins' = fromMaybe [] $ mapM (flip M.lookup plugins) pluginNames
+ in mapM_ (sendToPlugin (InputMsg inputMsg)) plugins'
+ else
+ mapM_ (sendToPlugin (InputMsg inputMsg)) (M.elems plugins)
+ else
+ return ()
+dispatchCommand _ = return ()
+
+registerCommand :: String -> String -> IrcBot ()
+registerCommand cmd pluginName' = do
+ bot <- get
+ cmds <- gets botCommands
+ exists <- pluginExists pluginName'
+ if exists
+ then
+ let cmds' = if cmd `M.member` cmds
+ then cmds
+ else M.singleton cmd []
+ newCmds = M.adjust (++ [pluginName']) cmd cmds'
+ in put $ bot { botCommands = newCmds }
+ else
+ traceM $ inColor ("Couldn't register command \"" ++ cmd ++ "\" for plugin \""
+ ++ pluginName' ++ "\" : plugin does not exists") [31]
+