@@ 1,4 1,4 @@
-module DB (DB, Key(..), byJid, byNode, mk, get, getEnum, del, set, setEnum, sadd, srem, smembers, foldKeysM, hset, hdel, hgetall) where
+module DB (DB, Key(..), byJid, byNode, mk, get, getEnum, del, set, expire, setEnum, sadd, srem, smembers, foldKeysM, hset, hdel, hgetall) where
import Prelude ()
import BasicPrelude
@@ 50,6 50,12 @@ set db key val = do
Redis.Ok <- runRedisChecked db $ Redis.set (redisKey key) (encodeUtf8 val)
return ()
+expire :: (HasCallStack) => DB -> Key -> Integer -> IO ()
+expire db key seconds = do
+ -- True if set, False if key didn't exist, but actually I don't care
+ _ <- runRedisChecked db $ Redis.expire (redisKey key) seconds
+ return ()
+
setEnum :: (HasCallStack, Enum a) => DB -> Key -> a -> IO ()
setEnum db key val = do
Redis.Ok <- runRedisChecked db $ Redis.set (redisKey key) (encodeUtf8 $ tshow $ fromEnum val)
@@ 923,7 923,10 @@ componentStanza (ComponentContext { db, componentJid }) (ReceivedIQ iq@(IQ { iqT
let setJidSwitch newJid = do
let from' = maybeUnescape componentJid from
Just route <- (XMPP.parseJID <=< id) <$> DB.get db (DB.byJid from' ["direct-message-route"])
- DB.hset db (DB.byJid newJid ["jidSwitch"]) $ JidSwitch.toAssoc from' route
+ let key = DB.byJid newJid ["jidSwitch"]
+ DB.hset db key $ JidSwitch.toAssoc from' route
+ -- I figure 24 hours is a wide enough window to accept a JID switch
+ DB.expire db key $ 60 * 60 * 24
return (from', newJid, route)
in
map mkStanzaRec <$> JidSwitch.receiveIq componentJid setJidSwitch iq