module Router where
import Prelude ()
import BasicPrelude
import Control.Error (ExceptT (..))
import qualified Network.Protocol.XMPP as XMPP
import Util
runRoutedComponent ::
XMPP.Server
-> Text
-> XMPP.XMPP Routes
-> ExceptT XMPP.Error IO ()
runRoutedComponent server secret =
ExceptT . XMPP.runComponent server secret . (runRouted =<<)
runRouted :: Routes -> XMPP.XMPP ()
runRouted routes = forever $ XMPP.getStanza >>= (void . forkXMPP . handle)
where
handle (XMPP.ReceivedIQ iq@XMPP.IQ { XMPP.iqType = XMPP.IQGet }) =
iqGetRoute routes iq
handle (XMPP.ReceivedIQ iq@XMPP.IQ { XMPP.iqType = XMPP.IQSet }) =
iqSetRoute routes iq
handle (XMPP.ReceivedIQ iq@XMPP.IQ { XMPP.iqType = XMPP.IQResult }) =
iqResultRoute routes iq
handle (XMPP.ReceivedIQ iq@XMPP.IQ { XMPP.iqType = XMPP.IQError }) =
iqErrorRoute routes iq
handle (XMPP.ReceivedMessage message@XMPP.Message {
XMPP.messageType = XMPP.MessageNormal
}) = messageNormalRoute routes message
handle (XMPP.ReceivedMessage message@XMPP.Message {
XMPP.messageType = XMPP.MessageChat
}) = messageChatRoute routes message
handle (XMPP.ReceivedMessage message@XMPP.Message {
XMPP.messageType = XMPP.MessageHeadline
}) = messageHeadlineRoute routes message
handle (XMPP.ReceivedMessage message@XMPP.Message {
XMPP.messageType = XMPP.MessageError
}) = messageErrorRoute routes message
handle _ = return ()
data Routes = Routes {
iqGetRoute :: XMPP.IQ -> XMPP.XMPP (),
iqSetRoute :: XMPP.IQ -> XMPP.XMPP (),
iqResultRoute :: XMPP.IQ -> XMPP.XMPP (),
iqErrorRoute :: XMPP.IQ -> XMPP.XMPP (),
messageNormalRoute :: XMPP.Message -> XMPP.XMPP (),
messageChatRoute :: XMPP.Message -> XMPP.XMPP (),
messageHeadlineRoute :: XMPP.Message -> XMPP.XMPP (),
messageErrorRoute :: XMPP.Message -> XMPP.XMPP ()
}
defaultRoutes :: Routes
defaultRoutes = Routes {
iqGetRoute = XMPP.putStanza . iqError notImplemented,
iqSetRoute = XMPP.putStanza . iqError notImplemented,
iqResultRoute = const $ return (),
iqErrorRoute = const $ return (),
messageNormalRoute = const $ return (),
messageChatRoute = const $ return (),
messageHeadlineRoute = const $ return (),
messageErrorRoute = const $ return ()
}