module Util where import Prelude () import BasicPrelude import Data.Time (getCurrentTime) import Data.XML.Types (Element(..), Node(NodeElement), isNamed, elementText, elementChildren, attributeText) import qualified Data.Text as T import qualified Network.Protocol.XMPP as XMPP log :: (Show a, MonadIO m) => String -> a -> m () log tag x = liftIO $ do time <- getCurrentTime putStr (show time ++ s" " ++ fromString tag ++ s" :: ") >> print x >> putStrLn mempty s :: (IsString a) => String -> a s = fromString escapeJid :: Text -> Text escapeJid txt = T.concatMap (\char -> case char of ' ' -> s"\\20" '"' -> s"\\22" '&' -> s"\\26" '\'' -> s"\\27" '/' -> s"\\2f" ':' -> s"\\3a" '<' -> s"\\3c" '>' -> s"\\3e" '@' -> s"\\40" '\\' -> s"\\5c" c -> T.singleton c ) txt bareTxt (XMPP.JID (Just node) domain _) = mconcat [XMPP.strNode node, s"@", XMPP.strDomain domain] bareTxt (XMPP.JID Nothing domain _) = XMPP.strDomain domain getFormField form var = listToMaybe $ mapMaybe (\node -> case node of NodeElement el | elementName el == s"{jabber:x:data}field" && (attributeText (s"{jabber:x:data}var") el == Just var || attributeText (s"var") el == Just var) -> Just $ mconcat $ elementText =<< isNamed (s"{jabber:x:data}value") =<< elementChildren el _ -> Nothing ) (elementNodes form)