211 lines
7.0 KiB
Go
211 lines
7.0 KiB
Go
package protocol
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
"go.uber.org/zap"
|
|
|
|
"github.com/status-im/status-go/protocol/common"
|
|
|
|
localnotifications "github.com/status-im/status-go/services/local-notifications"
|
|
"github.com/status-im/status-go/signal"
|
|
|
|
"github.com/status-im/status-go/protocol/protobuf"
|
|
)
|
|
|
|
type RawMessageHandler func(ctx context.Context, rawMessage common.RawMessage) (common.RawMessage, error)
|
|
|
|
func (m *Messenger) HandleSyncRawMessages(rawMessages []*protobuf.RawMessage) error {
|
|
state := m.buildMessageState()
|
|
for _, rawMessage := range rawMessages {
|
|
switch rawMessage.GetMessageType() {
|
|
case protobuf.ApplicationMetadataMessage_CONTACT_UPDATE:
|
|
var message protobuf.ContactUpdate
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.HandleContactUpdate(state, message)
|
|
if err != nil {
|
|
m.logger.Warn("failed to HandleContactUpdate when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_INSTALLATION_PUBLIC_CHAT:
|
|
var message protobuf.SyncInstallationPublicChat
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
addedChat := m.HandleSyncInstallationPublicChat(state, message)
|
|
if addedChat != nil {
|
|
_, err = m.createPublicChat(addedChat.ID, state.Response)
|
|
if err != nil {
|
|
m.logger.Error("error createPublicChat when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_CHAT_REMOVED:
|
|
var message protobuf.SyncChatRemoved
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.HandleSyncChatRemoved(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to HandleSyncChatRemoved when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_CHAT_MESSAGES_READ:
|
|
var message protobuf.SyncChatMessagesRead
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.HandleSyncChatMessagesRead(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to HandleSyncChatMessagesRead when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_CLEAR_HISTORY:
|
|
var message protobuf.SyncClearHistory
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.handleSyncClearHistory(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to handleSyncClearHistory when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_INSTALLATION_CONTACT:
|
|
var message protobuf.SyncInstallationContactV2
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.HandleSyncInstallationContact(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to HandleSyncInstallationContact when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_INSTALLATION_COMMUNITY:
|
|
var message protobuf.SyncCommunity
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.handleSyncCommunity(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to handleSyncCommunity when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_BOOKMARK:
|
|
var message protobuf.SyncBookmark
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.handleSyncBookmark(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to handleSyncBookmark when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_TRUSTED_USER:
|
|
var message protobuf.SyncTrustedUser
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.handleSyncTrustedUser(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to handleSyncTrustedUser when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_VERIFICATION_REQUEST:
|
|
var message protobuf.SyncVerificationRequest
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.handleSyncVerificationRequest(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to handleSyncVerificationRequest when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_SETTING:
|
|
var message protobuf.SyncSetting
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.handleSyncSetting(state, &message)
|
|
if err != nil {
|
|
m.logger.Error("failed to handleSyncSetting when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_PROFILE_PICTURE:
|
|
var message protobuf.SyncProfilePictures
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.HandleSyncProfilePictures(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to HandleSyncProfilePictures when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_CONTACT_REQUEST_DECISION:
|
|
var message protobuf.SyncContactRequestDecision
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.HandleSyncContactRequestDecision(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to HandleSyncContactRequestDecision when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_WALLET_ACCOUNT:
|
|
var message protobuf.SyncWalletAccounts
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.HandleSyncWalletAccount(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to HandleSyncWalletAccount when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
case protobuf.ApplicationMetadataMessage_SYNC_SAVED_ADDRESS:
|
|
var message protobuf.SyncSavedAddress
|
|
err := proto.Unmarshal(rawMessage.GetPayload(), &message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = m.handleSyncSavedAddress(state, message)
|
|
if err != nil {
|
|
m.logger.Error("failed to handleSyncSavedAddress when HandleSyncRawMessages", zap.Error(err))
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
response, err := m.saveDataAndPrepareResponse(state)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
publishMessengerResponse(response)
|
|
return nil
|
|
}
|
|
|
|
// this is a copy implementation of the one in ext/service.go, we should refactor this?
|
|
func publishMessengerResponse(response *MessengerResponse) {
|
|
if !response.IsEmpty() {
|
|
notifications := response.Notifications()
|
|
// Clear notifications as not used for now
|
|
response.ClearNotifications()
|
|
signal.SendNewMessages(response)
|
|
localnotifications.PushMessages(notifications)
|
|
}
|
|
}
|