{-# 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 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 xs = splitAll '@' bjid ys = splitAll '/' (last xs) splitAll c bjid = take 1 xs0 ++ map (Text.drop 1) (drop 1 xs0) where xs0 = Text.groupBy (\x y-> y/=c) bjid server = head ys name = case xs of (n:s:_) -> Just n _ -> Nothing rsrc = case ys of (s:_:_) -> Just $ last ys _ -> Nothing 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