From aa83cb804105594d43c2002352f2b1d9f9db3c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Mon, 17 Jul 2023 21:30:21 +0200 Subject: Send direct messages using identity --- src/Main.hs | 5 ++++- src/Message.hs | 52 +++++++++++++++++++++++++--------------------------- src/Test.hs | 22 +++++++++++++++++----- 3 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/Main.hs b/src/Main.hs index aee0cc6..a84e820 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -303,7 +303,10 @@ cmdSend :: Command cmdSend = void $ do Just peer <- gets csPeer text <- asks ciLine - smsg <- sendDirectMessage peer $ T.pack text + powner <- peerIdentity peer >>= \case + PeerIdentityFull pid -> return $ finalOwner pid + _ -> throwError "incomplete peer identity" + smsg <- sendDirectMessage powner $ T.pack text tzone <- liftIO $ getCurrentTimeZone liftIO $ putStrLn $ formatMessage tzone $ fromStored smsg diff --git a/src/Message.hs b/src/Message.hs index 53283a5..41a88b0 100644 --- a/src/Message.hs +++ b/src/Message.hs @@ -150,33 +150,31 @@ findMsgProperty pid sel mss = concat $ flip findProperty mss $ \x -> do return $ sel x -sendDirectMessage :: (MonadHead LocalState m, MonadError String m) => Peer -> Text -> m (Stored DirectMessage) -sendDirectMessage peer text = do - pid <- peerIdentity peer >>= \case PeerIdentityFull pid -> return pid - _ -> throwError "incomplete peer identity" - let powner = finalOwner pid - updateLocalHead $ \ls -> do - let st = storedStorage ls - self = localIdentity $ fromStored ls - flip updateSharedState ls $ \(DirectMessageThreads prev _) -> liftIO $ do - let sent = findMsgProperty powner msSent prev - received = findMsgProperty powner msReceived prev - - time <- getZonedTime - smsg <- wrappedStore st DirectMessage - { msgFrom = toComposedIdentity $ finalOwner self - , msgPrev = filterAncestors $ sent ++ received - , msgTime = time - , msgText = text - } - next <- wrappedStore st $ MessageState - { msPrev = prev - , msPeer = powner - , msSent = [smsg] - , msReceived = [] - , msSeen = [] - } - return (DirectMessageThreads [next] (messageThreadView [next]), smsg) +sendDirectMessage :: (Foldable f, Applicative f, MonadHead LocalState m, MonadError String m) + => Identity f -> Text -> m (Stored DirectMessage) +sendDirectMessage pid text = updateLocalHead $ \ls -> do + let st = storedStorage ls + self = localIdentity $ fromStored ls + powner = finalOwner pid + flip updateSharedState ls $ \(DirectMessageThreads prev _) -> liftIO $ do + let sent = findMsgProperty powner msSent prev + received = findMsgProperty powner msReceived prev + + time <- getZonedTime + smsg <- wrappedStore st DirectMessage + { msgFrom = toComposedIdentity $ finalOwner self + , msgPrev = filterAncestors $ sent ++ received + , msgTime = time + , msgText = text + } + next <- wrappedStore st $ MessageState + { msPrev = prev + , msPeer = powner + , msSent = [smsg] + , msReceived = [] + , msSeen = [] + } + return (DirectMessageThreads [next] (messageThreadView [next]), smsg) syncDirectMessageToPeer :: DirectMessageThreads -> ServiceHandler DirectMessage () syncDirectMessageToPeer (DirectMessageThreads mss _) = do diff --git a/src/Test.hs b/src/Test.hs index c0b8aed..7694322 100644 --- a/src/Test.hs +++ b/src/Test.hs @@ -249,6 +249,7 @@ commands = map (T.pack *** id) , ("contact-list", cmdContactList) , ("contact-set-name", cmdContactSetName) , ("dm-send-peer", cmdDmSendPeer) + , ("dm-send-contact", cmdDmSendContact) ] cmdStore :: Command @@ -480,19 +481,30 @@ cmdContactList = do ] cmdOut "contact-list-done" -cmdContactSetName :: Command -cmdContactSetName = do - [cid, name] <- asks tiParams +getContact :: Text -> CommandM Contact +getContact cid = do h <- getHead let contacts = fromSetBy (comparing contactName) . lookupSharedValue . lsShared . headObject $ h [contact] <- flip filterM contacts $ \c -> do r:_ <- return $ filterAncestors $ concatMap storedRoots $ toComponents c return $ T.pack (show $ refDigest $ storedRef r) == cid + return contact + +cmdContactSetName :: Command +cmdContactSetName = do + [cid, name] <- asks tiParams + contact <- getContact cid updateLocalHead_ $ updateSharedState_ $ contactSetName contact name cmdOut "contact-set-name-done" cmdDmSendPeer :: Command cmdDmSendPeer = do [spidx, msg] <- asks tiParams - peer <- getPeer spidx - void $ sendDirectMessage peer msg + PeerIdentityFull to <- peerIdentity =<< getPeer spidx + void $ sendDirectMessage to msg + +cmdDmSendContact :: Command +cmdDmSendContact = do + [cid, msg] <- asks tiParams + Just to <- contactIdentity <$> getContact cid + void $ sendDirectMessage to msg -- cgit v1.2.3