From 9eb97b810fc1880148f29239cde6c138e1bf2a5d Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sat, 25 Feb 2017 11:35:34 -0500 Subject: [PATCH] Show currently-set route if there is one --- ConfigureDirectMessageRoute.hs | 23 +++++++++++++---------- Main.hs | 6 +++++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/ConfigureDirectMessageRoute.hs b/ConfigureDirectMessageRoute.hs index 950d7f8..c862e81 100644 --- a/ConfigureDirectMessageRoute.hs +++ b/ConfigureDirectMessageRoute.hs @@ -21,12 +21,12 @@ import Util newtype SessionID = SessionID UUID deriving (Ord, Eq, Show) -main :: (XMPP.JID -> XMPP.JID -> IO ()) -> IO (XMPP.IQ -> IO XMPP.IQ) -main setRouteJid = do +main :: (XMPP.JID -> IO (Maybe XMPP.JID)) -> (XMPP.JID -> XMPP.JID -> IO ()) -> IO (XMPP.IQ -> IO XMPP.IQ) +main getRouteJid setRouteJid = do stanzas <- newTQueueIO void $ forkIO $ iterateM_ (\sessions -> do (iq, reply) <- atomically (readTQueue stanzas) - (sessions', response) <- processOneIQ setRouteJid sessions iq + (sessions', response) <- processOneIQ getRouteJid setRouteJid sessions iq atomically $ reply response now <- getCurrentTime return $! Map.filter (\(_, time) -> now `diffUTCTime` time < 600) sessions' @@ -37,8 +37,8 @@ main setRouteJid = do atomically $ readTMVar result ) -processOneIQ :: (XMPP.JID -> XMPP.JID -> IO ()) -> Map SessionID (Session, UTCTime) -> XMPP.IQ -> IO (Map SessionID (Session, UTCTime), XMPP.IQ) -processOneIQ setRouteJid sessions iq@(XMPP.IQ { XMPP.iqID = Just iqID, XMPP.iqFrom = Just from, XMPP.iqPayload = realPayload }) +processOneIQ :: (XMPP.JID -> IO (Maybe XMPP.JID)) -> (XMPP.JID -> XMPP.JID -> IO ()) -> Map SessionID (Session, UTCTime) -> XMPP.IQ -> IO (Map SessionID (Session, UTCTime), XMPP.IQ) +processOneIQ getRouteJid setRouteJid sessions iq@(XMPP.IQ { XMPP.iqID = Just iqID, XMPP.iqFrom = Just from, XMPP.iqPayload = realPayload }) | Just sid <- sessionIDFromText . snd =<< T.uncons =<< T.stripPrefix (s"ConfigureDirectMessageRoute") iqID, XMPP.iqType iq == XMPP.IQResult || XMPP.iqType iq == XMPP.IQError = lookupAndStepSession setRouteJid sessions sid iqID from payload @@ -51,10 +51,11 @@ processOneIQ setRouteJid sessions iq@(XMPP.IQ { XMPP.iqID = Just iqID, XMPP.iqFr | otherwise = do (sid, session) <- newSession now <- getCurrentTime - return (Map.insert sid (session, now) sessions, stage1 from iqID sid) + existingRoute <- getRouteJid from + return (Map.insert sid (session, now) sessions, stage1 existingRoute from iqID sid) where payload = fromMaybe (Element (s"no-payload") [] []) realPayload -processOneIQ _ sessions iq@(XMPP.IQ { XMPP.iqID = iqID, XMPP.iqFrom = from }) = do +processOneIQ _ _ sessions iq@(XMPP.IQ { XMPP.iqID = iqID, XMPP.iqFrom = from }) = do log "ConfigureDirectMessageRoute.processOneIQ BAD INPUT" iq return (sessions, iqError iqID from "cancel" "feature-not-implemented" Nothing) @@ -165,8 +166,8 @@ stage2 sid iqID from command }) | otherwise = (SessionCancel, iqError (Just iqID) (Just from) "modify" "bad-request" (Just "bad-payload")) -stage1 :: XMPP.JID -> Text -> SessionID -> XMPP.IQ -stage1 iqTo iqID sid = (XMPP.emptyIQ XMPP.IQResult) { +stage1 :: Maybe XMPP.JID -> XMPP.JID -> Text -> SessionID -> XMPP.IQ +stage1 existingRoute iqTo iqID sid = (XMPP.emptyIQ XMPP.IQResult) { XMPP.iqTo = Just iqTo, XMPP.iqID = Just iqID, XMPP.iqPayload = Just $ commandStage sid $ @@ -181,7 +182,9 @@ stage1 iqTo iqID sid = (XMPP.emptyIQ XMPP.IQResult) { (fromString "{jabber:x:data}type", [ContentText $ s"jid-single"]), (fromString "{jabber:x:data}var", [ContentText $ s"gateway-jid"]), (fromString "{jabber:x:data}label", [ContentText $ s"Gateway JID"]) - ] [] + ] [ + NodeElement $ Element (fromString "{jabber:x:data}value") [] [NodeContent $ ContentText $ maybe mempty XMPP.formatJID existingRoute] + ] ] } diff --git a/Main.hs b/Main.hs index d01171e..d316ba6 100644 --- a/Main.hs +++ b/Main.hs @@ -1349,7 +1349,11 @@ main = do void $ forkIO $ forever $ atomically (writeTChan toRejoinManager CheckPings) >> threadDelay 120000000 void $ forkIO $ rejoinManager db (atomically . writeTChan sendToComponent) name toRoomPresences toRejoinManager - processDirectMessageRouteConfig <- ConfigureDirectMessageRoute.main (\userJid gatewayJid -> do + processDirectMessageRouteConfig <- ConfigureDirectMessageRoute.main + (\userJid -> + (parseJID . fromString =<<) <$> TC.runTCM (TC.get db (T.unpack (bareTxt userJid) ++ "\0direct-message-route")) + ) + (\userJid gatewayJid -> do log "SETTING DIRECT MESSAGE ROUTE" (userJid, gatewayJid) True <- TC.runTCM $ TC.put db (T.unpack (bareTxt userJid) ++ "\0direct-message-route") (T.unpack $ formatJID gatewayJid) return () -- 2.45.2