diff --git a/source/Network/Xmpp/IM/Message.hs b/source/Network/Xmpp/IM/Message.hs index f6fdc3a..b141eea 100644 --- a/source/Network/Xmpp/IM/Message.hs +++ b/source/Network/Xmpp/IM/Message.hs @@ -3,14 +3,14 @@ module Network.Xmpp.IM.Message where +import Data.Default +import Data.Function +import Data.List import Data.Text (Text) import Data.XML.Pickle import Data.XML.Types import Network.Xmpp.Marshal import Network.Xmpp.Types -import Data.List -import Data.Function - data MessageBody = MessageBody { bodyLang :: Maybe LangTag , bodyContent :: Text @@ -36,6 +36,9 @@ instantMessage = InstantMessage { imThread = Nothing , imBody = [] } +instance Default InstantMessage where + def = instantMessage + -- | Get the IM specific parts of a message. Returns 'Nothing' when the received -- payload is not valid IM data. getIM :: Message -> Maybe InstantMessage diff --git a/source/Network/Xmpp/IM/Presence.hs b/source/Network/Xmpp/IM/Presence.hs index d5d3750..0f0ba03 100644 --- a/source/Network/Xmpp/IM/Presence.hs +++ b/source/Network/Xmpp/IM/Presence.hs @@ -4,10 +4,11 @@ module Network.Xmpp.IM.Presence where -import Data.Text (Text) -import Data.XML.Pickle -import Data.XML.Types -import Network.Xmpp.Types +import Data.Default +import Data.Text (Text) +import Data.XML.Pickle +import Data.XML.Types +import Network.Xmpp.Types data ShowStatus = StatusAway | StatusChat @@ -38,7 +39,11 @@ imPresence = IMP { showStatus = Nothing , priority = Nothing } +instance Default IMPresence where + def = imPresence +-- | Try to extract RFC6121 IM presence information from presence stanza +-- Returns Nothing when the data is malformed, (Just IMPresence) otherwise getIMPresence :: Presence -> Maybe IMPresence getIMPresence pres = case unpickle xpIMPresence (presencePayload pres) of Left _ -> Nothing diff --git a/source/Network/Xmpp/Marshal.hs b/source/Network/Xmpp/Marshal.hs index 8bfe098..c88eeae 100644 --- a/source/Network/Xmpp/Marshal.hs +++ b/source/Network/Xmpp/Marshal.hs @@ -23,10 +23,10 @@ xpStanza = ("xpStanza" , "") xpAlt stanzaSel [ xpWrap IQRequestS (\(IQRequestS x) -> x) xpIQRequest , xpWrap IQResultS (\(IQResultS x) -> x) xpIQResult , xpWrap IQErrorS (\(IQErrorS x) -> x) xpIQError - , xpWrap MessageS (\(MessageS x) -> x) xpMessage , xpWrap MessageErrorS (\(MessageErrorS x) -> x) xpMessageError - , xpWrap PresenceS (\(PresenceS x) -> x) xpPresence + , xpWrap MessageS (\(MessageS x) -> x) xpMessage , xpWrap PresenceErrorS (\(PresenceErrorS x) -> x) xpPresenceError + , xpWrap PresenceS (\(PresenceS x) -> x) xpPresence ] where -- Selector for which pickler to execute above. @@ -34,10 +34,10 @@ xpStanza = ("xpStanza" , "") xpAlt stanzaSel stanzaSel (IQRequestS _) = 0 stanzaSel (IQResultS _) = 1 stanzaSel (IQErrorS _) = 2 - stanzaSel (MessageS _) = 3 - stanzaSel (MessageErrorS _) = 4 - stanzaSel (PresenceS _) = 5 - stanzaSel (PresenceErrorS _) = 6 + stanzaSel (MessageErrorS _) = 3 + stanzaSel (MessageS _) = 4 + stanzaSel (PresenceErrorS _) = 5 + stanzaSel (PresenceS _) = 6 xpMessage :: PU [Node] (Message) xpMessage = ("xpMessage" , "") xpWrap