{-# 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 :: Text -> Stanza 'Presence 'Outgoing ()
presAvailable Text
status = Maybe SomeJID
-> Maybe SomeJID
-> Text
-> PresenceType
-> ShowType
-> Text
-> Maybe Integer
-> DataByPurpose 'Outgoing ()
-> Sing 'Outgoing
-> Stanza 'Presence 'Outgoing ()
forall (p :: StanzaPurpose) ext.
Maybe SomeJID
-> Maybe SomeJID
-> Text
-> PresenceType
-> ShowType
-> Text
-> Maybe Integer
-> DataByPurpose p ext
-> Sing p
-> Stanza 'Presence p ext
MkPresence Maybe SomeJID
forall a. Maybe a
Nothing Maybe SomeJID
forall a. Maybe a
Nothing Text
"" PresenceType
Default ShowType
Available Text
status (Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
0) [] Sing 'Outgoing
SOutgoing

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

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

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

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

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

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

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

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