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

-----------------------------------------------------------------------------
-- |
-- Module      :  Network.XMPP.XEP.Version
-- Copyright   :  (c) pierre, 2007
-- License     :  BSD-style (see the file libraries/base/LICENSE)
-- Copyright   :  (c) riskbook, 2020
-- SPDX-License-Identifier:  BSD3
-- 
-- Maintainer  :  Dmitry Astapov <dastapov@gmail.com>, pierre <k.pierre.k@gmail.com>
-- Stability   :  experimental
-- Portability :  portable
--
-- XEP-0092, version request
--
-----------------------------------------------------------------------------
module Network.XMPP.XEP.Version
    ( isVersionReq
    , versionAnswer
    ) where

import Network.XMPP.Types
import Network.XMPP.XML

import Text.XML.HaXml
    
-- | True, if stanza is a version request
isVersionReq :: Stanza 'IQ 'Incoming () -> Bool
isVersionReq :: Stanza 'IQ 'Incoming () -> Bool
isVersionReq MkIQ { iqBody :: forall (p :: StanzaPurpose) ext.
Stanza 'IQ p ext -> DataByPurpose p ext
iqBody = DataByPurpose 'Incoming ()
ext } =
    ([Content Posn] -> Bool)
-> (() -> Bool) -> Either [Content Posn] () -> Bool
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Text -> Text -> [Content Posn] -> Bool
isVal Text
"jabber:iq:version" Text
"/iq/query/@xmlns") (Bool -> () -> Bool
forall a b. a -> b -> a
const Bool
False) Either [Content Posn] ()
DataByPurpose 'Incoming ()
ext

-- | Replies to version request
versionAnswer :: String -> String -> String -> Stanza 'IQ 'Outgoing () -> [CFilter i]
versionAnswer :: String
-> String -> String -> Stanza 'IQ 'Outgoing () -> [CFilter i]
versionAnswer String
name String
version String
os MkIQ { } =
    [ String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
forall i.
String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
mkElemAttr String
"query"
       [ String -> String -> (String, CFilter i)
forall a i. a -> String -> (a, CFilter i)
strAttr String
"xmlns" String
"jabber:iq:version" ]
       [ String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
forall i.
String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
mkElemAttr String
"name" [] [String -> CFilter i
forall i. String -> CFilter i
literal String
name],
         String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
forall i.
String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
mkElemAttr String
"version" [] [String -> CFilter i
forall i. String -> CFilter i
literal String
version],
         String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
forall i.
String -> [(String, CFilter i)] -> [CFilter i] -> CFilter i
mkElemAttr String
"os" [] [String -> CFilter i
forall i. String -> CFilter i
literal String
os]
       ]
    ]