status-go/protocol/messenger_messages.go

89 lines
2.2 KiB
Go
Raw Normal View History

2021-06-07 08:31:27 +00:00
package protocol
import (
"context"
"errors"
"fmt"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/requests"
)
var ErrInvalidEditAuthor = errors.New("sender is not the author of the message")
var ErrInvalidEditContentType = errors.New("only text messages can be replaced")
func (m *Messenger) EditMessage(ctx context.Context, request *requests.EditMessage) (*MessengerResponse, error) {
err := request.Validate()
if err != nil {
return nil, err
}
fmt.Println("IDDD", request.ID.String())
message, err := m.persistence.MessageByID(request.ID.String())
if err != nil {
return nil, err
}
2021-06-08 06:07:45 +00:00
if message.From != common.PubkeyToHex(&m.identity.PublicKey) {
2021-06-07 08:31:27 +00:00
return nil, ErrInvalidEditAuthor
}
if message.ContentType != protobuf.ChatMessage_TEXT_PLAIN {
return nil, ErrInvalidEditContentType
}
// A valid added chat is required.
chat, ok := m.allChats.Load(message.ChatId)
if !ok {
return nil, errors.New("Chat not found")
}
clock, _ := chat.NextClockAndTimestamp(m.getTimesource())
editMessage := &EditMessage{}
editMessage.Text = request.Text
editMessage.ChatId = message.ChatId
editMessage.MessageId = request.ID.String()
editMessage.Clock = clock
2021-06-07 11:45:06 +00:00
err = m.applyEditMessage(&editMessage.EditMessage, message)
if err != nil {
return nil, err
}
2021-06-07 08:31:27 +00:00
encodedMessage, err := m.encodeChatEntity(chat, editMessage)
if err != nil {
return nil, err
}
rawMessage := common.RawMessage{
LocalChatID: chat.ID,
Payload: encodedMessage,
MessageType: protobuf.ApplicationMetadataMessage_EDIT_MESSAGE,
ResendAutomatically: true,
}
_, err = m.dispatchMessage(ctx, rawMessage)
if err != nil {
return nil, err
}
response := &MessengerResponse{}
response.AddMessage(message)
return response, nil
}
2021-06-07 11:45:06 +00:00
func (m *Messenger) applyEditMessage(editMessage *protobuf.EditMessage, message *common.Message) error {
2021-06-08 06:07:45 +00:00
// TODO: should save an edit if it's the first time it's being edited
2021-06-07 11:45:06 +00:00
message.Text = editMessage.Text
message.EditedAt = editMessage.Clock
err := message.PrepareContent(common.PubkeyToHex(&m.identity.PublicKey))
if err != nil {
return err
}
return m.persistence.SaveMessages([]*common.Message{message})
}