66 lines
2.1 KiB
Haskell
66 lines
2.1 KiB
Haskell
module Hsbot.IRCPlugin
|
|
( IrcPlugin
|
|
, PluginState(..)
|
|
, answerMsg
|
|
, readMsg
|
|
, sendCommand
|
|
, sendCommandWithRequest
|
|
, sendRegisterCommand
|
|
, sendUnregisterCommand
|
|
, writeMsg
|
|
) where
|
|
|
|
import Control.Concurrent.Chan
|
|
import Control.Monad.State
|
|
import Data.Maybe(fromMaybe)
|
|
|
|
import Hsbot.Types
|
|
|
|
-- | The IrcPlugin monad
|
|
type IrcPlugin a = StateT PluginState IO a
|
|
|
|
-- | An IRCPlugin state
|
|
data PluginState = PluginState
|
|
{ instanceName :: String -- The plugin's name
|
|
, instanceServerChan :: Chan BotMsg -- The server channel
|
|
, instanceChan :: Chan BotMsg -- The plugin channel
|
|
}
|
|
|
|
-- | Basic input output for IrcPlugins
|
|
readMsg :: IrcPlugin (BotMsg)
|
|
readMsg = do
|
|
chan <- gets instanceChan
|
|
input <- liftIO $ readChan chan
|
|
return input
|
|
|
|
writeMsg :: BotMsg -> IrcPlugin ()
|
|
writeMsg botMsg = do
|
|
serverChan <- gets instanceServerChan
|
|
liftIO . writeChan serverChan $ botMsg
|
|
|
|
answerMsg :: IrcMsg -> String -> IrcPlugin ()
|
|
answerMsg request msg = do
|
|
let chanOrigin = head $ parameters request
|
|
sender = takeWhile (/= '!') $ fromMaybe "" (prefix request)
|
|
case head chanOrigin of
|
|
'#' -> writeMsg . OutputMsg $ IrcMsg Nothing "PRIVMSG" [chanOrigin, msg]
|
|
_ -> writeMsg . OutputMsg $ IrcMsg Nothing "PRIVMSG" [sender, msg]
|
|
|
|
-- | Commands 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
|
|
serverChan <- gets instanceServerChan
|
|
from <- gets instanceName
|
|
liftIO . writeChan serverChan . InternalCmd $ IntCmd cmd from to params originalRequest
|
|
|
|
sendRegisterCommand :: String -> IrcPlugin ()
|
|
sendRegisterCommand cmd = sendCommand "REGISTER" "CORE" cmd
|
|
|
|
sendUnregisterCommand :: String -> IrcPlugin ()
|
|
sendUnregisterCommand cmd = sendCommand "UNREGISTER" "CORE" cmd
|
|
|
|
-- | a isAdmin helper : I need an admin plugin (to track admins' status around chans)
|
|
|