feat_: Send payment request data (#6137)

This commit is contained in:
Cuteivist 2024-12-03 09:33:40 +01:00 committed by GitHub
parent 0f2ae8fbab
commit 4aa683f03d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 115 additions and 32 deletions

View File

@ -283,6 +283,7 @@ func (m *Message) MarshalJSON() ([]byte, error) {
ContactVerificationState ContactVerificationState `json:"contactVerificationState,omitempty"` ContactVerificationState ContactVerificationState `json:"contactVerificationState,omitempty"`
DiscordMessage *protobuf.DiscordMessage `json:"discordMessage,omitempty"` DiscordMessage *protobuf.DiscordMessage `json:"discordMessage,omitempty"`
BridgeMessage *protobuf.BridgeMessage `json:"bridgeMessage,omitempty"` BridgeMessage *protobuf.BridgeMessage `json:"bridgeMessage,omitempty"`
PaymentRequests []*protobuf.PaymentRequest `json:"paymentRequests,omitempty"`
} }
item := MessageStructType{ item := MessageStructType{
ID: m.ID, ID: m.ID,
@ -325,6 +326,7 @@ func (m *Message) MarshalJSON() ([]byte, error) {
DeletedForMe: m.DeletedForMe, DeletedForMe: m.DeletedForMe,
ContactRequestState: m.ContactRequestState, ContactRequestState: m.ContactRequestState,
ContactVerificationState: m.ContactVerificationState, ContactVerificationState: m.ContactVerificationState,
PaymentRequests: m.PaymentRequests,
} }
if sticker := m.GetSticker(); sticker != nil { if sticker := m.GetSticker(); sticker != nil {
@ -370,21 +372,22 @@ func (m *Message) UnmarshalJSON(data []byte) error {
type Alias Message type Alias Message
aux := struct { aux := struct {
*Alias *Alias
ResponseTo string `json:"responseTo"` ResponseTo string `json:"responseTo"`
EnsName string `json:"ensName"` EnsName string `json:"ensName"`
DisplayName string `json:"displayName"` DisplayName string `json:"displayName"`
ChatID string `json:"chatId"` ChatID string `json:"chatId"`
Sticker *protobuf.StickerMessage `json:"sticker"` Sticker *protobuf.StickerMessage `json:"sticker"`
AudioDurationMs uint64 `json:"audioDurationMs"` AudioDurationMs uint64 `json:"audioDurationMs"`
ParsedText json.RawMessage `json:"parsedText"` ParsedText json.RawMessage `json:"parsedText"`
ContentType protobuf.ChatMessage_ContentType `json:"contentType"` ContentType protobuf.ChatMessage_ContentType `json:"contentType"`
AlbumID string `json:"albumId"` AlbumID string `json:"albumId"`
ImageWidth uint32 `json:"imageWidth"` ImageWidth uint32 `json:"imageWidth"`
ImageHeight uint32 `json:"imageHeight"` ImageHeight uint32 `json:"imageHeight"`
AlbumImagesCount uint32 `json:"albumImagesCount"` AlbumImagesCount uint32 `json:"albumImagesCount"`
From string `json:"from"` From string `json:"from"`
Deleted bool `json:"deleted,omitempty"` PaymentRequestList []*protobuf.PaymentRequest `json:"paymentRequests"`
DeletedForMe bool `json:"deletedForMe,omitempty"` Deleted bool `json:"deleted,omitempty"`
DeletedForMe bool `json:"deletedForMe,omitempty"`
}{ }{
Alias: (*Alias)(m), Alias: (*Alias)(m),
} }
@ -410,6 +413,7 @@ func (m *Message) UnmarshalJSON(data []byte) error {
} }
} }
m.PaymentRequests = aux.PaymentRequestList
m.ResponseTo = aux.ResponseTo m.ResponseTo = aux.ResponseTo
m.EnsName = aux.EnsName m.EnsName = aux.EnsName
m.DisplayName = aux.DisplayName m.DisplayName = aux.DisplayName

View File

@ -640,25 +640,32 @@ func assertMarshalAndUnmarshalJSON[T any](t *testing.T, obj *T, msgAndArgs ...an
} }
func TestMarshalMessageJSON(t *testing.T) { func TestMarshalMessageJSON(t *testing.T) {
msg := &Message{ msg := NewMessage()
ID: "1", msg.ID = "1"
From: "0x04c51631b3354242d5a56f044c3b7703bcc001e8c725c4706928b3fac3c2a12ec9019e1e224d487f5c893389405bcec998bc687307f290a569d6a97d24b711bca8", msg.From = "0x04c51631b3354242d5a56f044c3b7703bcc001e8c725c4706928b3fac3c2a12ec9019e1e224d487f5c893389405bcec998bc687307f290a569d6a97d24b711bca8"
LinkPreviews: []LinkPreview{ msg.LinkPreviews = []LinkPreview{
{ {
Type: protobuf.UnfurledLink_LINK, Type: protobuf.UnfurledLink_LINK,
Description: "GitHub is where people build software.", Description: "GitHub is where people build software.",
Hostname: "github.com", Hostname: "github.com",
Title: "Build software better, together", Title: "Build software better, together",
URL: "https://github.com", URL: "https://github.com",
Thumbnail: LinkPreviewThumbnail{ Thumbnail: LinkPreviewThumbnail{
Width: 100, Width: 100,
Height: 200, Height: 200,
URL: "http://localhost:9999", URL: "http://localhost:9999",
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=", DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
}, },
}, },
} }
msg.PaymentRequests = []*protobuf.PaymentRequest{
{
Amount: "1000000000000000000",
Receiver: "0x7F47C2e98a4BBf5487E6fb082eC2D9Ab0E6d8882",
Symbol: "ETH",
ChainId: 1,
},
}
assertMarshalAndUnmarshalJSON(t, msg, "message ID='%s'", msg.ID) assertMarshalAndUnmarshalJSON(t, msg, "message ID='%s'", msg.ID)
} }

View File

@ -115,7 +115,8 @@ func (db sqlitePersistence) tableUserMessagesAllFields() string {
contact_verification_status, contact_verification_status,
mentioned, mentioned,
replied, replied,
discord_message_id` discord_message_id,
payment_requests`
} }
// keep the same order as in tableUserMessagesScanAllFields // keep the same order as in tableUserMessagesScanAllFields
@ -148,6 +149,7 @@ func (db sqlitePersistence) tableUserMessagesAllFieldsJoin() string {
m1.links, m1.links,
m1.unfurled_links, m1.unfurled_links,
m1.unfurled_status_links, m1.unfurled_status_links,
m1.payment_requests,
m1.command_id, m1.command_id,
m1.command_value, m1.command_value,
m1.command_from, m1.command_from,
@ -243,6 +245,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
var serializedLinks []byte var serializedLinks []byte
var serializedUnfurledLinks []byte var serializedUnfurledLinks []byte
var serializedUnfurledStatusLinks []byte var serializedUnfurledStatusLinks []byte
var serializedPaymentRequests []byte
var alias sql.NullString var alias sql.NullString
var identicon sql.NullString var identicon sql.NullString
var communityID sql.NullString var communityID sql.NullString
@ -303,6 +306,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
&serializedLinks, &serializedLinks,
&serializedUnfurledLinks, &serializedUnfurledLinks,
&serializedUnfurledStatusLinks, &serializedUnfurledStatusLinks,
&serializedPaymentRequests,
&command.ID, &command.ID,
&command.Value, &command.Value,
&command.From, &command.From,
@ -474,6 +478,13 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
message.UnfurledStatusLinks = &links message.UnfurledStatusLinks = &links
} }
if serializedPaymentRequests != nil {
err := json.Unmarshal(serializedPaymentRequests, &message.PaymentRequests)
if err != nil {
return err
}
}
if attachment.Id != "" { if attachment.Id != "" {
discordMessage.Attachments = append(discordMessage.Attachments, attachment) 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{}{ return []interface{}{
message.ID, message.ID,
message.WhisperTimestamp, message.WhisperTimestamp,
@ -638,6 +657,7 @@ func (db sqlitePersistence) tableUserMessagesAllValues(message *common.Message)
message.Mentioned, message.Mentioned,
message.Replied, message.Replied,
discordMessage.Id, discordMessage.Id,
serializedPaymentRequests,
}, nil }, nil
} }

