mirror of
https://github.com/status-im/status-go.git
synced 2025-02-21 11:18:28 +00:00
There were 2 issues: 1) We hard delete requests, that means that on retransmission they will be recreated, the test has been changed to accommodate this behavior 2) We always used time.now when updating timestamp in notification, sometimes time is the same so the notification is not updated, we changed to use what essentially is a clock value
136 lines
5.0 KiB
Go
136 lines
5.0 KiB
Go
package protocol
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
"errors"
|
|
|
|
"github.com/status-im/status-go/eth-node/types"
|
|
"github.com/status-im/status-go/protocol/common"
|
|
"github.com/status-im/status-go/protocol/verification"
|
|
)
|
|
|
|
// The activity center is a place where we store incoming notifications before
|
|
// they are shown to the users as new chats, in order to mitigate the impact of spam
|
|
// on the messenger
|
|
|
|
type ActivityCenterType int
|
|
|
|
const (
|
|
ActivityCenterNotificationNoType ActivityCenterType = iota
|
|
ActivityCenterNotificationTypeNewOneToOne
|
|
ActivityCenterNotificationTypeNewPrivateGroupChat
|
|
ActivityCenterNotificationTypeMention
|
|
ActivityCenterNotificationTypeReply
|
|
ActivityCenterNotificationTypeContactRequest
|
|
ActivityCenterNotificationTypeCommunityInvitation
|
|
ActivityCenterNotificationTypeCommunityRequest
|
|
ActivityCenterNotificationTypeCommunityMembershipRequest
|
|
ActivityCenterNotificationTypeCommunityKicked
|
|
ActivityCenterNotificationTypeContactVerification
|
|
ActivityCenterNotificationTypeContactRemoved
|
|
ActivityCenterNotificationTypeNewKeypairAddedToPairedDevice
|
|
)
|
|
|
|
type ActivityCenterMembershipStatus int
|
|
|
|
const (
|
|
ActivityCenterMembershipStatusIdle ActivityCenterMembershipStatus = iota
|
|
ActivityCenterMembershipStatusPending
|
|
ActivityCenterMembershipStatusAccepted
|
|
ActivityCenterMembershipStatusDeclined
|
|
ActivityCenterMembershipStatusAcceptedPending
|
|
ActivityCenterMembershipStatusDeclinedPending
|
|
ActivityCenterMembershipOwnershipChanged
|
|
)
|
|
|
|
type ActivityCenterQueryParamsRead uint
|
|
|
|
const (
|
|
ActivityCenterQueryParamsReadRead = iota + 1
|
|
ActivityCenterQueryParamsReadUnread
|
|
ActivityCenterQueryParamsReadAll
|
|
)
|
|
|
|
var ErrInvalidActivityCenterNotification = errors.New("invalid activity center notification")
|
|
|
|
type ActivityCenterNotification struct {
|
|
ID types.HexBytes `json:"id"`
|
|
ChatID string `json:"chatId"`
|
|
CommunityID string `json:"communityId"`
|
|
MembershipStatus ActivityCenterMembershipStatus `json:"membershipStatus"`
|
|
Name string `json:"name"`
|
|
Author string `json:"author"`
|
|
Type ActivityCenterType `json:"type"`
|
|
LastMessage *common.Message `json:"lastMessage"`
|
|
Message *common.Message `json:"message"`
|
|
ReplyMessage *common.Message `json:"replyMessage"`
|
|
Timestamp uint64 `json:"timestamp"`
|
|
Read bool `json:"read"`
|
|
Dismissed bool `json:"dismissed"`
|
|
Deleted bool `json:"deleted"`
|
|
Accepted bool `json:"accepted"`
|
|
ContactVerificationStatus verification.RequestStatus `json:"contactVerificationStatus"`
|
|
//Used for synchronization. Each update should increment the UpdatedAt.
|
|
//The value should represent the time when the update occurred.
|
|
UpdatedAt uint64 `json:"updatedAt"`
|
|
AlbumMessages []*common.Message `json:"albumMessages"`
|
|
}
|
|
|
|
func (n *ActivityCenterNotification) IncrementUpdatedAt(timesource common.TimeSource) {
|
|
tNow := timesource.GetCurrentTime()
|
|
// If updatead at is greater or equal than time now, we bump it
|
|
if n.UpdatedAt >= tNow {
|
|
n.UpdatedAt++
|
|
} else {
|
|
n.UpdatedAt = tNow
|
|
}
|
|
}
|
|
|
|
type ActivityCenterNotificationsRequest struct {
|
|
Cursor string `json:"cursor"`
|
|
Limit uint64 `json:"limit"`
|
|
ActivityTypes []ActivityCenterType `json:"activityTypes"`
|
|
ReadType ActivityCenterQueryParamsRead `json:"readType"`
|
|
}
|
|
|
|
type ActivityCenterCountRequest struct {
|
|
ActivityTypes []ActivityCenterType `json:"activityTypes"`
|
|
ReadType ActivityCenterQueryParamsRead `json:"readType"`
|
|
}
|
|
|
|
type ActivityCenterPaginationResponse struct {
|
|
Cursor string `json:"cursor"`
|
|
Notifications []*ActivityCenterNotification `json:"notifications"`
|
|
}
|
|
|
|
type ActivityCenterCountResponse = map[ActivityCenterType]uint64
|
|
|
|
type ActivityCenterState struct {
|
|
HasSeen bool `json:"hasSeen"`
|
|
UpdatedAt uint64 `json:"updatedAt"`
|
|
}
|
|
|
|
func (n *ActivityCenterNotification) Valid() error {
|
|
if len(n.ID) == 0 || n.Type == 0 || n.Timestamp == 0 {
|
|
return ErrInvalidActivityCenterNotification
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func showMentionOrReplyActivityCenterNotification(publicKey ecdsa.PublicKey, message *common.Message, chat *Chat, responseTo *common.Message) (bool, ActivityCenterType) {
|
|
if chat == nil || !chat.Active || (!chat.CommunityChat() && !chat.PrivateGroupChat()) || chat.Muted {
|
|
return false, ActivityCenterNotificationNoType
|
|
}
|
|
|
|
if message.Mentioned {
|
|
return true, ActivityCenterNotificationTypeMention
|
|
}
|
|
|
|
publicKeyString := common.PubkeyToHex(&publicKey)
|
|
if responseTo != nil && responseTo.From == publicKeyString {
|
|
return true, ActivityCenterNotificationTypeReply
|
|
}
|
|
|
|
return false, ActivityCenterNotificationNoType
|
|
}
|