summaryrefslogtreecommitdiff
path: root/Hsbot/Irc/PluginCommons.hs
blob: 71f00a4e4416f4ada671ca690184f0b770ab35cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
module Hsbot.Irc.PluginCommons
    ( 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
    , ircPluginThreadId   :: ThreadId       -- The plugin thread
    , 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