summaryrefslogtreecommitdiff
path: root/Hsbot/Irc/Plugin
diff options
context:
space:
mode:
authorJulien Dessaux2010-05-18 00:46:36 +0200
committerJulien Dessaux2010-05-18 00:46:36 +0200
commit5b8cffbf6809b378aab9c6e1f7601112d810b709 (patch)
treef48748168b7a56f4235c50f8f8bfa928d61ccdea /Hsbot/Irc/Plugin
parentRemoved thread ids from plugins data structure. (diff)
downloadhsbot-5b8cffbf6809b378aab9c6e1f7601112d810b709.tar.gz
hsbot-5b8cffbf6809b378aab9c6e1f7601112d810b709.tar.bz2
hsbot-5b8cffbf6809b378aab9c6e1f7601112d810b709.zip
Cleaned the definition of irc plugins' data structure.
Diffstat (limited to 'Hsbot/Irc/Plugin')
-rw-r--r--Hsbot/Irc/Plugin/Core.hs2
-rw-r--r--Hsbot/Irc/Plugin/Dummy.hs2
-rw-r--r--Hsbot/Irc/Plugin/Ping.hs2
-rw-r--r--Hsbot/Irc/Plugin/Quote.hs2
-rw-r--r--Hsbot/Irc/Plugin/Utils.hs66
5 files changed, 70 insertions, 4 deletions
diff --git a/Hsbot/Irc/Plugin/Core.hs b/Hsbot/Irc/Plugin/Core.hs
index 9987a89..0297e2c 100644
--- a/Hsbot/Irc/Plugin/Core.hs
+++ b/Hsbot/Irc/Plugin/Core.hs
@@ -8,7 +8,7 @@ import Control.Monad.State
import Prelude hiding (catch)
import Hsbot.Irc.Message
-import Hsbot.Irc.PluginCommons
+import Hsbot.Irc.Plugin.Utils
-- | The plugin's main entry point
ircBotPluginCore :: Chan IrcBotMsg -> Chan IrcBotMsg -> IO ()
diff --git a/Hsbot/Irc/Plugin/Dummy.hs b/Hsbot/Irc/Plugin/Dummy.hs
index c543b90..4e10644 100644
--- a/Hsbot/Irc/Plugin/Dummy.hs
+++ b/Hsbot/Irc/Plugin/Dummy.hs
@@ -8,7 +8,7 @@ import Control.Monad.State
import Prelude hiding (catch)
import Hsbot.Irc.Message
-import Hsbot.Irc.PluginCommons
+import Hsbot.Irc.Plugin.Utils
-- | The plugin's main entry point
ircBotPluginDummy :: Chan IrcBotMsg -> Chan IrcBotMsg -> IO ()
diff --git a/Hsbot/Irc/Plugin/Ping.hs b/Hsbot/Irc/Plugin/Ping.hs
index 90579c4..57418b3 100644
--- a/Hsbot/Irc/Plugin/Ping.hs
+++ b/Hsbot/Irc/Plugin/Ping.hs
@@ -8,7 +8,7 @@ import Control.Monad.State
import Prelude hiding (catch)
import Hsbot.Irc.Message
-import Hsbot.Irc.PluginCommons
+import Hsbot.Irc.Plugin.Utils
-- | The plugin's main entry point
ircBotPluginPing :: Chan IrcBotMsg -> Chan IrcBotMsg -> IO ()
diff --git a/Hsbot/Irc/Plugin/Quote.hs b/Hsbot/Irc/Plugin/Quote.hs
index 31eaeaf..0335d8b 100644
--- a/Hsbot/Irc/Plugin/Quote.hs
+++ b/Hsbot/Irc/Plugin/Quote.hs
@@ -18,7 +18,7 @@ import System.Posix.Files
import System.Random(randomRIO)
import Hsbot.Irc.Message
-import Hsbot.Irc.PluginCommons
+import Hsbot.Irc.Plugin.Utils
-- | A quote element
data QuoteElt = QuoteElt
diff --git a/Hsbot/Irc/Plugin/Utils.hs b/Hsbot/Irc/Plugin/Utils.hs
new file mode 100644
index 0000000..1e54d3a
--- /dev/null
+++ b/Hsbot/Irc/Plugin/Utils.hs
@@ -0,0 +1,66 @@
+module Hsbot.Irc.Plugin.Utils
+ ( IrcPlugin
+ , IrcPluginState (..)
+ , answerMsg
+ , readMsg
+ , sendCommand
+ , sendCommandWithRequest
+ , sendRegisterCommand
+ , sendUnregisterCommand
+ , writeMsg
+ ) where
+
+import Control.Concurrent
+import Control.Concurrent.Chan ()
+import Control.Monad.State
+import Data.Maybe (fromMaybe)
+
+import Hsbot.Irc.Message
+
+-- | The IrcPlugin monad
+type IrcPlugin = StateT IrcPluginState IO
+
+-- | A plugin state
+data IrcPluginState = IrcPluginState
+ { ircPluginName :: String -- The plugin's name
+ , ircPluginChan :: Chan IrcBotMsg -- The plugin chan
+ , ircPluginMasterChan :: Chan IrcBotMsg -- The master's chan
+ }
+
+--- | Basic input output for IrcPlugins
+readMsg :: IrcPlugin (IrcBotMsg)
+readMsg = do
+ chan <- gets ircPluginChan
+ input <- liftIO $ readChan chan
+ return input
+
+writeMsg :: IrcBotMsg -> IrcPlugin ()
+writeMsg (OutIrcMsg msg) = do
+ chan <- gets ircPluginMasterChan
+ liftIO $ writeChan chan (OutIrcMsg msg)
+writeMsg _ = return ()
+
+answerMsg :: IrcMsg -> String -> IrcPlugin ()
+answerMsg request msg = do
+ let chanOrigin = head $ ircMsgParameters request
+ sender = takeWhile (/= '!') $ fromMaybe "" (ircMsgPrefix request)
+ case head chanOrigin of
+ '#' -> writeMsg . OutIrcMsg $ IrcMsg Nothing "PRIVMSG" [chanOrigin, msg]
+ _ -> writeMsg . OutIrcMsg $ IrcMsg Nothing "PRIVMSG" [sender, msg]
+
+-- | Command management
+sendCommand :: String -> String -> String -> IrcPlugin ()
+sendCommand cmd to params = sendCommandWithRequest cmd to params emptyIrcMsg
+
+sendCommandWithRequest :: String -> String -> String -> IrcMsg -> IrcPlugin ()
+sendCommandWithRequest cmd to params originalRequest = do
+ masterChan <- gets ircPluginMasterChan
+ from <- gets ircPluginName
+ liftIO . writeChan masterChan . IntIrcCmd $ IrcCmd cmd from to params originalRequest
+
+sendRegisterCommand :: String -> IrcPlugin ()
+sendRegisterCommand cmd = sendCommand "REGISTER" "CORE" cmd
+
+sendUnregisterCommand :: String -> IrcPlugin ()
+sendUnregisterCommand cmd = sendCommand "UNREGISTER" "CORE" cmd
+