{-# LANGUAGE OverloadedStrings #-} module Util where import qualified Data.ByteString.Lazy as L import Data.Monoid import qualified Data.Text as Text ;import Data.Text (Text) import qualified Data.Text.Encoding as Text import qualified Network.BSD as BSD import Network.Socket import Network.Address (setPort) type UserName = Text type ResourceName = Text stripResource :: Text -> Text stripResource jid = let (n,h,_) = splitJID jid in unsplitJID (n,h,Nothing) unsplitJID :: (Maybe UserName,Text,Maybe ResourceName) -> Text unsplitJID (n,h,r) = username <> h <> resource where username = maybe "" (<>"@") n resource = maybe "" ("/"<>) r splitJID :: Text -> (Maybe UserName,Text,Maybe ResourceName) splitJID bjid = let (uATh,slashrsc) = Text.break (=='/') bjid rsrc = if Text.null slashrsc then Nothing else Just $ Text.drop 1 slashrsc (u,atserver) = Text.break (=='@') uATh (name,server) = if Text.null atserver then (Nothing,u) else (Just u,Text.drop 1 atserver) in (name,server,rsrc) textHostName :: IO Text textHostName = fmap Text.pack BSD.getHostName textToLazyByteString :: Text -> L.ByteString textToLazyByteString s = L.fromChunks [Text.encodeUtf8 s] lazyByteStringToText :: L.ByteString -> Text lazyByteStringToText = (foldr (<>) mempty . map Text.decodeUtf8 . L.toChunks) -- | for example: 2001-db8-85a3-8d3-1319-8a2e-370-7348.ipv6-literal.net ip6literal :: Text -> Text ip6literal addr = Text.map dash addr <> ".ipv6-literal.net" where dash ':' = '-' dash x = x sameAddress :: SockAddr -> SockAddr -> Bool sameAddress laddr addr = setPort 0 laddr == setPort 0 addr