summaryrefslogtreecommitdiff
path: root/Hsbot/Plugin/Ping.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Hsbot/Plugin/Ping.hs')
-rw-r--r--Hsbot/Plugin/Ping.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/Hsbot/Plugin/Ping.hs b/Hsbot/Plugin/Ping.hs
new file mode 100644
index 0000000..b020359
--- /dev/null
+++ b/Hsbot/Plugin/Ping.hs
@@ -0,0 +1,38 @@
+module Hsbot.Plugin.Ping
+ ( pingId
+ , ping
+ ) where
+
+import Control.Concurrent.Chan ()
+import Control.Exception
+import Control.Monad.State (execStateT, forever)
+import qualified Network.IRC as IRC
+import Prelude hiding (catch)
+
+import Hsbot.Message
+import Hsbot.Types
+import Hsbot.Utils
+
+pingId :: PluginId
+pingId = PluginId
+ { pluginName = "ping"
+ , pluginEp = ping }
+
+-- | The plugin's main entry point
+ping :: PluginState -> IO ()
+ping state = do
+ _ <- (execStateT run state) `catch` (\(_ :: AsyncException) -> return state)
+ return ()
+
+-- | The IrcPlugin monad main function
+run :: Plugin IO ()
+run = forever $ do
+ msg <- readMsg
+ eval msg
+ where
+ eval :: Message -> Plugin IO ()
+ eval (IncomingMsg msg)
+ | (IRC.msg_command msg) == "PING" = writeMsg . OutgoingMsg . IRC.Message Nothing "PONG" $ IRC.msg_params msg
+ | otherwise = return ()
+ eval _ = return ()
+