predicates

This commit is contained in:
spaced4ndy
2025-02-28 14:38:12 +04:00
parent 2b76d360c0
commit 3a6125d65b
4 changed files with 23 additions and 13 deletions
+11 -8
View File
@@ -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
+1 -1
View File
@@ -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
@@ -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<?)
USE TEMP B-TREE FOR ORDER BY
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 ?
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=?)
+4 -1
View File
@@ -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