diff --git a/protocol/common/message.go b/protocol/common/message.go index ad11e98b7..db26165b8 100644 --- a/protocol/common/message.go +++ b/protocol/common/message.go @@ -283,6 +283,7 @@ func (m *Message) MarshalJSON() ([]byte, error) { ContactVerificationState ContactVerificationState `json:"contactVerificationState,omitempty"` DiscordMessage *protobuf.DiscordMessage `json:"discordMessage,omitempty"` BridgeMessage *protobuf.BridgeMessage `json:"bridgeMessage,omitempty"` + PaymentRequests []*protobuf.PaymentRequest `json:"paymentRequests,omitempty"` } item := MessageStructType{ ID: m.ID, @@ -325,6 +326,7 @@ func (m *Message) MarshalJSON() ([]byte, error) { DeletedForMe: m.DeletedForMe, ContactRequestState: m.ContactRequestState, ContactVerificationState: m.ContactVerificationState, + PaymentRequests: m.PaymentRequests, } if sticker := m.GetSticker(); sticker != nil { diff --git a/protocol/message_persistence.go b/protocol/message_persistence.go index a7eed93cd..fe0958f62 100644 --- a/protocol/message_persistence.go +++ b/protocol/message_persistence.go @@ -115,7 +115,8 @@ func (db sqlitePersistence) tableUserMessagesAllFields() string { contact_verification_status, mentioned, replied, - discord_message_id` + discord_message_id, + payment_requests` } // keep the same order as in tableUserMessagesScanAllFields @@ -148,6 +149,7 @@ func (db sqlitePersistence) tableUserMessagesAllFieldsJoin() string { m1.links, m1.unfurled_links, m1.unfurled_status_links, + m1.payment_requests, m1.command_id, m1.command_value, m1.command_from, @@ -243,6 +245,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message var serializedLinks []byte var serializedUnfurledLinks []byte var serializedUnfurledStatusLinks []byte + var serializedPaymentRequests []byte var alias sql.NullString var identicon sql.NullString var communityID sql.NullString @@ -303,6 +306,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message &serializedLinks, &serializedUnfurledLinks, &serializedUnfurledStatusLinks, + &serializedPaymentRequests, &command.ID, &command.Value, &command.From, @@ -474,6 +478,13 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message message.UnfurledStatusLinks = &links } + if serializedPaymentRequests != nil { + err := json.Unmarshal(serializedPaymentRequests, &message.PaymentRequests) + if err != nil { + return err + } + } + if attachment.Id != "" { discordMessage.Attachments = append(discordMessage.Attachments, attachment) } @@ -581,6 +592,14 @@ func (db sqlitePersistence) tableUserMessagesAllValues(message *common.Message) } } + var serializedPaymentRequests []byte + if len(message.PaymentRequests) != 0 { + serializedPaymentRequests, err = json.Marshal(message.PaymentRequests) + if err != nil { + return nil, err + } + } + return []interface{}{ message.ID, message.WhisperTimestamp, @@ -638,6 +657,7 @@ func (db sqlitePersistence) tableUserMessagesAllValues(message *common.Message) message.Mentioned, message.Replied, discordMessage.Id, + serializedPaymentRequests, }, nil } diff --git a/protocol/migrations/sqlite/1731902422_payment_requests.up.sql b/protocol/migrations/sqlite/1731902422_payment_requests.up.sql new file mode 100644 index 000000000..0421fd26e --- /dev/null +++ b/protocol/migrations/sqlite/1731902422_payment_requests.up.sql @@ -0,0 +1 @@ +ALTER TABLE user_messages ADD COLUMN payment_requests BLOB; \ No newline at end of file diff --git a/protocol/protobuf/chat_message.proto b/protocol/protobuf/chat_message.proto index 9cbfe303b..f35f89bfa 100644 --- a/protocol/protobuf/chat_message.proto +++ b/protocol/protobuf/chat_message.proto @@ -119,6 +119,13 @@ message BridgeMessage { string parentMessageID = 7; } +message PaymentRequest { + string receiver = 1; + string symbol = 2; + string amount = 3; + uint32 chainId = 4; +} + message UnfurledLinkThumbnail { bytes payload = 1; uint32 width = 2; @@ -234,6 +241,8 @@ message ChatMessage { uint32 customization_color = 19; + repeated PaymentRequest payment_requests = 20; + enum ContentType { UNKNOWN_CONTENT_TYPE = 0; TEXT_PLAIN = 1;