packages feed

haskell-xmpp-2.0.0: src/Network/XMPP/IM/Presence.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}

-----------------------------------------------------------------------------
-- |
-- Module      :  Network.XMPP.IM.Presence
-- Copyright   :  (c) pierre, 2007
-- License     :  BSD-style (see the file libraries/base/LICENSE)
-- Copyright   :  (c) riskbook, 2020
-- SPDX-License-Identifier:  BSD3
-- 
-- Maintainer  :  k.pierre.k@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- XMPP presence utilities
--
-----------------------------------------------------------------------------
module Network.XMPP.IM.Presence
  (
    presAvailable
  , presUnavailable
  , presAway
  , presXa
  , presChat
  , presDND
  ) where

import Network.XMPP.Types
import Data.Text           (Text)

-- | Default presence, should be sent at first
presAvailable :: Text -- ^ Status message
              -> Stanza 'Presence 'Outgoing ()
presAvailable status = MkPresence Nothing Nothing "" Default Available status (Just 0) [] SOutgoing

-- | Should be sent at last
presUnavailable :: Text -> Stanza 'Presence 'Outgoing ()
presUnavailable = mkPresenceU Available

presAway :: Text -> Stanza 'Presence 'Outgoing ()
presAway = mkPresenceD Away

presXa :: Text -> Stanza 'Presence 'Outgoing ()
presXa = mkPresenceD XAway

presChat :: Text -> Stanza 'Presence 'Outgoing ()
presChat = mkPresenceD FreeChat

presDND :: Text -> Stanza 'Presence 'Outgoing ()
presDND = mkPresenceD DND

-- | Helper to construct presence Stanza with required attrs
mkPresence :: PresenceType -> ShowType -> Text -> Stanza 'Presence 'Outgoing ()
mkPresence typ showType status = 
    MkPresence 
        { pFrom     = Nothing
        , pTo       = Nothing
        , pId       = ""
        , pType     = typ
        , pShowType = showType
        , pStatus   = status
        , pPriority = Just 0
        , pExt      = []
        , pPurpose = SOutgoing
        }

mkPresenceD :: ShowType -> Text -> Stanza 'Presence 'Outgoing ()
mkPresenceD = mkPresence Default

mkPresenceU :: ShowType -> Text -> Stanza 'Presence 'Outgoing ()
mkPresenceU = mkPresence Unavailable