You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.2 KiB
122 lines
4.2 KiB
|
14 years ago
|
{-# LANGUAGE OverloadedStrings #-}
|
||
|
14 years ago
|
module Network.XMPP.IM.Message
|
||
|
14 years ago
|
where
|
||
|
14 years ago
|
|
||
|
14 years ago
|
import Control.Applicative ((<$>))
|
||
|
|
|
||
|
|
import Data.Maybe (maybeToList)
|
||
|
14 years ago
|
import Data.Text (Text)
|
||
|
14 years ago
|
import Data.XML.Pickle
|
||
|
14 years ago
|
import Data.XML.Types
|
||
|
|
|
||
|
|
import Network.XMPP.Types
|
||
|
14 years ago
|
import Network.XMPP.Pickle
|
||
|
|
|
||
|
|
data MessageBody = MessageBody (Maybe LangTag) Text
|
||
|
|
data MessageThread = MessageThread
|
||
|
|
Text -- ^ Thread ID
|
||
|
|
(Maybe Text) -- ^ Parent Thread
|
||
|
|
data MessageSubject = MessageSubject (Maybe LangTag) Text
|
||
|
|
|
||
|
14 years ago
|
xpMessageSubject :: PU [Element] MessageSubject
|
||
|
|
xpMessageSubject = xpElems .
|
||
|
|
xpWrap (\(l, s) -> MessageSubject l s)
|
||
|
14 years ago
|
(\(MessageSubject l s) -> (l,s))
|
||
|
|
$ xpElem "{jabber:client}subject" xpLangTag $ xpContent xpId
|
||
|
|
|
||
|
14 years ago
|
xpMessageBody :: PU [Element] MessageBody
|
||
|
|
xpMessageBody = xpElems .
|
||
|
|
xpWrap (\(l, s) -> MessageBody l s)
|
||
|
14 years ago
|
(\(MessageBody l s) -> (l,s))
|
||
|
|
$ xpElem "{jabber:client}body" xpLangTag $ xpContent xpId
|
||
|
|
|
||
|
14 years ago
|
xpMessageThread :: PU [Element] MessageThread
|
||
|
|
xpMessageThread = xpElems
|
||
|
|
. xpWrap (\(t, p) -> MessageThread p t)
|
||
|
14 years ago
|
(\(MessageThread p t) -> (t,p))
|
||
|
|
$ xpElem "{jabber:client}thread"
|
||
|
|
(xpAttrImplied "parent" xpId)
|
||
|
|
(xpContent xpId)
|
||
|
|
|
||
|
|
-- | Get the subject elements of a message (if any). Messages may
|
||
|
|
-- contain multiple subjects if each of them has a distinct xml:lang
|
||
|
|
-- attribute
|
||
|
|
subject :: Message -> [MessageSubject]
|
||
|
|
subject m = ms
|
||
|
|
where
|
||
|
|
-- xpFindMatches will _always_ return Right
|
||
|
|
Right ms = unpickle (xpFindMatches xpMessageSubject) $ messagePayload m
|
||
|
|
|
||
|
14 years ago
|
-- | Get the thread elements of a message (if any). The thread of a
|
||
|
|
-- message is considered opaque, that is, no meaning, other than it's
|
||
|
|
-- literal identity, may be derived from it and it is not human
|
||
|
|
-- readable
|
||
|
14 years ago
|
thread :: Message -> Maybe MessageThread
|
||
|
|
thread m = ms
|
||
|
|
where
|
||
|
|
-- xpFindMatches will _always_ return Right
|
||
|
|
Right ms = unpickle (xpOption xpMessageThread) $ messagePayload m
|
||
|
|
|
||
|
|
-- | Get the body elements of a message (if any). Messages may contain
|
||
|
|
-- multiple bodies if each of them has a distinct xml:lang attribute
|
||
|
|
body :: Message -> [MessageBody]
|
||
|
|
body m = ms
|
||
|
|
where
|
||
|
|
-- xpFindMatches will _always_ return Right
|
||
|
|
Right ms = unpickle (xpFindMatches xpMessageBody) $ messagePayload m
|
||
|
14 years ago
|
|
||
|
14 years ago
|
-- | Generate a new instant message
|
||
|
14 years ago
|
newIM
|
||
|
|
:: JID
|
||
|
|
-> Maybe StanzaId
|
||
|
|
-> Maybe LangTag
|
||
|
|
-> MessageType
|
||
|
14 years ago
|
-> Maybe MessageSubject
|
||
|
|
-> Maybe MessageThread
|
||
|
|
-> Maybe MessageBody
|
||
|
|
-> [Element]
|
||
|
14 years ago
|
-> Message
|
||
|
14 years ago
|
newIM t i lang tp sbj thrd bdy payload = Message
|
||
|
14 years ago
|
{ messageID = i
|
||
|
|
, messageFrom = Nothing
|
||
|
|
, messageTo = Just t
|
||
|
|
, messageLangTag = lang
|
||
|
|
, messageType = tp
|
||
|
14 years ago
|
, messagePayload = concat $
|
||
|
|
maybeToList (pickle xpMessageSubject <$> sbj)
|
||
|
|
++ maybeToList (pickle xpMessageThread <$> thrd)
|
||
|
|
++ maybeToList (pickle xpMessageBody <$> bdy)
|
||
|
|
++ [payload]
|
||
|
14 years ago
|
}
|
||
|
14 years ago
|
|
||
|
14 years ago
|
-- | Generate a simple instance message
|
||
|
14 years ago
|
simpleIM :: JID -> Text -> Message
|
||
|
|
simpleIM t bd = newIM
|
||
|
|
t
|
||
|
|
Nothing
|
||
|
|
Nothing
|
||
|
|
Normal
|
||
|
|
Nothing
|
||
|
|
Nothing
|
||
|
|
(Just $ MessageBody Nothing bd)
|
||
|
|
[]
|
||
|
|
|
||
|
14 years ago
|
-- | Generate an answer from a received message. The recepient is
|
||
|
|
-- taken from the original sender, the sender is set to Nothing,
|
||
|
|
-- message ID, language tag, message type as well as subject and
|
||
|
|
-- thread are inherited, the remaining payload is replaced by the
|
||
|
|
-- given one
|
||
|
14 years ago
|
answerIM :: Maybe MessageBody -> [Element] -> Message -> Message
|
||
|
|
answerIM bd payload msg = Message
|
||
|
|
{ messageID = messageID msg
|
||
|
|
, messageFrom = Nothing
|
||
|
|
, messageTo = messageFrom msg
|
||
|
|
, messageLangTag = messageLangTag msg
|
||
|
|
, messageType = messageType msg
|
||
|
|
, messagePayload = concat $
|
||
|
|
(pickle xpMessageSubject <$> subject msg)
|
||
|
|
++ maybeToList (pickle xpMessageThread <$> thread msg)
|
||
|
|
++ maybeToList (pickle xpMessageBody <$> bd)
|
||
|
|
++ [payload]
|
||
|
|
}
|