From 92277571d41fe72e2ddacc9f8a34f64084e18688 Mon Sep 17 00:00:00 2001
From: Philipp Balzarek
Date: Wed, 9 May 2012 13:56:35 +0200
Subject: [PATCH] add functions to extract subject, thread and body from
message add newIM that creates a new message with subject, thread and body
---
src/Network/XMPP/IM/Message.hs | 99 ++++++++++++++++++++++++----------
src/Network/XMPP/Message.hs | 34 ++++++++++++
2 files changed, 104 insertions(+), 29 deletions(-)
create mode 100644 src/Network/XMPP/Message.hs
diff --git a/src/Network/XMPP/IM/Message.hs b/src/Network/XMPP/IM/Message.hs
index 5aa92b5..a6f4e5f 100644
--- a/src/Network/XMPP/IM/Message.hs
+++ b/src/Network/XMPP/IM/Message.hs
@@ -1,36 +1,77 @@
-{-# LANGUAGE RecordWildCards #-}
-
+{-# LANGUAGE OverloadedStrings #-}
module Network.XMPP.IM.Message
- ( Message(..)
- , MessageError(..)
- , MessageType(..)
- , answerMessage
- , message
- ) where
+ where
import Data.Text (Text)
+import Data.XML.Pickle
import Data.XML.Types
import Network.XMPP.Types
+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
+
+xpMessageSubject :: PU [Node] MessageSubject
+xpMessageSubject = xpWrap (\(l, s) -> MessageSubject l s)
+ (\(MessageSubject l s) -> (l,s))
+ $ xpElem "{jabber:client}subject" xpLangTag $ xpContent xpId
+
+xpMessageBody :: PU [Node] MessageBody
+xpMessageBody = xpWrap (\(l, s) -> MessageBody l s)
+ (\(MessageBody l s) -> (l,s))
+ $ xpElem "{jabber:client}body" xpLangTag $ xpContent xpId
+
+xpMessageThread :: PU [Node] MessageThread
+xpMessageThread = xpWrap (\(t, p) -> MessageThread p t)
+ (\(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
+
+-- | Get the thread elements of a message (if any). The threads is not considered human readable and no semantic mea
+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
--- | An empty message.
-message :: Message
-message = Message { messageID = Nothing
- , messageFrom = Nothing
- , messageTo = Nothing
- , messageLangTag = Nothing
- , messageType = Normal
- , messagePayload = []
- }
-
--- Produce an answer message with the given payload, switching the "from" and
--- "to" attributes in the original message.
-answerMessage :: Message -> [Element] -> Maybe Message
-answerMessage Message{messageFrom = Just frm, ..} payload =
- Just Message{ messageFrom = messageTo
- , messageID = Nothing
- , messageTo = Just frm
- , messagePayload = payload
- , ..
- }
-answerMessage _ _ = Nothing
\ No newline at end of file
+newIM
+ :: JID
+ -> Maybe StanzaId
+ -> Maybe LangTag
+ -> MessageType
+ -> MessageSubject
+ -> MessageThread
+ -> MessageBody
+ -> Message
+newIM t i lang tp sbj thrd bdy = Message
+ { messageID = i
+ , messageFrom = Nothing
+ , messageTo = Just t
+ , messageLangTag = lang
+ , messageType = tp
+ , messagePayload = pickle xpMessageSubject sbj
+ ++ pickle xpMessageThread thrd
+ ++ pickle xpMessageBody bdy
+ }
diff --git a/src/Network/XMPP/Message.hs b/src/Network/XMPP/Message.hs
new file mode 100644
index 0000000..7e10634
--- /dev/null
+++ b/src/Network/XMPP/Message.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE RecordWildCards #-}
+module Network.XMPP.Message
+ ( Message(..)
+ , MessageError(..)
+ , MessageType(..)
+ , answerMessage
+ , message
+ ) where
+
+import Data.XML.Types
+
+import Network.XMPP.Types
+
+-- | An empty message.
+message :: Message
+message = Message { messageID = Nothing
+ , messageFrom = Nothing
+ , messageTo = Nothing
+ , messageLangTag = Nothing
+ , messageType = Normal
+ , messagePayload = []
+ }
+
+-- Produce an answer message with the given payload, switching the "from" and
+-- "to" attributes in the original message.
+answerMessage :: Message -> [Node] -> Maybe Message
+answerMessage Message{messageFrom = Just frm, ..} payload =
+ Just Message{ messageFrom = messageTo
+ , messageID = Nothing
+ , messageTo = Just frm
+ , messagePayload = payload
+ , ..
+ }
+answerMessage _ _ = Nothing
\ No newline at end of file