View File

@ -0,0 +1 @@
ALTER TABLE user_messages ADD COLUMN payment_requests BLOB;

View File

@ -2128,3 +2128,45 @@ func TestGetCommunityMemberMessages(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Len(t, messages, 2) require.Len(t, messages, 2)
} }
func TestPaymentRequestMessages(t *testing.T) {
db, err := openTestDB()
require.NoError(t, err)
p := newSQLitePersistence(db)
chatID := testPublicChatID
var messages []*common.Message
message := common.Message{
ID: strconv.Itoa(1),
LocalChatID: chatID,
ChatMessage: &protobuf.ChatMessage{
Clock: uint64(1),
},
From: testPK,
}
message.PaymentRequests = []*protobuf.PaymentRequest{
{
Amount: "1.123",
Symbol: "ETH",
Receiver: "0x123",
ChainId: 1,
},
{
Amount: "1.124",
Symbol: "DAI",
Receiver: "0x124",
ChainId: 11,
},
}
messages = append(messages, &message)
err = p.SaveMessages(messages)
require.NoError(t, err)
m, _, err := p.MessageByChatID(testPublicChatID, "", 10)
require.NoError(t, err)
require.Len(t, m, 1)
require.Equal(t, m[0].PaymentRequests, message.PaymentRequests)
}

View File

@ -119,6 +119,13 @@ message BridgeMessage {
string parentMessageID = 7; string parentMessageID = 7;
} }
message PaymentRequest {
string receiver = 1;
string symbol = 2;
string amount = 3;
uint32 chainId = 4;
}
message UnfurledLinkThumbnail { message UnfurledLinkThumbnail {
bytes payload = 1; bytes payload = 1;
uint32 width = 2; uint32 width = 2;
@ -234,6 +241,8 @@ message ChatMessage {
uint32 customization_color = 19; uint32 customization_color = 19;
repeated PaymentRequest payment_requests = 20;
enum ContentType { enum ContentType {
UNKNOWN_CONTENT_TYPE = 0; UNKNOWN_CONTENT_TYPE = 0;
TEXT_PLAIN = 1; TEXT_PLAIN = 1;