From 3a6125d65be6202c1a07d778c7b174e888dda227 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Fri, 28 Feb 2025 14:38:12 +0400 Subject: [PATCH] predicates --- src/Simplex/Chat/Library/Commands.hs | 19 +++++++++++-------- src/Simplex/Chat/Library/Internal.hs | 2 +- .../SQLite/Migrations/chat_query_plans.txt | 10 +++++++--- src/Simplex/Chat/Types.hs | 5 ++++- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 3b431182ff..123a7e9cf9 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -582,7 +582,8 @@ processChatCommand' vr = \case mc = MCReport reportText reportReason cm = ComposedMessage {fileSource = Nothing, quotedItemId = Just reportedItemId, msgContent = mc, mentions = M.empty} when (null ms') $ throwChatError $ CECommandError "no moderators support receiving reports" - sendGroupContentMessages_ user gInfo ms' False Nothing [composedMessageReq cm] + let numFileInvs = length $ filter memberCurrent ms' + sendGroupContentMessages_ user gInfo ms' numFileInvs False Nothing [composedMessageReq cm] where compatibleModerator GroupMember {activeConn, memberChatVRange} = maxVersion (maybe memberChatVRange peerChatVRange activeConn) >= contentReportsVersion @@ -3069,16 +3070,18 @@ processChatCommand' vr = \case sendGroupContentMessages :: User -> GroupInfo -> Maybe GroupMemberId -> Bool -> Maybe Int -> NonEmpty ComposedMessageReq -> CM ChatResponse sendGroupContentMessages user gInfo@GroupInfo {membership} directMemberId live itemTTL cmrs = do assertMultiSendable live cmrs - ms <- case directMemberId of - Nothing -> withFastStore' $ \db -> getGroupMembers db vr user gInfo + (ms, numFileInvs) <- case directMemberId of + Nothing -> do + ms <- withFastStore' $ \db -> getGroupMembers db vr user gInfo + pure (ms, length $ filter memberCurrent ms) Just dmId -> do when (dmId == groupMemberId' membership) $ throwChatError $ CECommandError "cannot send to self" dm <- withFastStore $ \db -> getGroupMemberById db vr user dmId unless (memberStatus dm == GSMemPendingApproval) $ throwChatError $ CECommandError "cannot send directly to member not pending approval" - pure [dm] - sendGroupContentMessages_ user gInfo ms live itemTTL cmrs - sendGroupContentMessages_ :: User -> GroupInfo -> [GroupMember] -> Bool -> Maybe Int -> NonEmpty ComposedMessageReq -> CM ChatResponse - sendGroupContentMessages_ user gInfo@GroupInfo {groupId, membership} ms live itemTTL cmrs = do + pure ([dm], 1) + sendGroupContentMessages_ user gInfo ms numFileInvs live itemTTL cmrs + sendGroupContentMessages_ :: User -> GroupInfo -> [GroupMember] -> Int -> Bool -> Maybe Int -> NonEmpty ComposedMessageReq -> CM ChatResponse + sendGroupContentMessages_ user gInfo@GroupInfo {groupId, membership} ms numFileInvs live itemTTL cmrs = do assertUserGroupRole gInfo GRAuthor assertGroupContentAllowed processComposedMessages @@ -3096,7 +3099,7 @@ processChatCommand' vr = \case Nothing processComposedMessages :: CM ChatResponse processComposedMessages = do - (fInvs_, ciFiles_) <- L.unzip <$> setupSndFileTransfers (length $ filter memberCurrent ms) + (fInvs_, ciFiles_) <- L.unzip <$> setupSndFileTransfers numFileInvs timed_ <- sndGroupCITimed live gInfo itemTTL (chatMsgEvents, quotedItems_) <- L.unzip <$> prepareMsgs (L.zip cmrs fInvs_) timed_ (msgs_, gsr) <- sendGroupMessages user gInfo ms chatMsgEvents diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 37fc95e1ee..83a1978913 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -1488,7 +1488,7 @@ sendGroupMessages_ :: MsgEncodingI e => User -> GroupInfo -> [GroupMember] -> No sendGroupMessages_ _user gInfo@GroupInfo {groupId} members events = do let idsEvts = L.map (GroupId groupId,) events sndMsgs_ <- lift $ createSndMessages idsEvts - recipientMembers <- liftIO $ shuffleMembers (filter memberCurrent members) + recipientMembers <- liftIO $ shuffleMembers (filter canSendTo members) let msgFlags = MsgFlags {notification = any (hasNotification . toCMEventTag) events} (toSendSeparate, toSendBatched, toPending, forwarded, _, dups) = foldr' addMember ([], [], [], [], S.empty, 0 :: Int) recipientMembers diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 72f8e4b8fd..853a9c84a0 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -2951,7 +2951,7 @@ Plan: SEARCH user_contact_links USING INDEX sqlite_autoindex_user_contact_links_1 (user_id=? AND local_display_name=?) Query: - SELECT conn_req_contact, auto_accept, business_address, auto_accept_incognito, auto_reply_msg_content, group_id, group_link_member_role + SELECT conn_req_contact, auto_accept, business_address, auto_accept_incognito, auto_reply_msg_content, group_id, group_link_auto_accept, group_link_member_role FROM user_contact_links WHERE user_id = ? AND user_contact_link_id = ? @@ -4870,7 +4870,7 @@ Query: Plan: SCAN usage_conditions -Query: SELECT chat_item_id FROM chat_items WHERE ( user_id = ? AND group_id = ? AND item_ts < ? ) OR ( user_id = ? AND group_id = ? AND item_ts = ? AND chat_item_id < ? ) ORDER BY item_ts DESC, chat_item_id DESC LIMIT ? +Query: SELECT chat_item_id FROM chat_items WHERE (( user_id = ? AND group_id = ? AND item_ts < ? ) OR ( user_id = ? AND group_id = ? AND item_ts = ? AND chat_item_id < ? )) ORDER BY item_ts DESC, chat_item_id DESC LIMIT ? Plan: MULTI-INDEX OR INDEX 1 @@ -4879,7 +4879,7 @@ INDEX 2 SEARCH chat_items USING COVERING INDEX idx_chat_items_groups_item_ts (user_id=? AND group_id=? AND item_ts=? AND rowid ? ) OR ( user_id = ? AND group_id = ? AND item_ts = ? AND chat_item_id > ? ) ORDER BY item_ts ASC, chat_item_id ASC LIMIT ? +Query: SELECT chat_item_id FROM chat_items WHERE (( user_id = ? AND group_id = ? AND item_ts > ? ) OR ( user_id = ? AND group_id = ? AND item_ts = ? AND chat_item_id > ? )) ORDER BY item_ts ASC, chat_item_id ASC LIMIT ? Plan: MULTI-INDEX OR INDEX 1 @@ -5781,6 +5781,10 @@ Query: UPDATE group_members SET member_role = ? WHERE user_id = ? AND group_memb Plan: SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) +Query: UPDATE group_members SET member_status='pending_approval' WHERE group_member_id = 2 +Plan: +SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) + Query: UPDATE group_members SET xgrplinkmem_received = ?, updated_at = ? WHERE group_member_id = ? Plan: SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index 9a91f7cccf..9d54a24fb2 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -1027,7 +1027,7 @@ memberActive m = case memberStatus m of GSMemGroupDeleted -> False GSMemUnknown -> False GSMemInvited -> False - GSMemPendingApproval -> False -- TODO [knocking] True? + GSMemPendingApproval -> True -- TODO [knocking] False? GSMemIntroduced -> False GSMemIntroInvited -> False GSMemAccepted -> False @@ -1057,6 +1057,9 @@ memberCurrent' = \case GSMemComplete -> True GSMemCreator -> True +canSendTo :: GroupMember -> Bool +canSendTo m@GroupMember {memberStatus} = memberCurrent m || memberStatus == GSMemPendingApproval + memberRemoved :: GroupMember -> Bool memberRemoved m = case memberStatus m of GSMemRejected -> True