{-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_HADDOCK hide #-} module Network.Xmpp.Bind where import Data.Text as Text import Data.XML.Pickle import Data.XML.Types import Network.Xmpp.Types import Network.Xmpp.Pickle import Network.Xmpp.Monad -- Produces a `bind' element, optionally wrapping a resource. bindBody :: Maybe Text -> Element bindBody = pickleElem $ -- Pickler to produce a -- "" -- element, with a possible "[JID]" -- child. xpBind . xpOption $ xpElemNodes "resource" (xpContent xpId) -- Sends a (synchronous) IQ set request for a (`Just') given or server-generated -- resource and extract the JID from the non-error response. xmppBind :: Maybe Text -> XmppConMonad JID xmppBind rsrc = do answer <- xmppSendIQ' "bind" Nothing Set Nothing (bindBody rsrc) let Right IQResult{iqResultPayload = Just b} = answer -- TODO: Error handling let Right jid = unpickleElem jidP b return jid where -- Extracts the character data in the `jid' element. jidP :: PU [Node] JID jidP = xpBind $ xpElemNodes "jid" (xpContent xpPrim) -- A `bind' element pickler. xpBind :: PU [Node] b -> PU [Node] b xpBind c = xpElemNodes "{urn:ietf:params:xml:ns:xmpp-bind}bind" c