feature: Unfurl status links (#4033)

This commit is contained in:
Igor Sirotin 2023-10-13 13:25:34 +01:00 committed by GitHub
parent ac813ef5d8
commit aded258ccb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 3854 additions and 1336 deletions

View File

@ -1 +1 @@
0.169.0
0.170.0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -86,7 +86,7 @@ func _1557732988_initialize_dbDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1557732988_initialize_db.down.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1557732988_initialize_db.down.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0x40, 0x78, 0xb7, 0x71, 0x3c, 0x20, 0x3b, 0xc9, 0xb, 0x2f, 0x49, 0xe4, 0xff, 0x1c, 0x84, 0x54, 0xa1, 0x30, 0xe3, 0x90, 0xf8, 0x73, 0xda, 0xb0, 0x2a, 0xea, 0x8e, 0xf1, 0x82, 0xe7, 0xd2}}
return a, nil
}
@ -106,7 +106,7 @@ func _1557732988_initialize_dbUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1557732988_initialize_db.up.sql", size: 278, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1557732988_initialize_db.up.sql", size: 278, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x85, 0x41, 0x7a, 0xba, 0x4f, 0xa3, 0x43, 0xc0, 0x63, 0xfa, 0x2c, 0xd1, 0xc5, 0xbb, 0x20, 0xa0, 0x64, 0xa8, 0x3b, 0x65, 0x82, 0xa2, 0x14, 0x28, 0x18, 0x7c, 0x8b, 0x3a, 0x7a, 0xfd, 0xe0}}
return a, nil
}
@ -126,7 +126,7 @@ func staticGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "static.go", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "static.go", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x8a, 0xf4, 0x27, 0x24, 0x9d, 0x2a, 0x1, 0x7b, 0x54, 0xea, 0xae, 0x4a, 0x35, 0x40, 0x92, 0xb5, 0xf9, 0xb3, 0x54, 0x3e, 0x3a, 0x1a, 0x2b, 0xae, 0xfb, 0x9e, 0x82, 0xeb, 0x4c, 0xf, 0x6}}
return a, nil
}

View File

@ -96,7 +96,7 @@ func _0001_accountsDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "0001_accounts.down.sql", size: 21, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "0001_accounts.down.sql", size: 21, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0x61, 0x4c, 0x18, 0xfc, 0xc, 0xdf, 0x5c, 0x1f, 0x5e, 0xd3, 0xbd, 0xfa, 0x12, 0x5e, 0x8d, 0x8d, 0x8b, 0xb9, 0x5f, 0x99, 0x46, 0x63, 0xa5, 0xe3, 0xa6, 0x8a, 0x4, 0xf1, 0x73, 0x8a, 0xe9}}
return a, nil
}
@ -116,7 +116,7 @@ func _0001_accountsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "0001_accounts.up.sql", size: 163, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "0001_accounts.up.sql", size: 163, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0xfa, 0x99, 0x8e, 0x96, 0xb3, 0x13, 0x6c, 0x1f, 0x6, 0x27, 0xc5, 0xd2, 0xd4, 0xe0, 0xa5, 0x26, 0x82, 0xa7, 0x26, 0xf2, 0x68, 0x9d, 0xed, 0x9c, 0x3d, 0xbb, 0xdc, 0x37, 0x28, 0xbc, 0x1}}
return a, nil
}
@ -136,7 +136,7 @@ func _1605007189_identity_imagesDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1605007189_identity_images.down.sql", size: 29, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1605007189_identity_images.down.sql", size: 29, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2f, 0xcf, 0xa7, 0xae, 0xd5, 0x4f, 0xcd, 0x14, 0x63, 0x9, 0xbe, 0x39, 0x49, 0x18, 0x96, 0xb2, 0xa3, 0x8, 0x7d, 0x41, 0xdb, 0x50, 0x5d, 0xf5, 0x4d, 0xa2, 0xd, 0x8f, 0x57, 0x79, 0x77, 0x67}}
return a, nil
}
@ -156,7 +156,7 @@ func _1605007189_identity_imagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1605007189_identity_images.up.sql", size: 268, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1605007189_identity_images.up.sql", size: 268, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x50, 0xb6, 0xc1, 0x5c, 0x76, 0x72, 0x6b, 0x22, 0x34, 0xdc, 0x96, 0xdc, 0x2b, 0xfd, 0x2d, 0xbe, 0xcc, 0x1e, 0xd4, 0x5, 0x93, 0xd, 0xc2, 0x51, 0xf3, 0x1a, 0xef, 0x2b, 0x26, 0xa4, 0xeb, 0x65}}
return a, nil
}
@ -176,7 +176,7 @@ func _1606224181_drop_photo_path_from_accountsDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1606224181_drop_photo_path_from_accounts.down.sql", size: 892, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1606224181_drop_photo_path_from_accounts.down.sql", size: 892, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x90, 0x24, 0x17, 0x7, 0x80, 0x93, 0x6f, 0x8d, 0x5d, 0xaa, 0x8c, 0x79, 0x15, 0x5d, 0xb3, 0x19, 0xd7, 0xd8, 0x39, 0xf9, 0x3a, 0x63, 0x8f, 0x81, 0x15, 0xb6, 0xd6, 0x9a, 0x37, 0xa8, 0x8e, 0x9b}}
return a, nil
}
@ -196,7 +196,7 @@ func _1606224181_drop_photo_path_from_accountsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1606224181_drop_photo_path_from_accounts.up.sql", size: 866, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1606224181_drop_photo_path_from_accounts.up.sql", size: 866, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xff, 0x4c, 0x97, 0xee, 0xef, 0x82, 0xb8, 0x6c, 0x71, 0xbb, 0x50, 0x7b, 0xe6, 0xd9, 0x22, 0x31, 0x7c, 0x1a, 0xfe, 0x91, 0x28, 0xf6, 0x6, 0x36, 0xe, 0xb1, 0xf1, 0xc8, 0x25, 0xac, 0x7e, 0xd6}}
return a, nil
}
@ -216,7 +216,7 @@ func _1648646095_image_clockDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1648646095_image_clock.down.sql", size: 939, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1648646095_image_clock.down.sql", size: 939, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0xa8, 0x1f, 0xf, 0xe0, 0xd7, 0xc9, 0x68, 0x98, 0xd8, 0x37, 0xb8, 0xba, 0x9e, 0xb2, 0x19, 0xf3, 0xc4, 0x73, 0x80, 0x3, 0x17, 0x2a, 0x53, 0x68, 0x10, 0x13, 0x54, 0x99, 0xb1, 0xf5, 0x1c}}
return a, nil
}
@ -236,7 +236,7 @@ func _1648646095_image_clockUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1648646095_image_clock.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1648646095_image_clock.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x98, 0xa6, 0xa4, 0x4e, 0x4e, 0xca, 0x17, 0x56, 0xea, 0xfb, 0xf0, 0xa9, 0x81, 0x95, 0xe, 0x80, 0x52, 0x1, 0x47, 0x9b, 0xde, 0x14, 0xfa, 0x72, 0xc9, 0x62, 0x6f, 0x24, 0xa2, 0xc, 0x32, 0x50}}
return a, nil
}
@ -256,7 +256,7 @@ func _1649317600_add_color_hashUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1649317600_add_color_hash.up.sql", size: 201, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1649317600_add_color_hash.up.sql", size: 201, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0xf, 0x37, 0x6d, 0xcf, 0x99, 0xc9, 0x2e, 0xdc, 0x70, 0x11, 0xb4, 0x36, 0x26, 0x4f, 0x39, 0xa8, 0x44, 0xf, 0xcb, 0xcc, 0x81, 0x74, 0x7a, 0x88, 0xaa, 0x54, 0x8c, 0xc4, 0xe, 0x56, 0x4f}}
return a, nil
}
@ -276,7 +276,7 @@ func _1660238799_accounts_kdfUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1660238799_accounts_kdf.up.sql", size: 115, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1660238799_accounts_kdf.up.sql", size: 115, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdf, 0xe6, 0x7a, 0x69, 0x25, 0x42, 0x3b, 0x9c, 0x20, 0xf5, 0xcb, 0xae, 0xb0, 0xb3, 0x1b, 0x66, 0xc2, 0x5d, 0xd0, 0xc1, 0x59, 0xe8, 0xa9, 0xc5, 0x69, 0x58, 0x8f, 0xae, 0xe6, 0xd1, 0x4c, 0x53}}
return a, nil
}
@ -296,7 +296,7 @@ func _1679505708_add_customization_colorUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1679505708_add_customization_color.up.sql", size: 78, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1679505708_add_customization_color.up.sql", size: 78, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0xe1, 0x3d, 0xaa, 0x5d, 0x35, 0x87, 0x8a, 0x8b, 0xe9, 0x4a, 0xa6, 0x7b, 0x85, 0xbc, 0x33, 0x11, 0xc7, 0x7d, 0x61, 0xac, 0x65, 0x59, 0xda, 0x32, 0x59, 0x68, 0x9d, 0xa1, 0x10, 0x7b, 0xa9}}
return a, nil
}
@ -316,7 +316,7 @@ func _1687853321_add_customization_color_updated_atUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1687853321_add_customization_color_updated_at.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1687853321_add_customization_color_updated_at.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0xc2, 0x9, 0xec, 0xf4, 0xd1, 0x46, 0x29, 0xc5, 0xce, 0x4d, 0xd4, 0xf, 0x9c, 0xfa, 0x62, 0x1, 0x29, 0xe6, 0xd2, 0xd5, 0xe, 0xf0, 0x27, 0x81, 0x4a, 0x82, 0x25, 0x5f, 0x67, 0xff, 0xd1}}
return a, nil
}
@ -336,7 +336,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x7c, 0x28, 0xcd, 0x47, 0xf2, 0xfa, 0x7c, 0x51, 0x2d, 0xd8, 0x38, 0xb, 0xb0, 0x34, 0x9d, 0x4c, 0x62, 0xa, 0x9e, 0x28, 0xc3, 0x31, 0x23, 0xd9, 0xbb, 0x89, 0x9f, 0xa0, 0x89, 0x1f, 0xe8}}
return a, nil
}

View File

@ -86,7 +86,7 @@ func _1619446565_postgres_make_anon_metrics_tableDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1619446565_postgres_make_anon_metrics_table.down.sql", size: 24, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1619446565_postgres_make_anon_metrics_table.down.sql", size: 24, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x75, 0xea, 0x1, 0x74, 0xe6, 0xa3, 0x11, 0xd0, 0x86, 0x87, 0x7e, 0x31, 0xb4, 0x1a, 0x27, 0x5d, 0xda, 0x77, 0xa3, 0xf5, 0x1d, 0x88, 0x79, 0xcf, 0xd5, 0x95, 0x75, 0xd, 0x47, 0xa1, 0x90, 0x5}}
return a, nil
}
@ -106,7 +106,7 @@ func _1619446565_postgres_make_anon_metrics_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1619446565_postgres_make_anon_metrics_table.up.sql", size: 443, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1619446565_postgres_make_anon_metrics_table.up.sql", size: 443, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0xdc, 0x72, 0x28, 0x3c, 0xf6, 0x94, 0xb0, 0x47, 0x3d, 0xca, 0x55, 0x3d, 0xf7, 0x83, 0xb8, 0x7d, 0x2f, 0x1e, 0x98, 0xb7, 0xde, 0xa, 0xff, 0xa0, 0x52, 0x60, 0x83, 0x56, 0xc5, 0xd1, 0xa2}}
return a, nil
}
@ -126,7 +126,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 380, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "doc.go", size: 380, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x1, 0xd4, 0xd6, 0xc7, 0x44, 0xd4, 0xfd, 0x7b, 0x69, 0x1f, 0xe3, 0xe, 0x48, 0x14, 0x99, 0xf0, 0x8e, 0x43, 0xae, 0x54, 0x64, 0xa2, 0x8b, 0x82, 0x1c, 0x2b, 0xb, 0xec, 0xf5, 0xb3, 0xfc}}
return a, nil
}

View File

@ -0,0 +1,28 @@
package common
type MediaServerImageIDPrefix string
type MediaServerImageIDPostfix string
type MediaServerImageID string
func CreateImageID(prefix MediaServerImageIDPrefix, postfix MediaServerImageIDPostfix) MediaServerImageID {
return MediaServerImageID(string(prefix) + string(postfix))
}
const (
MediaServerIconPostfix MediaServerImageIDPostfix = "icon"
MediaServerBannerPostfix MediaServerImageIDPostfix = "banner"
)
const (
MediaServerContactPrefix MediaServerImageIDPrefix = "contact-"
MediaServerCommunityPrefix MediaServerImageIDPrefix = "community-"
MediaServerChannelCommunityPrefix MediaServerImageIDPrefix = "community-channel-"
)
const (
MediaServerContactIcon = MediaServerImageID(string(MediaServerContactPrefix) + string(MediaServerIconPostfix))
MediaServerCommunityIcon = MediaServerImageID(string(MediaServerCommunityPrefix) + string(MediaServerIconPostfix))
MediaServerCommunityBanner = MediaServerImageID(string(MediaServerCommunityPrefix) + string(MediaServerBannerPostfix))
MediaServerChannelCommunityIcon = MediaServerImageID(string(MediaServerChannelCommunityPrefix) + string(MediaServerIconPostfix))
MediaServerChannelCommunityBanner = MediaServerImageID(string(MediaServerChannelCommunityPrefix) + string(MediaServerBannerPostfix))
)

View File

@ -8,7 +8,6 @@ import (
"errors"
"fmt"
"io/ioutil"
"net/url"
"os"
"strings"
"unicode"
@ -82,26 +81,6 @@ const (
ContactVerificationStateCanceled
)
type LinkPreviewThumbnail struct {
Width int `json:"width"`
Height int `json:"height"`
// Non-empty when the thumbnail is available via the media server, i.e. after
// the chat message is sent.
URL string `json:"url,omitempty"`
// Non-empty when the thumbnail payload needs to be shared with the client,
// but before it has been persisted.
DataURI string `json:"dataUri,omitempty"`
}
type LinkPreview struct {
Type protobuf.UnfurledLink_LinkType `json:"type"`
URL string `json:"url"`
Hostname string `json:"hostname"`
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
Thumbnail LinkPreviewThumbnail `json:"thumbnail,omitempty"`
}
const EveryoneMentionTag = "0x00001"
type CommandParameters struct {
@ -219,8 +198,9 @@ type Message struct {
Replied bool `json:"replied"`
// Links is an array of links within given message
Links []string
LinkPreviews []LinkPreview `json:"linkPreviews"`
Links []string
LinkPreviews []LinkPreview `json:"linkPreviews"`
StatusLinkPreviews []StatusLinkPreview `json:"statusLinkPreviews"`
// EditedAt indicates the clock value it was edited
EditedAt uint64 `json:"editedAt"`
@ -292,6 +272,7 @@ func (m *Message) MarshalJSON() ([]byte, error) {
Replied bool `json:"replied,omitempty"`
Links []string `json:"links,omitempty"`
LinkPreviews []LinkPreview `json:"linkPreviews,omitempty"`
StatusLinkPreviews []StatusLinkPreview `json:"statusLinkPreviews,omitempty"`
EditedAt uint64 `json:"editedAt,omitempty"`
Deleted bool `json:"deleted,omitempty"`
DeletedBy string `json:"deletedBy,omitempty"`
@ -331,6 +312,7 @@ func (m *Message) MarshalJSON() ([]byte, error) {
Replied: m.Replied,
Links: m.Links,
LinkPreviews: m.LinkPreviews,
StatusLinkPreviews: m.StatusLinkPreviews,
MessageType: m.MessageType,
CommandParameters: m.CommandParameters,
GapParameters: m.GapParameters,
@ -763,98 +745,6 @@ func (m *Message) LoadImage() error {
return nil
}
func isValidLinkPreviewThumbnail(thumbnail LinkPreviewThumbnail) bool {
return (thumbnail.DataURI == "" && thumbnail.Width == 0 && thumbnail.Height == 0) ||
(thumbnail.DataURI != "" && thumbnail.Width > 0 && thumbnail.Height > 0)
}
func isValidLinkPreviewForProto(preview LinkPreview) bool {
switch preview.Type {
case protobuf.UnfurledLink_IMAGE:
return preview.URL != "" && isValidLinkPreviewThumbnail(preview.Thumbnail)
default: // Validate as a link type by default.
return preview.Title != "" && preview.URL != "" && isValidLinkPreviewThumbnail(preview.Thumbnail)
}
}
// ConvertLinkPreviewsToProto expects previews to be correctly sent by the
// client because we can't attempt to re-unfurl URLs at this point (it's
// actually undesirable). We run a basic validation as an additional safety net.
func (m *Message) ConvertLinkPreviewsToProto() ([]*protobuf.UnfurledLink, error) {
if len(m.LinkPreviews) == 0 {
return nil, nil
}
unfurledLinks := make([]*protobuf.UnfurledLink, 0, len(m.LinkPreviews))
for _, preview := range m.LinkPreviews {
// Do not process subsequent previews because we do expect all previews to
// be valid at this stage.
if !isValidLinkPreviewForProto(preview) {
return nil, fmt.Errorf("invalid link preview, url='%s'", preview.URL)
}
var payload []byte
var err error
if preview.Thumbnail.DataURI != "" {
payload, err = images.GetPayloadFromURI(preview.Thumbnail.DataURI)
if err != nil {
return nil, fmt.Errorf("could not get data URI payload, url='%s': %w", preview.URL, err)
}
}
ul := &protobuf.UnfurledLink{
Type: preview.Type,
Url: preview.URL,
Title: preview.Title,
Description: preview.Description,
ThumbnailWidth: uint32(preview.Thumbnail.Width),
ThumbnailHeight: uint32(preview.Thumbnail.Height),
ThumbnailPayload: payload,
}
unfurledLinks = append(unfurledLinks, ul)
}
return unfurledLinks, nil
}
func (m *Message) ConvertFromProtoToLinkPreviews(makeMediaServerURL func(msgID string, previewURL string) string) []LinkPreview {
var links []*protobuf.UnfurledLink
if links = m.GetUnfurledLinks(); links == nil {
return nil
}
previews := make([]LinkPreview, 0, len(links))
for _, link := range links {
parsedURL, err := url.Parse(link.Url)
var hostname string
// URL parsing in Go can fail with URLs that weren't correctly URL encoded.
// This shouldn't happen in general, but if an error happens we just reuse
// the full URL.
if err != nil {
hostname = link.Url
} else {
hostname = parsedURL.Hostname()
}
lp := LinkPreview{
Description: link.Description,
Hostname: hostname,
Title: link.Title,
Type: link.Type,
URL: link.Url,
}
if payload := link.GetThumbnailPayload(); payload != nil {
lp.Thumbnail.Width = int(link.ThumbnailWidth)
lp.Thumbnail.Height = int(link.ThumbnailHeight)
lp.Thumbnail.URL = makeMediaServerURL(m.ID, link.Url)
}
previews = append(previews, lp)
}
return previews
}
func (m *Message) SetAlbumIDAndImagesCount(albumID string, imagesCount uint32) error {
imageMessage := m.GetImage()
if imageMessage == nil {

View File

@ -0,0 +1,470 @@
package common
import (
"fmt"
"net/url"
"github.com/status-im/status-go/images"
"github.com/status-im/status-go/protocol/protobuf"
)
type MakeMediaServerURLType func(msgID string, previewURL string, imageID MediaServerImageID) string
type MakeMediaServerURLMessageWrapperType func(previewURL string, imageID MediaServerImageID) string
type LinkPreviewThumbnail struct {
Width int `json:"width"`
Height int `json:"height"`
// Non-empty when the thumbnail is available via the media server, i.e. after
// the chat message is sent.
URL string `json:"url,omitempty"`
// Non-empty when the thumbnail payload needs to be shared with the client,
// but before it has been persisted.
DataURI string `json:"dataUri,omitempty"`
}
type LinkPreview struct {
Type protobuf.UnfurledLink_LinkType `json:"type"`
URL string `json:"url"`
Hostname string `json:"hostname"`
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
Thumbnail LinkPreviewThumbnail `json:"thumbnail,omitempty"`
}
type StatusContactLinkPreview struct {
PublicKey string `json:"publicKey"`
DisplayName string `json:"displayName"`
Description string `json:"description"`
Icon LinkPreviewThumbnail `json:"icon,omitempty"`
}
type StatusCommunityLinkPreview struct {
CommunityID string `json:"communityId"`
DisplayName string `json:"displayName"`
Description string `json:"description"`
MembersCount uint32 `json:"membersCount"`
Color string `json:"color"`
Icon LinkPreviewThumbnail `json:"icon,omitempty"`
Banner LinkPreviewThumbnail `json:"banner,omitempty"`
}
type StatusCommunityChannelLinkPreview struct {
ChannelUUID string `json:"channelUuid"`
Emoji string `json:"emoji"`
DisplayName string `json:"displayName"`
Description string `json:"description"`
Color string `json:"color"`
Community *StatusCommunityLinkPreview `json:"community"`
}
type StatusLinkPreview struct {
URL string `json:"url,omitempty"`
Contact *StatusContactLinkPreview `json:"contact,omitempty"`
Community *StatusCommunityLinkPreview `json:"community,omitempty"`
Channel *StatusCommunityChannelLinkPreview `json:"channel,omitempty"`
}
func (thumbnail *LinkPreviewThumbnail) IsEmpty() bool {
return thumbnail.Width == 0 &&
thumbnail.Height == 0 &&
thumbnail.URL == "" &&
thumbnail.DataURI == ""
}
func (thumbnail *LinkPreviewThumbnail) clear() {
thumbnail.Width = 0
thumbnail.Height = 0
thumbnail.URL = ""
thumbnail.DataURI = ""
}
func (thumbnail *LinkPreviewThumbnail) validateForProto() error {
if thumbnail.DataURI == "" {
if thumbnail.Width == 0 && thumbnail.Height == 0 {
return nil
}
return fmt.Errorf("dataUri is empty, but width/height are not zero")
}
if thumbnail.Width == 0 || thumbnail.Height == 0 {
return fmt.Errorf("dataUri is not empty, but width/heigth are zero")
}
return nil
}
func (thumbnail *LinkPreviewThumbnail) convertToProto() (*protobuf.UnfurledLinkThumbnail, error) {
var payload []byte
var err error
if thumbnail.DataURI != "" {
payload, err = images.GetPayloadFromURI(thumbnail.DataURI)
if err != nil {
return nil, fmt.Errorf("could not get data URI payload, url='%s': %w", thumbnail.URL, err)
}
}
return &protobuf.UnfurledLinkThumbnail{
Width: uint32(thumbnail.Width),
Height: uint32(thumbnail.Height),
Payload: payload,
}, nil
}
func (thumbnail *LinkPreviewThumbnail) loadFromProto(
input *protobuf.UnfurledLinkThumbnail,
URL string,
imageID MediaServerImageID,
makeMediaServerURL MakeMediaServerURLMessageWrapperType) {
thumbnail.clear()
thumbnail.Width = int(input.Width)
thumbnail.Height = int(input.Height)
if len(input.Payload) > 0 {
thumbnail.URL = makeMediaServerURL(URL, imageID)
}
}
func (preview *LinkPreview) validateForProto() error {
switch preview.Type {
case protobuf.UnfurledLink_IMAGE:
if preview.URL == "" {
return fmt.Errorf("empty url")
}
if err := preview.Thumbnail.validateForProto(); err != nil {
return fmt.Errorf("thumbnail is not valid for proto: %w", err)
}
return nil
default: // Validate as a link type by default.
if preview.Title == "" {
return fmt.Errorf("title is empty")
}
if preview.URL == "" {
return fmt.Errorf("url is empty")
}
if err := preview.Thumbnail.validateForProto(); err != nil {
return fmt.Errorf("thumbnail is not valid for proto: %w", err)
}
return nil
}
}
func (preview *StatusLinkPreview) validateForProto() error {
if preview.URL == "" {
return fmt.Errorf("url can't be empty")
}
// At least and only one of Contact/Community/Channel should be present in the preview
if preview.Contact != nil && preview.Community != nil {
return fmt.Errorf("both contact and community are set at the same time")
}
if preview.Community != nil && preview.Channel != nil {
return fmt.Errorf("both community and channel are set at the same time")
}
if preview.Channel != nil && preview.Contact != nil {
return fmt.Errorf("both contact and channel are set at the same time")
}
if preview.Contact == nil && preview.Community == nil && preview.Channel == nil {
return fmt.Errorf("none of contact/community/channel are set")
}
if preview.Contact != nil {
if preview.Contact.PublicKey == "" {
return fmt.Errorf("contact publicKey is empty")
}
if err := preview.Contact.Icon.validateForProto(); err != nil {
return fmt.Errorf("contact icon invalid: %w", err)
}
return nil
}
if preview.Community != nil {
return preview.Community.validateForProto()
}
if preview.Channel != nil {
if preview.Channel.ChannelUUID == "" {
return fmt.Errorf("channelUuid is empty")
}
if preview.Channel.Community == nil {
return fmt.Errorf("channel community is nil")
}
if err := preview.Channel.Community.validateForProto(); err != nil {
return fmt.Errorf("channel community is not valid: %w", err)
}
return nil
}
return nil
}
func (preview *StatusCommunityLinkPreview) validateForProto() error {
if preview == nil {
return fmt.Errorf("community preview is empty")
}
if preview.CommunityID == "" {
return fmt.Errorf("communityId is empty")
}
if err := preview.Icon.validateForProto(); err != nil {
return fmt.Errorf("community icon is invalid: %w", err)
}
if err := preview.Banner.validateForProto(); err != nil {
return fmt.Errorf("community banner is invalid: %w", err)
}
return nil
}
func (preview *StatusCommunityLinkPreview) convertToProto() (*protobuf.UnfurledStatusCommunityLink, error) {
if preview == nil {
return nil, nil
}
icon, err := preview.Icon.convertToProto()
if err != nil {
return nil, err
}
banner, err := preview.Banner.convertToProto()
if err != nil {
return nil, err
}
community := &protobuf.UnfurledStatusCommunityLink{
CommunityId: []byte(preview.CommunityID),
DisplayName: preview.DisplayName,
Description: preview.Description,
MembersCount: preview.MembersCount,
Color: preview.Color,
Icon: icon,
Banner: banner,
}
return community, nil
}
func (preview *StatusCommunityLinkPreview) loadFromProto(c *protobuf.UnfurledStatusCommunityLink,
URL string, thumbnailPrefix MediaServerImageIDPrefix,
makeMediaServerURL MakeMediaServerURLMessageWrapperType) {
preview.CommunityID = string(c.CommunityId)
preview.DisplayName = c.DisplayName
preview.Description = c.Description
preview.MembersCount = c.MembersCount
preview.Color = c.Color
preview.Icon.clear()
preview.Banner.clear()
if icon := c.GetIcon(); icon != nil {
preview.Icon.loadFromProto(icon, URL, CreateImageID(thumbnailPrefix, MediaServerIconPostfix), makeMediaServerURL)
}
if banner := c.GetBanner(); banner != nil {
preview.Banner.loadFromProto(banner, URL, CreateImageID(thumbnailPrefix, MediaServerBannerPostfix), makeMediaServerURL)
}
}
// ConvertLinkPreviewsToProto expects previews to be correctly sent by the
// client because we can't attempt to re-unfurl URLs at this point (it's
// actually undesirable). We run a basic validation as an additional safety net.
func (m *Message) ConvertLinkPreviewsToProto() ([]*protobuf.UnfurledLink, error) {
if len(m.LinkPreviews) == 0 {
return nil, nil
}
unfurledLinks := make([]*protobuf.UnfurledLink, 0, len(m.LinkPreviews))
for _, preview := range m.LinkPreviews {
// Do not process subsequent previews because we do expect all previews to
// be valid at this stage.
if err := preview.validateForProto(); err != nil {
return nil, fmt.Errorf("invalid link preview, url='%s': %w", preview.URL, err)
}
var payload []byte
var err error
if preview.Thumbnail.DataURI != "" {
payload, err = images.GetPayloadFromURI(preview.Thumbnail.DataURI)
if err != nil {
return nil, fmt.Errorf("could not get data URI payload, url='%s': %w", preview.URL, err)
}
}
ul := &protobuf.UnfurledLink{
Type: preview.Type,
Url: preview.URL,
Title: preview.Title,
Description: preview.Description,
ThumbnailWidth: uint32(preview.Thumbnail.Width),
ThumbnailHeight: uint32(preview.Thumbnail.Height),
ThumbnailPayload: payload,
}
unfurledLinks = append(unfurledLinks, ul)
}
return unfurledLinks, nil
}
func (m *Message) ConvertFromProtoToLinkPreviews(makeMediaServerURL func(msgID string, previewURL string) string) []LinkPreview {
var links []*protobuf.UnfurledLink
if links = m.GetUnfurledLinks(); links == nil {
return nil
}
previews := make([]LinkPreview, 0, len(links))
for _, link := range links {
parsedURL, err := url.Parse(link.Url)
var hostname string
// URL parsing in Go can fail with URLs that weren't correctly URL encoded.
// This shouldn't happen in general, but if an error happens we just reuse
// the full URL.
if err != nil {
hostname = link.Url
} else {
hostname = parsedURL.Hostname()
}
lp := LinkPreview{
Description: link.Description,
Hostname: hostname,
Title: link.Title,
Type: link.Type,
URL: link.Url,
}
mediaURL := ""
if len(link.ThumbnailPayload) > 0 {
mediaURL = makeMediaServerURL(m.ID, link.Url)
}
if link.GetThumbnailPayload() != nil {
lp.Thumbnail.Width = int(link.ThumbnailWidth)
lp.Thumbnail.Height = int(link.ThumbnailHeight)
lp.Thumbnail.URL = mediaURL
}
previews = append(previews, lp)
}
return previews
}
func (m *Message) ConvertStatusLinkPreviewsToProto() (*protobuf.UnfurledStatusLinks, error) {
if len(m.StatusLinkPreviews) == 0 {
return nil, nil
}
unfurledLinks := make([]*protobuf.UnfurledStatusLink, 0, len(m.StatusLinkPreviews))
for _, preview := range m.StatusLinkPreviews {
// We expect all previews to be valid at this stage
if err := preview.validateForProto(); err != nil {
return nil, fmt.Errorf("invalid status link preview, url='%s': %w", preview.URL, err)
}
ul := &protobuf.UnfurledStatusLink{
Url: preview.URL,
}
if preview.Contact != nil {
icon, err := preview.Contact.Icon.convertToProto()
if err != nil {
return nil, err
}
ul.Payload = &protobuf.UnfurledStatusLink_Contact{
Contact: &protobuf.UnfurledStatusContactLink{
PublicKey: []byte(preview.Contact.PublicKey),
DisplayName: preview.Contact.DisplayName,
Description: preview.Contact.Description,
Icon: icon,
},
}
}
if preview.Community != nil {
communityPreview, err := preview.Community.convertToProto()
if err != nil {
return nil, err
}
ul.Payload = &protobuf.UnfurledStatusLink_Community{
Community: communityPreview,
}
}
if preview.Channel != nil {
communityPreview, err := preview.Channel.Community.convertToProto()
if err != nil {
return nil, err
}
ul.Payload = &protobuf.UnfurledStatusLink_Channel{
Channel: &protobuf.UnfurledStatusChannelLink{
ChannelUuid: []byte(preview.Channel.ChannelUUID),
Emoji: preview.Channel.Emoji,
DisplayName: preview.Channel.DisplayName,
Description: preview.Channel.Description,
Color: preview.Channel.Color,
Community: communityPreview,
},
}
}
unfurledLinks = append(unfurledLinks, ul)
}
return &protobuf.UnfurledStatusLinks{UnfurledStatusLinks: unfurledLinks}, nil
}
func (m *Message) ConvertFromProtoToStatusLinkPreviews(makeMediaServerURL func(msgID string, previewURL string, imageID MediaServerImageID) string) []StatusLinkPreview {
if m.GetUnfurledStatusLinks() == nil {
return nil
}
links := m.UnfurledStatusLinks.GetUnfurledStatusLinks()
if links == nil {
return nil
}
// This wrapper adds the messageID to the callback
makeMediaServerURLMessageWrapper := func(previewURL string, imageID MediaServerImageID) string {
return makeMediaServerURL(m.ID, previewURL, imageID)
}
previews := make([]StatusLinkPreview, 0, len(links))
for _, link := range links {
lp := StatusLinkPreview{
URL: link.Url,
}
if c := link.GetContact(); c != nil {
lp.Contact = &StatusContactLinkPreview{
PublicKey: string(c.PublicKey),
DisplayName: c.DisplayName,
Description: c.Description,
}
if icon := c.GetIcon(); icon != nil {
lp.Contact.Icon.loadFromProto(icon, link.Url, MediaServerContactIcon, makeMediaServerURLMessageWrapper)
}
}
if c := link.GetCommunity(); c != nil {
lp.Community = new(StatusCommunityLinkPreview)
lp.Community.loadFromProto(c, link.Url, MediaServerCommunityPrefix, makeMediaServerURLMessageWrapper)
}
if c := link.GetChannel(); c != nil {
lp.Channel = &StatusCommunityChannelLinkPreview{
ChannelUUID: string(c.ChannelUuid),
Emoji: c.Emoji,
DisplayName: c.DisplayName,
Description: c.Description,
Color: c.Color,
}
if c.Community != nil {
lp.Channel.Community = new(StatusCommunityLinkPreview)
lp.Channel.Community.loadFromProto(c.Community, link.Url, MediaServerChannelCommunityPrefix, makeMediaServerURLMessageWrapper)
}
}
previews = append(previews, lp)
}
return previews
}

View File

@ -193,12 +193,16 @@ func TestConvertLinkPreviewsToProto(t *testing.T) {
}
func TestConvertFromProtoToLinkPreviews(t *testing.T) {
thumbnailPayload, err := base64.StdEncoding.DecodeString("iVBORw0KGgoAAAANSUg=")
require.NoError(t, err)
l := &protobuf.UnfurledLink{
Description: "GitHub is where people build software.",
Title: "Build software better, together",
Type: protobuf.UnfurledLink_LINK,
Url: "https://github.com",
ThumbnailPayload: []byte(""),
ThumbnailPayload: thumbnailPayload,
ThumbnailWidth: 100,
ThumbnailHeight: 200,
}
@ -250,6 +254,335 @@ func TestConvertFromProtoToLinkPreviews(t *testing.T) {
require.Equal(t, "", p.Thumbnail.URL)
}
func TestConvertStatusLinkPreviewsToProto(t *testing.T) {
contact := &StatusContactLinkPreview{
PublicKey: "PublicKey_1",
DisplayName: "DisplayName_2",
Description: "Description_3",
Icon: LinkPreviewThumbnail{
Width: 10,
Height: 20,
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
}
community := &StatusCommunityLinkPreview{
CommunityID: "CommunityID_4",
DisplayName: "DisplayName_5",
Description: "Description_6",
MembersCount: 7,
Color: "Color_8",
Icon: LinkPreviewThumbnail{
Width: 30,
Height: 40,
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
Banner: LinkPreviewThumbnail{
Width: 50,
Height: 60,
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
}
channel := &StatusCommunityChannelLinkPreview{
ChannelUUID: "ChannelUUID_11",
Emoji: "Emoji_12",
DisplayName: "DisplayName_13",
Description: "Description_14",
Color: "Color_15",
Community: &StatusCommunityLinkPreview{
CommunityID: "CommunityID_16",
DisplayName: "DisplayName_17",
Description: "Description_18",
MembersCount: 19,
Color: "Color_20",
Icon: LinkPreviewThumbnail{
Width: 70,
Height: 80,
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
Banner: LinkPreviewThumbnail{
Width: 90,
Height: 100,
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
},
}
message := Message{
StatusLinkPreviews: []StatusLinkPreview{
{
URL: "https://status.app/u/",
Contact: contact,
},
{
URL: "https://status.app/c/",
Community: community,
},
{
URL: "https://status.app/cc/",
Channel: channel,
},
},
}
expectedThumbnailPayload, err := base64.StdEncoding.DecodeString("iVBORw0KGgoAAAANSUg=")
require.NoError(t, err)
unfurledLinks, err := message.ConvertStatusLinkPreviewsToProto()
require.NoError(t, err)
require.Len(t, unfurledLinks.UnfurledStatusLinks, 3)
// Contact link
l1 := unfurledLinks.UnfurledStatusLinks[0]
require.Equal(t, "https://status.app/u/", l1.Url)
require.NotNil(t, l1.GetContact())
require.Nil(t, l1.GetCommunity())
require.Nil(t, l1.GetChannel())
c1 := l1.GetContact()
require.Equal(t, contact.PublicKey, string(c1.PublicKey))
require.Equal(t, contact.DisplayName, c1.DisplayName)
require.Equal(t, contact.Description, c1.Description)
require.NotNil(t, c1.Icon)
require.Equal(t, uint32(contact.Icon.Width), c1.Icon.Width)
require.Equal(t, uint32(contact.Icon.Height), c1.Icon.Height)
require.Equal(t, expectedThumbnailPayload, c1.Icon.Payload)
// Community link
l2 := unfurledLinks.UnfurledStatusLinks[1]
require.Equal(t, "https://status.app/c/", l2.Url)
require.NotNil(t, l2.GetCommunity())
require.Nil(t, l2.GetContact())
require.Nil(t, l2.GetChannel())
c2 := l2.GetCommunity()
require.Equal(t, community.CommunityID, string(c2.CommunityId))
require.Equal(t, community.DisplayName, c2.DisplayName)
require.Equal(t, community.Description, c2.Description)
require.Equal(t, community.MembersCount, c2.MembersCount)
require.Equal(t, community.Color, c2.Color)
require.NotNil(t, c2.Icon)
require.Equal(t, uint32(community.Icon.Width), c2.Icon.Width)
require.Equal(t, uint32(community.Icon.Height), c2.Icon.Height)
require.Equal(t, expectedThumbnailPayload, c2.Icon.Payload)
require.NotNil(t, c2.Banner)
require.Equal(t, uint32(community.Banner.Width), c2.Banner.Width)
require.Equal(t, uint32(community.Banner.Height), c2.Banner.Height)
require.Equal(t, expectedThumbnailPayload, c2.Banner.Payload)
// Channel link
l3 := unfurledLinks.UnfurledStatusLinks[2]
require.Equal(t, "https://status.app/cc/", l3.Url)
require.NotNil(t, l3.GetChannel())
require.Nil(t, l3.GetContact())
require.Nil(t, l3.GetCommunity())
c3 := l3.GetChannel()
require.Equal(t, channel.ChannelUUID, string(c3.ChannelUuid))
require.Equal(t, channel.Emoji, c3.Emoji)
require.Equal(t, channel.DisplayName, c3.DisplayName)
require.Equal(t, channel.Description, c3.Description)
require.Equal(t, channel.Color, c3.Color)
require.NotNil(t, c3.Community)
require.Equal(t, channel.Community.CommunityID, string(c3.Community.CommunityId))
require.Equal(t, channel.Community.DisplayName, c3.Community.DisplayName)
require.Equal(t, channel.Community.Color, c3.Community.Color)
require.Equal(t, channel.Community.Description, c3.Community.Description)
require.Equal(t, channel.Community.MembersCount, c3.Community.MembersCount)
require.NotNil(t, c3.Community.Icon)
require.Equal(t, uint32(channel.Community.Icon.Width), c3.Community.Icon.Width)
require.Equal(t, uint32(channel.Community.Icon.Height), c3.Community.Icon.Height)
require.Equal(t, expectedThumbnailPayload, c3.Community.Icon.Payload)
require.NotNil(t, c3.Community.Banner)
require.Equal(t, uint32(channel.Community.Banner.Width), c3.Community.Banner.Width)
require.Equal(t, uint32(channel.Community.Banner.Height), c3.Community.Banner.Height)
require.Equal(t, expectedThumbnailPayload, c3.Community.Banner.Payload)
// Test any invalid link preview causes an early return.
invalidContactPreview := contact
invalidContactPreview.PublicKey = ""
invalidPreview := message.StatusLinkPreviews[0]
invalidPreview.Contact = invalidContactPreview
message.StatusLinkPreviews = []StatusLinkPreview{invalidPreview}
_, err = message.ConvertStatusLinkPreviewsToProto()
require.ErrorContains(t, err, "invalid status link preview, url='https://status.app/u/'")
}
func TestConvertFromProtoToStatusLinkPreviews(t *testing.T) {
thumbnailPayload, err := base64.StdEncoding.DecodeString("iVBORw0KGgoAAAANSUg=")
require.NoError(t, err)
contact := &protobuf.UnfurledStatusContactLink{
PublicKey: []byte("PublicKey_1"),
DisplayName: "DisplayName_2",
Description: "Description_3",
Icon: &protobuf.UnfurledLinkThumbnail{
Width: 10,
Height: 20,
Payload: thumbnailPayload,
},
}
community := &protobuf.UnfurledStatusCommunityLink{
CommunityId: []byte("CommunityId_4"),
DisplayName: "DisplayName_5",
Description: "Description_6",
MembersCount: 7,
Color: "Color_8",
Icon: &protobuf.UnfurledLinkThumbnail{
Width: 30,
Height: 40,
Payload: thumbnailPayload,
},
Banner: &protobuf.UnfurledLinkThumbnail{
Width: 50,
Height: 60,
Payload: thumbnailPayload,
},
}
channel := &protobuf.UnfurledStatusChannelLink{
ChannelUuid: []byte("ChannelUuid_11"),
Emoji: "Emoji_12",
DisplayName: "DisplayName_13",
Description: "Description_14",
Color: "Color_15",
Community: &protobuf.UnfurledStatusCommunityLink{
CommunityId: []byte("CommunityId_16"),
DisplayName: "DisplayName_17",
Description: "Description_18",
MembersCount: 19,
Color: "Color_20",
Icon: &protobuf.UnfurledLinkThumbnail{
Width: 70,
Height: 80,
Payload: thumbnailPayload,
},
Banner: &protobuf.UnfurledLinkThumbnail{
Width: 90,
Height: 100,
Payload: thumbnailPayload,
},
},
}
msg := Message{
ID: "42",
ChatMessage: &protobuf.ChatMessage{
UnfurledStatusLinks: &protobuf.UnfurledStatusLinks{
UnfurledStatusLinks: []*protobuf.UnfurledStatusLink{
{
Url: "https://status.app/u/",
Payload: &protobuf.UnfurledStatusLink_Contact{
Contact: contact,
},
},
{
Url: "https://status.app/c/",
Payload: &protobuf.UnfurledStatusLink_Community{
Community: community,
},
},
{
Url: "https://status.app/cc/",
Payload: &protobuf.UnfurledStatusLink_Channel{
Channel: channel,
},
},
},
},
},
}
urlMaker := func(msgID string, linkURL string, imageID MediaServerImageID) string {
return "https://localhost:6666/" + msgID + "-" + linkURL + "-" + string(imageID)
}
previews := msg.ConvertFromProtoToStatusLinkPreviews(urlMaker)
require.Len(t, previews, 3)
// Contact preview
p1 := previews[0]
require.Equal(t, "https://status.app/u/", p1.URL)
require.NotNil(t, p1.Contact)
require.Nil(t, p1.Community)
require.Nil(t, p1.Channel)
c1 := p1.Contact
require.NotNil(t, c1)
require.Equal(t, contact.PublicKey, []byte(c1.PublicKey))
require.Equal(t, contact.DisplayName, c1.DisplayName)
require.Equal(t, contact.Description, c1.Description)
require.NotNil(t, c1.Icon)
require.Equal(t, int(contact.Icon.Width), c1.Icon.Width)
require.Equal(t, int(contact.Icon.Height), c1.Icon.Height)
require.Equal(t, "", c1.Icon.DataURI)
require.Equal(t, "https://localhost:6666/42-https://status.app/u/-contact-icon", c1.Icon.URL)
// Community preview
p2 := previews[1]
require.Equal(t, "https://status.app/c/", p2.URL)
require.NotNil(t, p2.Community)
require.Nil(t, p2.Contact)
require.Nil(t, p2.Channel)
c2 := p2.Community
require.Equal(t, community.CommunityId, []byte(c2.CommunityID))
require.Equal(t, community.DisplayName, c2.DisplayName)
require.Equal(t, community.Description, c2.Description)
require.Equal(t, community.MembersCount, c2.MembersCount)
require.Equal(t, community.Color, c2.Color)
require.NotNil(t, c2.Icon)
require.Equal(t, int(community.Icon.Width), c2.Icon.Width)
require.Equal(t, int(community.Icon.Height), c2.Icon.Height)
require.Equal(t, "", c2.Icon.DataURI)
require.Equal(t, "https://localhost:6666/42-https://status.app/c/-community-icon", c2.Icon.URL)
require.NotNil(t, c2.Banner)
require.Equal(t, int(community.Banner.Width), c2.Banner.Width)
require.Equal(t, int(community.Banner.Height), c2.Banner.Height)
require.Equal(t, "", c2.Banner.DataURI)
require.Equal(t, "https://localhost:6666/42-https://status.app/c/-community-banner", c2.Banner.URL)
// Channel preview
p3 := previews[2]
require.Equal(t, "https://status.app/cc/", p3.URL)
require.NotNil(t, p3.Channel)
require.Nil(t, p3.Contact)
require.Nil(t, p3.Community)
c3 := previews[2].Channel
require.Equal(t, channel.ChannelUuid, []byte(c3.ChannelUUID))
require.Equal(t, channel.Emoji, c3.Emoji)
require.Equal(t, channel.DisplayName, c3.DisplayName)
require.Equal(t, channel.Description, c3.Description)
require.Equal(t, channel.Color, c3.Color)
require.NotNil(t, p3.Channel.Community)
require.Equal(t, channel.Community.CommunityId, []byte(c3.Community.CommunityID))
require.Equal(t, channel.Community.DisplayName, c3.Community.DisplayName)
require.Equal(t, channel.Community.Color, c3.Community.Color)
require.Equal(t, channel.Community.Description, c3.Community.Description)
require.Equal(t, channel.Community.MembersCount, c3.Community.MembersCount)
require.NotNil(t, c3.Community.Icon)
require.Equal(t, int(channel.Community.Icon.Width), c3.Community.Icon.Width)
require.Equal(t, int(channel.Community.Icon.Height), c3.Community.Icon.Height)
require.Equal(t, "", c3.Community.Icon.DataURI)
require.Equal(t, "https://localhost:6666/42-https://status.app/cc/-community-channel-icon", c3.Community.Icon.URL)
require.NotNil(t, c3.Community.Banner)
require.Equal(t, int(channel.Community.Banner.Width), c3.Community.Banner.Width)
require.Equal(t, int(channel.Community.Banner.Height), c3.Community.Banner.Height)
require.Equal(t, "", c3.Community.Banner.DataURI)
require.Equal(t, "https://localhost:6666/42-https://status.app/cc/-community-channel-banner", c3.Community.Banner.URL)
}
func assertMarshalAndUnmarshalJSON[T any](t *testing.T, obj *T, msgAndArgs ...any) {
rawJSON, err := json.Marshal(obj)
require.NoError(t, err, msgAndArgs...)

View File

@ -103,7 +103,7 @@ func _1536754952_initial_schemaDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1536754952_initial_schema.down.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1536754952_initial_schema.down.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x44, 0xcf, 0x76, 0x71, 0x1f, 0x5e, 0x9a, 0x43, 0xd8, 0xcd, 0xb8, 0xc3, 0x70, 0xc3, 0x7f, 0xfc, 0x90, 0xb4, 0x25, 0x1e, 0xf4, 0x66, 0x20, 0xb8, 0x33, 0x7e, 0xb0, 0x76, 0x1f, 0xc, 0xc0, 0x75}}
return a, nil
}
@ -123,7 +123,7 @@ func _1536754952_initial_schemaUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1536754952_initial_schema.up.sql", size: 962, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1536754952_initial_schema.up.sql", size: 962, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x90, 0x5a, 0x59, 0x3e, 0x3, 0xe2, 0x3c, 0x81, 0x42, 0xcd, 0x4c, 0x9a, 0xe8, 0xda, 0x93, 0x2b, 0x70, 0xa4, 0xd5, 0x29, 0x3e, 0xd5, 0xc9, 0x27, 0xb6, 0xb7, 0x65, 0xff, 0x0, 0xcb, 0xde}}
return a, nil
}
@ -143,7 +143,7 @@ func _1539249977_update_ratchet_infoDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1539249977_update_ratchet_info.down.sql", size: 311, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1539249977_update_ratchet_info.down.sql", size: 311, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1, 0xa4, 0xeb, 0xa0, 0xe6, 0xa0, 0xd4, 0x48, 0xbb, 0xad, 0x6f, 0x7d, 0x67, 0x8c, 0xbd, 0x25, 0xde, 0x1f, 0x73, 0x9a, 0xbb, 0xa8, 0xc9, 0x30, 0xb7, 0xa9, 0x7c, 0xaf, 0xb5, 0x1, 0x61, 0xdd}}
return a, nil
}
@ -163,7 +163,7 @@ func _1539249977_update_ratchet_infoUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1539249977_update_ratchet_info.up.sql", size: 368, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1539249977_update_ratchet_info.up.sql", size: 368, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0x8e, 0xbf, 0x6f, 0xa, 0xc0, 0xe1, 0x3c, 0x42, 0x28, 0x88, 0x1d, 0xdb, 0xba, 0x1c, 0x83, 0xec, 0xba, 0xd3, 0x5f, 0x5c, 0x77, 0x5e, 0xa7, 0x46, 0x36, 0xec, 0x69, 0xa, 0x4b, 0x17, 0x79}}
return a, nil
}
@ -183,7 +183,7 @@ func _1540715431_add_versionDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1540715431_add_version.down.sql", size: 127, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1540715431_add_version.down.sql", size: 127, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x9, 0x4, 0xe3, 0x76, 0x2e, 0xb8, 0x9, 0x23, 0xf0, 0x70, 0x93, 0xc4, 0x50, 0xe, 0x9d, 0x84, 0x22, 0x8c, 0x94, 0xd3, 0x24, 0x9, 0x9a, 0xc1, 0xa1, 0x48, 0x45, 0xfd, 0x40, 0x6e, 0xe6}}
return a, nil
}
@ -203,7 +203,7 @@ func _1540715431_add_versionUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1540715431_add_version.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1540715431_add_version.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc7, 0x4c, 0x36, 0x96, 0xdf, 0x16, 0x10, 0xa6, 0x27, 0x1a, 0x79, 0x8b, 0x42, 0x83, 0x23, 0xc, 0x7e, 0xb6, 0x3d, 0x2, 0xda, 0xa4, 0xb4, 0xd, 0x27, 0x55, 0xba, 0xdc, 0xb2, 0x88, 0x8f, 0xa6}}
return a, nil
}
@ -223,7 +223,7 @@ func _1541164797_add_installationsDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1541164797_add_installations.down.sql", size: 26, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1541164797_add_installations.down.sql", size: 26, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0xfd, 0xe6, 0xd8, 0xca, 0x3b, 0x38, 0x18, 0xee, 0x0, 0x5f, 0x36, 0x9e, 0x1e, 0xd, 0x19, 0x3e, 0xb4, 0x73, 0x53, 0xe9, 0xa5, 0xac, 0xdd, 0xa1, 0x2f, 0xc7, 0x6c, 0xa8, 0xd9, 0xa, 0x88}}
return a, nil
}
@ -243,7 +243,7 @@ func _1541164797_add_installationsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1541164797_add_installations.up.sql", size: 216, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1541164797_add_installations.up.sql", size: 216, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2d, 0x18, 0x26, 0xb8, 0x88, 0x47, 0xdb, 0x83, 0xcc, 0xb6, 0x9d, 0x1c, 0x1, 0xae, 0x2f, 0xde, 0x97, 0x82, 0x3, 0x30, 0xa8, 0x63, 0xa1, 0x78, 0x4b, 0xa5, 0x9, 0x8, 0x75, 0xa2, 0x57, 0x81}}
return a, nil
}
@ -263,7 +263,7 @@ func _1558084410_add_secretDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1558084410_add_secret.down.sql", size: 56, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1558084410_add_secret.down.sql", size: 56, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0xb, 0x65, 0xdf, 0x59, 0xbf, 0xe9, 0x5, 0x5b, 0x6f, 0xd5, 0x3a, 0xb7, 0x57, 0xe8, 0x78, 0x38, 0x73, 0x53, 0x57, 0xf7, 0x24, 0x4, 0xe4, 0xa2, 0x49, 0x22, 0xa2, 0xc6, 0xfd, 0x80, 0xa4}}
return a, nil
}
@ -283,7 +283,7 @@ func _1558084410_add_secretUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1558084410_add_secret.up.sql", size: 301, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1558084410_add_secret.up.sql", size: 301, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x32, 0x36, 0x8e, 0x47, 0xb0, 0x8f, 0xc1, 0xc6, 0xf7, 0xc6, 0x9f, 0x2d, 0x44, 0x75, 0x2b, 0x26, 0xec, 0x6, 0xa0, 0x7b, 0xa5, 0xbd, 0xc8, 0x76, 0x8a, 0x82, 0x68, 0x2, 0x42, 0xb5, 0xf4}}
return a, nil
}
@ -303,7 +303,7 @@ func _1558588866_add_versionDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1558588866_add_version.down.sql", size: 47, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1558588866_add_version.down.sql", size: 47, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x52, 0x34, 0x3c, 0x46, 0x4a, 0xf0, 0x72, 0x47, 0x6f, 0x49, 0x5c, 0xc7, 0xf9, 0x32, 0xce, 0xc4, 0x3d, 0xfd, 0x61, 0xa1, 0x8b, 0x8f, 0xf2, 0x31, 0x34, 0xde, 0x15, 0x49, 0xa6, 0xde, 0xb9}}
return a, nil
}
@ -323,7 +323,7 @@ func _1558588866_add_versionUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1558588866_add_version.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1558588866_add_version.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2a, 0xea, 0x64, 0x39, 0x61, 0x20, 0x83, 0x83, 0xb, 0x2e, 0x79, 0x64, 0xb, 0x53, 0xfa, 0xfe, 0xc6, 0xf7, 0x67, 0x42, 0xd3, 0x4f, 0xdc, 0x7e, 0x30, 0x32, 0xe8, 0x14, 0x41, 0xe9, 0xe7, 0x3b}}
return a, nil
}
@ -343,7 +343,7 @@ func _1559627659_add_contact_codeDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1559627659_add_contact_code.down.sql", size: 32, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1559627659_add_contact_code.down.sql", size: 32, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5d, 0x64, 0x6d, 0xce, 0x24, 0x42, 0x20, 0x8d, 0x4f, 0x37, 0xaa, 0x9d, 0xc, 0x57, 0x98, 0xc1, 0xd1, 0x1a, 0x34, 0xcd, 0x9f, 0x8f, 0x34, 0x86, 0xb3, 0xd3, 0xdc, 0xf1, 0x7d, 0xe5, 0x1b, 0x6e}}
return a, nil
}
@ -363,7 +363,7 @@ func _1559627659_add_contact_codeUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1559627659_add_contact_code.up.sql", size: 198, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1559627659_add_contact_code.up.sql", size: 198, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x16, 0xf6, 0xc2, 0x62, 0x9c, 0xd2, 0xc9, 0x1e, 0xd8, 0xea, 0xaa, 0xea, 0x95, 0x8f, 0x89, 0x6a, 0x85, 0x5d, 0x9d, 0x99, 0x78, 0x3c, 0x90, 0x66, 0x99, 0x3e, 0x4b, 0x19, 0x62, 0xfb, 0x31, 0x4d}}
return a, nil
}
@ -383,7 +383,7 @@ func _1561368210_add_installation_metadataDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1561368210_add_installation_metadata.down.sql", size: 35, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1561368210_add_installation_metadata.down.sql", size: 35, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0xde, 0x3f, 0xd2, 0x4a, 0x50, 0x98, 0x56, 0xe3, 0xc0, 0xcd, 0x9d, 0xb0, 0x34, 0x3b, 0xe5, 0x62, 0x18, 0xb5, 0x20, 0xc9, 0x3e, 0xdc, 0x6a, 0x40, 0x36, 0x66, 0xea, 0x51, 0x8c, 0x71, 0xf5}}
return a, nil
}
@ -403,7 +403,7 @@ func _1561368210_add_installation_metadataUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1561368210_add_installation_metadata.up.sql", size: 267, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1561368210_add_installation_metadata.up.sql", size: 267, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb4, 0x71, 0x8f, 0x29, 0xb1, 0xaa, 0xd6, 0xd1, 0x8c, 0x17, 0xef, 0x6c, 0xd5, 0x80, 0xb8, 0x2c, 0xc3, 0xfe, 0xec, 0x24, 0x4d, 0xc8, 0x25, 0xd3, 0xb4, 0xcd, 0xa9, 0xac, 0x63, 0x61, 0xb2, 0x9c}}
return a, nil
}
@ -423,7 +423,7 @@ func _1632236298_add_communitiesDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1632236298_add_communities.down.sql", size: 151, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1632236298_add_communities.down.sql", size: 151, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x26, 0xe5, 0x47, 0xd1, 0xe5, 0xec, 0x5b, 0x3e, 0xdc, 0x22, 0xf4, 0x27, 0xee, 0x70, 0xf3, 0x9, 0x4f, 0xd2, 0x9f, 0x92, 0xf, 0x5a, 0x18, 0x11, 0xb7, 0x40, 0xab, 0xf1, 0x98, 0x72, 0xd6, 0x60}}
return a, nil
}
@ -443,7 +443,7 @@ func _1632236298_add_communitiesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1632236298_add_communities.up.sql", size: 584, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1632236298_add_communities.up.sql", size: 584, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0xe0, 0x1, 0x6e, 0x84, 0xc, 0x35, 0xe4, 0x5a, 0xf, 0xbe, 0xcb, 0xf7, 0xd2, 0xa8, 0x25, 0xf5, 0xdb, 0x7, 0xcb, 0xa3, 0xe6, 0xf4, 0xc4, 0x1b, 0xa5, 0xec, 0x32, 0x1e, 0x1e, 0x48, 0x60}}
return a, nil
}
@ -463,7 +463,7 @@ func _1636536507_add_index_bundlesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1636536507_add_index_bundles.up.sql", size: 347, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1636536507_add_index_bundles.up.sql", size: 347, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf1, 0xb9, 0x3c, 0x16, 0xfc, 0xfb, 0xb2, 0xb4, 0x3b, 0xfe, 0xdc, 0xf5, 0x9c, 0x42, 0xa0, 0xa0, 0xd4, 0xd, 0x5b, 0x97, 0x10, 0x80, 0x95, 0xe, 0x13, 0xc1, 0x18, 0x8, 0xee, 0xf, 0x99, 0xee}}
return a, nil
}
@ -483,7 +483,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 377, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "doc.go", size: 377, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xef, 0xaf, 0xdf, 0xcf, 0x65, 0xae, 0x19, 0xfc, 0x9d, 0x29, 0xc1, 0x91, 0xaf, 0xb5, 0xd5, 0xb1, 0x56, 0xf3, 0xee, 0xa8, 0xba, 0x13, 0x65, 0xdb, 0xab, 0xcf, 0x4e, 0xac, 0x92, 0xe9, 0x60, 0xf1}}
return a, nil
}

View File

@ -1,4 +1,4 @@
package unfurlers
package protocol
import (
"context"
@ -34,11 +34,11 @@ const (
type Headers map[string]string
type Unfurler interface {
Unfurl() (common.LinkPreview, error)
Unfurl() (*common.LinkPreview, error)
}
func newDefaultLinkPreview(url *neturl.URL) common.LinkPreview {
return common.LinkPreview{
func newDefaultLinkPreview(url *neturl.URL) *common.LinkPreview {
return &common.LinkPreview{
URL: url.String(),
Hostname: url.Hostname(),
}

View File

@ -1,4 +1,4 @@
package unfurlers
package protocol
import (
"bytes"
@ -76,7 +76,7 @@ func isSupportedImage(payload []byte) bool {
return images.IsJpeg(payload) || images.IsPng(payload) || images.IsWebp(payload)
}
func (u *ImageUnfurler) Unfurl() (common.LinkPreview, error) {
func (u *ImageUnfurler) Unfurl() (*common.LinkPreview, error) {
preview := newDefaultLinkPreview(u.url)
preview.Type = protobuf.UnfurledLink_IMAGE

View File

@ -1,4 +1,4 @@
package unfurlers
package protocol
import (
"encoding/json"
@ -56,7 +56,7 @@ func (u *OEmbedUnfurler) newOEmbedURL() (*neturl.URL, error) {
return oembedURL, nil
}
func (u OEmbedUnfurler) Unfurl() (common.LinkPreview, error) {
func (u OEmbedUnfurler) Unfurl() (*common.LinkPreview, error) {
preview := newDefaultLinkPreview(u.url)
preview.Type = protobuf.UnfurledLink_LINK

View File

@ -1,4 +1,4 @@
package unfurlers
package protocol
import (
"bytes"
@ -38,7 +38,7 @@ func NewOpenGraphUnfurler(URL *neturl.URL, logger *zap.Logger, httpClient *http.
}
}
func (u *OpenGraphUnfurler) Unfurl() (common.LinkPreview, error) {
func (u *OpenGraphUnfurler) Unfurl() (*common.LinkPreview, error) {
preview := newDefaultLinkPreview(u.url)
preview.Type = protobuf.UnfurledLink_LINK

View File

@ -0,0 +1,186 @@
package protocol
import (
"fmt"
"go.uber.org/zap"
"github.com/status-im/status-go/api/multiformat"
"github.com/status-im/status-go/images"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/communities"
)
type StatusUnfurler struct {
m *Messenger
logger *zap.Logger
url string
}
func NewStatusUnfurler(URL string, messenger *Messenger, logger *zap.Logger) *StatusUnfurler {
return &StatusUnfurler{
m: messenger,
logger: logger,
url: URL,
}
}
func updateThumbnail(image *images.IdentityImage, thumbnail *common.LinkPreviewThumbnail) error {
if image.IsEmpty() {
return nil
}
var err error
thumbnail.Width, thumbnail.Height, err = images.GetImageDimensions(image.Payload)
if err != nil {
return fmt.Errorf("failed to get image dimensions: %w", err)
}
thumbnail.DataURI, err = image.GetDataURI()
if err != nil {
return fmt.Errorf("failed to get data uri: %w", err)
}
return nil
}
func (u *StatusUnfurler) buildContactData(publicKey string) (*common.StatusContactLinkPreview, error) {
contactID, err := multiformat.DeserializeCompressedKey(publicKey)
if err != nil {
return nil, err
}
contact := u.m.GetContactByID(contactID)
// If no contact found locally, fetch it from waku
if contact == nil {
if contact, err = u.m.RequestContactInfoFromMailserver(contactID, true); err != nil {
return nil, fmt.Errorf("failed to request contact info from mailserver for public key '%s': %w", publicKey, err)
}
}
c := new(common.StatusContactLinkPreview)
c.PublicKey = publicKey
c.DisplayName = contact.DisplayName
c.Description = contact.Bio
if image, ok := contact.Images[images.SmallDimName]; ok {
if err = updateThumbnail(&image, &c.Icon); err != nil {
return nil, fmt.Errorf("failed to set thumbnail: %w", err)
}
}
return c, nil
}
func (u *StatusUnfurler) fillCommunityImages(community *communities.Community, icon *common.LinkPreviewThumbnail, banner *common.LinkPreviewThumbnail) error {
if image, ok := community.Images()[images.SmallDimName]; ok {
if err := updateThumbnail(&images.IdentityImage{Payload: image.Payload}, icon); err != nil {
u.logger.Warn("unfurling status link: failed to set community thumbnail", zap.Error(err))
}
}
if image, ok := community.Images()[images.BannerIdentityName]; ok {
if err := updateThumbnail(&images.IdentityImage{Payload: image.Payload}, banner); err != nil {
u.logger.Warn("unfurling status link: failed to set community banner", zap.Error(err))
}
}
return nil
}
func (u *StatusUnfurler) buildCommunityData(communityID string) (*communities.Community, *common.StatusCommunityLinkPreview, error) {
// This automatically checks the database
community, err := u.m.RequestCommunityInfoFromMailserver(communityID, nil, true)
if err != nil {
return nil, nil, fmt.Errorf("failed to get community info for communityID '%s': %w", communityID, err)
}
if community == nil {
return community, nil, fmt.Errorf("community info fetched, but it is empty")
}
c := &common.StatusCommunityLinkPreview{
CommunityID: community.IDString(),
DisplayName: community.Name(),
Description: community.DescriptionText(),
MembersCount: uint32(community.MembersCount()),
Color: community.Color(),
}
err = u.fillCommunityImages(community, &c.Icon, &c.Banner)
if err != nil {
return community, c, err
}
return community, c, nil
}
func (u *StatusUnfurler) buildChannelData(channelUUID string, communityID string) (*common.StatusCommunityChannelLinkPreview, error) {
community, communityData, err := u.buildCommunityData(communityID)
if err != nil {
return nil, fmt.Errorf("failed to build channel community data: %w", err)
}
channel, ok := community.Chats()[channelUUID]
if !ok {
return nil, fmt.Errorf("channel with channelID '%s' not found in community '%s'", channelUUID, communityID)
}
return &common.StatusCommunityChannelLinkPreview{
ChannelUUID: channelUUID,
Emoji: channel.Identity.Emoji,
DisplayName: channel.Identity.DisplayName,
Description: channel.Identity.Description,
Color: channel.Identity.Color,
Community: communityData,
}, nil
}
func (u *StatusUnfurler) Unfurl() (*common.StatusLinkPreview, error) {
preview := new(common.StatusLinkPreview)
preview.URL = u.url
resp, err := u.m.ParseSharedURL(u.url)
if err != nil {
return nil, fmt.Errorf("failed to parse shared url: %w", err)
}
// If a URL has been successfully parsed,
// any further errors should not be returned, only logged.
if resp.Contact != nil {
preview.Contact, err = u.buildContactData(resp.Contact.PublicKey)
if err != nil {
return nil, fmt.Errorf("error when building contact data: %w", err)
}
return preview, nil
}
// NOTE: Currently channel data comes together with community data,
// both `Community` and `Channel` fields will be present.
// So we check for Channel first, then Community.
if resp.Channel != nil {
if resp.Community == nil {
return preview, fmt.Errorf("channel community can't be empty")
}
preview.Channel, err = u.buildChannelData(resp.Channel.ChannelUUID, resp.Community.CommunityID)
if err != nil {
return nil, fmt.Errorf("error when building channel data: %w", err)
}
return preview, nil
}
if resp.Community != nil {
_, preview.Community, err = u.buildCommunityData(resp.Community.CommunityID)
if err != nil {
return nil, fmt.Errorf("error when building community data: %w", err)
}
return preview, nil
}
return nil, fmt.Errorf("shared url does not contain contact, community or channel data")
}

View File

@ -8,6 +8,7 @@ import (
"sort"
"strings"
"github.com/golang/protobuf/proto"
"github.com/lib/pq"
"github.com/status-im/status-go/protocol/common"
@ -83,6 +84,7 @@ func (db sqlitePersistence) tableUserMessagesAllFields() string {
mentions,
links,
unfurled_links,
unfurled_status_links,
command_id,
command_value,
command_from,
@ -136,6 +138,7 @@ func (db sqlitePersistence) tableUserMessagesAllFieldsJoin() string {
m1.mentions,
m1.links,
m1.unfurled_links,
m1.unfurled_status_links,
m1.command_id,
m1.command_value,
m1.command_from,
@ -215,6 +218,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
var serializedMentions []byte
var serializedLinks []byte
var serializedUnfurledLinks []byte
var serializedUnfurledStatusLinks []byte
var alias sql.NullString
var identicon sql.NullString
var communityID sql.NullString
@ -271,6 +275,7 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
&serializedMentions,
&serializedLinks,
&serializedUnfurledLinks,
&serializedUnfurledStatusLinks,
&command.ID,
&command.Value,
&command.From,
@ -414,6 +419,16 @@ func (db sqlitePersistence) tableUserMessagesScanAllFields(row scanner, message
}
}
if serializedUnfurledStatusLinks != nil {
// use proto.Marshal, because json.Marshal doesn't support `oneof` fields
var links protobuf.UnfurledStatusLinks
err = proto.Unmarshal(serializedUnfurledStatusLinks, &links)
if err != nil {
return err
}
message.UnfurledStatusLinks = &links
}
if attachment.Id != "" {
discordMessage.Attachments = append(discordMessage.Attachments, attachment)
}
@ -502,6 +517,15 @@ func (db sqlitePersistence) tableUserMessagesAllValues(message *common.Message)
}
}
var serializedUnfurledStatusLinks []byte
if links := message.GetUnfurledStatusLinks(); links != nil {
// use proto.Marshal, because json.Marshal doesn't support `oneof` fields
serializedUnfurledStatusLinks, err = proto.Marshal(links)
if err != nil {
return nil, err
}
}
return []interface{}{
message.ID,
message.WhisperTimestamp,
@ -534,6 +558,7 @@ func (db sqlitePersistence) tableUserMessagesAllValues(message *common.Message)
serializedMentions,
serializedLinks,
serializedUnfurledLinks,
serializedUnfurledStatusLinks,
command.ID,
command.Value,
command.From,
@ -2465,12 +2490,12 @@ func (db sqlitePersistence) SaveEdit(editMessage *EditMessage) error {
return nil
}
_, err := db.db.Exec(`INSERT INTO user_messages_edits (clock, chat_id, message_id, text, source, id, unfurled_links) VALUES(?,?,?,?,?,?,?)`, editMessage.Clock, editMessage.ChatId, editMessage.MessageId, editMessage.Text, editMessage.From, editMessage.ID, pq.Array(editMessage.UnfurledLinks))
_, err := db.db.Exec(`INSERT INTO user_messages_edits (clock, chat_id, message_id, text, source, id, unfurled_links, unfurled_status_links) VALUES(?,?,?,?,?,?,?,?)`, editMessage.Clock, editMessage.ChatId, editMessage.MessageId, editMessage.Text, editMessage.From, editMessage.ID, pq.Array(editMessage.UnfurledLinks), editMessage.UnfurledStatusLinks)
return err
}
func (db sqlitePersistence) GetEdits(messageID string, from string) ([]*EditMessage, error) {
rows, err := db.db.Query(`SELECT clock, chat_id, message_id, source, text, id, unfurled_links FROM user_messages_edits WHERE message_id = ? AND source = ? ORDER BY CLOCK DESC`, messageID, from)
rows, err := db.db.Query(`SELECT clock, chat_id, message_id, source, text, id, unfurled_links, unfurled_status_links FROM user_messages_edits WHERE message_id = ? AND source = ? ORDER BY CLOCK DESC`, messageID, from)
if err != nil {
return nil, err
}
@ -2479,7 +2504,7 @@ func (db sqlitePersistence) GetEdits(messageID string, from string) ([]*EditMess
var messages []*EditMessage
for rows.Next() {
e := NewEditMessage()
err := rows.Scan(&e.Clock, &e.ChatId, &e.MessageId, &e.From, &e.Text, &e.ID, pq.Array(&e.UnfurledLinks))
err := rows.Scan(&e.Clock, &e.ChatId, &e.MessageId, &e.From, &e.Text, &e.ID, pq.Array(&e.UnfurledLinks), &e.UnfurledStatusLinks)
if err != nil {
return nil, err
}

View File

@ -2299,6 +2299,13 @@ func (m *Messenger) sendChatMessage(ctx context.Context, message *common.Message
message.UnfurledLinks = unfurledLinks
}
unfurledStatusLinks, err := message.ConvertStatusLinkPreviewsToProto()
if err != nil {
m.logger.Error("failed to convert status link previews", zap.Error(err))
} else {
message.UnfurledStatusLinks = unfurledStatusLinks
}
var response MessengerResponse
// A valid added chat is required.
@ -4057,6 +4064,7 @@ func (m *Messenger) prepareMessage(msg *common.Message, s *server.MediaServer) {
}
msg.LinkPreviews = msg.ConvertFromProtoToLinkPreviews(s.MakeLinkPreviewThumbnailURL)
msg.StatusLinkPreviews = msg.ConvertFromProtoToStatusLinkPreviews(s.MakeStatusLinkPreviewThumbnailURL)
}
func (m *Messenger) AllMessageByChatIDWhichMatchTerm(chatID string, searchTerm string, caseSensitive bool) ([]*common.Message, error) {

View File

@ -498,13 +498,30 @@ func (s *MessengerEditMessageSuite) TestEditMessageWithLinkPreviews() {
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
}},
},
StatusLinkPreviews: []common.StatusLinkPreview{
{
URL: "https://status.app/u/TestUrl",
Contact: &common.StatusContactLinkPreview{
PublicKey: "TestPublicKey",
DisplayName: "TestDisplayName",
Description: "Test description",
Icon: common.LinkPreviewThumbnail{
Width: 100,
Height: 200,
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
},
},
},
}
sendResponse, err = theirMessenger.EditMessage(context.Background(), editedMessage)
s.Require().NoError(err)
s.Require().Len(sendResponse.Messages(), 1)
s.Require().NotEmpty(sendResponse.Messages()[0].LinkPreviews)
s.Require().Len(sendResponse.Messages()[0].LinkPreviews, 1)
s.Require().NotNil(sendResponse.Messages()[0].UnfurledStatusLinks)
s.Require().Len(sendResponse.Messages()[0].UnfurledStatusLinks.UnfurledStatusLinks, 1)
response, err = WaitOnMessengerResponse(
s.m,
func(r *MessengerResponse) bool { return len(r.messages) == 1 },
@ -514,7 +531,11 @@ func (s *MessengerEditMessageSuite) TestEditMessageWithLinkPreviews() {
s.Require().Len(response.Chats(), 1)
s.Require().Len(response.Messages(), 1)
s.Require().NotEmpty(response.Messages()[0].EditedAt)
s.Require().NotEmpty(response.Messages()[0].UnfurledLinks)
s.Require().False(response.Messages()[0].New)
responseMessage := response.Messages()[0]
s.Require().NotEmpty(responseMessage.EditedAt)
s.Require().Len(responseMessage.UnfurledLinks, 1)
s.Require().NotNil(responseMessage.UnfurledStatusLinks)
s.Require().Len(responseMessage.UnfurledStatusLinks.UnfurledStatusLinks, 1)
s.Require().False(responseMessage.New)
}

View File

@ -14,11 +14,11 @@ import (
"github.com/status-im/markdown"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/linkpreview/unfurlers"
)
type LinkPreview struct {
common.LinkPreview
type UnfurlURLsResponse struct {
LinkPreviews []*common.LinkPreview `json:"linkPreviews,omitempty"`
StatusLinkPreviews []*common.StatusLinkPreview `json:"statusLinkPreviews,omitempty"`
}
func normalizeHostname(hostname string) string {
@ -27,9 +27,10 @@ func normalizeHostname(hostname string) string {
return re.ReplaceAllString(hostname, "$1")
}
func (m *Messenger) newURLUnfurler(httpClient *http.Client, url *neturl.URL) unfurlers.Unfurler {
if unfurlers.IsSupportedImageURL(url) {
return unfurlers.NewImageUnfurler(
func (m *Messenger) newURLUnfurler(httpClient *http.Client, url *neturl.URL) Unfurler {
if IsSupportedImageURL(url) {
return NewImageUnfurler(
url,
m.logger,
httpClient)
@ -37,21 +38,21 @@ func (m *Messenger) newURLUnfurler(httpClient *http.Client, url *neturl.URL) unf
switch normalizeHostname(url.Hostname()) {
case "reddit.com":
return unfurlers.NewOEmbedUnfurler(
return NewOEmbedUnfurler(
"https://www.reddit.com/oembed",
url,
m.logger,
httpClient)
default:
return unfurlers.NewOpenGraphUnfurler(
return NewOpenGraphUnfurler(
url,
m.logger,
httpClient)
}
}
func (m *Messenger) unfurlURL(httpClient *http.Client, url string) (common.LinkPreview, error) {
var preview common.LinkPreview
func (m *Messenger) unfurlURL(httpClient *http.Client, url string) (*common.LinkPreview, error) {
preview := new(common.LinkPreview)
parsedURL, err := neturl.Parse(url)
if err != nil {
@ -127,27 +128,42 @@ func GetURLs(text string) []string {
}
func NewDefaultHTTPClient() *http.Client {
return &http.Client{Timeout: unfurlers.DefaultRequestTimeout}
return &http.Client{Timeout: DefaultRequestTimeout}
}
// UnfurlURLs assumes clients pass URLs verbatim that were validated and
// processed by GetURLs.
func (m *Messenger) UnfurlURLs(httpClient *http.Client, urls []string) ([]common.LinkPreview, error) {
func (m *Messenger) UnfurlURLs(httpClient *http.Client, urls []string) (UnfurlURLsResponse, error) {
if httpClient == nil {
httpClient = NewDefaultHTTPClient()
}
previews := make([]common.LinkPreview, 0, len(urls))
r := UnfurlURLsResponse{
LinkPreviews: make([]*common.LinkPreview, 0, len(urls)),
StatusLinkPreviews: make([]*common.StatusLinkPreview, 0, len(urls)),
}
for _, url := range urls {
m.logger.Debug("unfurling", zap.String("url", url))
p, err := m.unfurlURL(httpClient, url)
if err != nil {
m.logger.Info("failed to unfurl", zap.String("url", url), zap.Error(err))
if m.IsStatusSharedURL(url) {
unfurler := NewStatusUnfurler(url, m, m.logger)
preview, err := unfurler.Unfurl()
if err != nil {
m.logger.Warn("failed to unfurl status link", zap.String("url", url), zap.Error(err))
continue
}
r.StatusLinkPreviews = append(r.StatusLinkPreviews, preview)
continue
}
previews = append(previews, p)
p, err := m.unfurlURL(httpClient, url)
if err != nil {
m.logger.Warn("failed to unfurl", zap.String("url", url), zap.Error(err))
continue
}
r.LinkPreviews = append(r.LinkPreviews, p)
}
return previews, nil
return r, nil
}

View File

@ -13,9 +13,11 @@ import (
"github.com/stretchr/testify/suite"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/images"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/linkpreview/unfurlers"
"github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/requests"
)
func TestMessengerLinkPreviews(t *testing.T) {
@ -26,21 +28,6 @@ type MessengerLinkPreviewsTestSuite struct {
MessengerBaseTestSuite
}
//func (s *MessengerLinkPreviewsTestSuite) SetupTest() {
// s.logger = tt.MustCreateTestLogger()
//
// c := waku.DefaultConfig
// c.MinimumAcceptedPoW = 0
// shh := waku.New(&c, s.logger)
// s.shh = gethbridge.NewGethWakuWrapper(shh)
// s.Require().NoError(shh.Start())
//
// s.m = s.newMessenger()
// s.privateKey = s.m.identity
// _, err := s.m.Start()
// s.Require().NoError(err)
//}
// StubMatcher should either return an http.Response or nil in case the request
// doesn't match.
type StubMatcher func(req *http.Request) *http.Response
@ -229,10 +216,11 @@ func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_YouTube() {
transport.AddURLMatcher(thumbnailURL, s.readAsset("1.jpg"), nil)
stubbedClient := http.Client{Transport: &transport}
previews, err := s.m.UnfurlURLs(&stubbedClient, []string{u})
response, err := s.m.UnfurlURLs(&stubbedClient, []string{u})
s.Require().NoError(err)
s.Require().Len(previews, 1)
preview := previews[0]
s.Require().Len(response.StatusLinkPreviews, 0)
s.Require().Len(response.LinkPreviews, 1)
preview := response.LinkPreviews[0]
s.Require().Equal(expected.Type, preview.Type)
s.Require().Equal(expected.URL, preview.URL)
@ -273,10 +261,11 @@ func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_Reddit() {
)
stubbedClient := http.Client{Transport: &transport}
previews, err := s.m.UnfurlURLs(&stubbedClient, []string{u})
response, err := s.m.UnfurlURLs(&stubbedClient, []string{u})
s.Require().NoError(err)
s.Require().Len(previews, 1)
preview := previews[0]
s.Require().Len(response.StatusLinkPreviews, 0)
s.Require().Len(response.LinkPreviews, 1)
preview := response.LinkPreviews[0]
s.Require().Equal(expected.Type, preview.Type)
s.Require().Equal(expected.URL, preview.URL)
@ -288,9 +277,10 @@ func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_Reddit() {
func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_Timeout() {
httpClient := http.Client{Timeout: time.Nanosecond}
previews, err := s.m.UnfurlURLs(&httpClient, []string{"https://status.im"})
response, err := s.m.UnfurlURLs(&httpClient, []string{"https://status.im"})
s.Require().NoError(err)
s.Require().Empty(previews)
s.Require().Len(response.StatusLinkPreviews, 0)
s.Require().Empty(response.LinkPreviews)
}
func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_CommonFailures() {
@ -304,19 +294,22 @@ func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_CommonFailures() {
nil,
)
stubbedClient := http.Client{Transport: &transport}
previews, err := s.m.UnfurlURLs(&stubbedClient, []string{"https://wikipedia.org"})
response, err := s.m.UnfurlURLs(&stubbedClient, []string{"https://wikipedia.org"})
s.Require().NoError(err)
s.Require().Empty(previews)
s.Require().Len(response.StatusLinkPreviews, 0)
s.Require().Empty(response.LinkPreviews)
// Test 404.
previews, err = s.m.UnfurlURLs(&httpClient, []string{"https://github.com/status-im/i_do_not_exist"})
response, err = s.m.UnfurlURLs(&httpClient, []string{"https://github.com/status-im/i_do_not_exist"})
s.Require().NoError(err)
s.Require().Empty(previews)
s.Require().Len(response.StatusLinkPreviews, 0)
s.Require().Empty(response.LinkPreviews)
// Test no response when trying to get OpenGraph metadata.
previews, err = s.m.UnfurlURLs(&httpClient, []string{"https://wikipedia.o"})
response, err = s.m.UnfurlURLs(&httpClient, []string{"https://wikipedia.o"})
s.Require().NoError(err)
s.Require().Empty(previews)
s.Require().Len(response.StatusLinkPreviews, 0)
s.Require().Empty(response.LinkPreviews)
}
func (s *MessengerLinkPreviewsTestSuite) Test_isSupportedImageURL() {
@ -339,7 +332,7 @@ func (s *MessengerLinkPreviewsTestSuite) Test_isSupportedImageURL() {
for _, e := range examples {
parsedURL, err := url.Parse(e.url)
s.Require().NoError(err, e)
s.Require().Equal(e.expected, unfurlers.IsSupportedImageURL(parsedURL), e.url)
s.Require().Equal(e.expected, IsSupportedImageURL(parsedURL), e.url)
}
}
@ -363,10 +356,11 @@ func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_Image() {
transport.AddURLMatcher(u, s.readAsset("IMG_1205.HEIC.jpg"), nil)
stubbedClient := http.Client{Transport: &transport}
previews, err := s.m.UnfurlURLs(&stubbedClient, []string{u})
response, err := s.m.UnfurlURLs(&stubbedClient, []string{u})
s.Require().NoError(err)
s.Require().Len(previews, 1)
preview := previews[0]
s.Require().Len(response.StatusLinkPreviews, 0)
s.Require().Len(response.LinkPreviews, 1)
preview := response.LinkPreviews[0]
s.Require().Equal(expected.Type, preview.Type)
s.Require().Equal(expected.URL, preview.URL)
@ -378,3 +372,138 @@ func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_Image() {
s.Require().Equal(expected.Thumbnail.URL, preview.Thumbnail.URL)
s.assertContainsLongString(expected.Thumbnail.DataURI, preview.Thumbnail.DataURI, 100)
}
func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_StatusContactAdded() {
identity, err := crypto.GenerateKey()
s.Require().NoError(err)
c, err := BuildContactFromPublicKey(&identity.PublicKey)
s.Require().NoError(err)
s.Require().NotNil(c)
pubkey, err := c.PublicKey()
s.Require().NoError(err)
shortKey, err := s.m.SerializePublicKey(crypto.CompressPubkey(pubkey))
s.Require().NoError(err)
payload, err := images.GetPayloadFromURI("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixA" +
"AAAiklEQVR4nOzWwQmFQAwG4ffEXmzLIizDImzLarQBhSwSGH7mO+9hh0DI9AthCI0hNIbQGEJjCI0hNIbQxITM1YfHfl69X3m2bsu/8i5mI" +
"obQGEJjCI0hNIbQlG+tUW83UtfNFjMRQ2gMofm8tUa3U9c2i5mIITSGqEnMRAyhMYTGEBpDaO4AAAD//5POEGncqtj1AAAAAElFTkSuQmCC")
s.Require().NoError(err)
icon := images.IdentityImage{
Width: 50,
Height: 50,
Payload: payload,
}
c.Bio = "TestBio_1"
c.DisplayName = "TestDisplayName_2"
c.Images = map[string]images.IdentityImage{}
c.Images[images.SmallDimName] = icon
s.m.allContacts.Store(c.ID, c)
// Generate a shared URL
u, err := s.m.ShareUserURLWithData(c.ID)
s.Require().NoError(err)
// Update contact info locally after creating the shared URL
// This is required to test that URL-decoded data is not used in the preview.
c.Bio = "TestBio_2"
c.DisplayName = "TestDisplayName_2"
s.m.allContacts.Store(c.ID, c)
r, err := s.m.UnfurlURLs(nil, []string{u})
s.Require().NoError(err)
s.Require().Len(r.StatusLinkPreviews, 1)
s.Require().Len(r.LinkPreviews, 0)
preview := r.StatusLinkPreviews[0]
s.Require().Equal(u, preview.URL)
s.Require().Nil(preview.Community)
s.Require().Nil(preview.Channel)
s.Require().NotNil(preview.Contact)
s.Require().Equal(shortKey, preview.Contact.PublicKey)
s.Require().Equal(c.DisplayName, preview.Contact.DisplayName)
s.Require().Equal(c.Bio, preview.Contact.Description)
s.Require().Equal(icon.Width, preview.Contact.Icon.Width)
s.Require().Equal(icon.Height, preview.Contact.Icon.Height)
s.Require().Equal("", preview.Contact.Icon.URL)
expectedDataURI, err := images.GetPayloadDataURI(icon.Payload)
s.Require().NoError(err)
s.Require().Equal(expectedDataURI, preview.Contact.Icon.DataURI)
}
func (s *MessengerLinkPreviewsTestSuite) Test_UnfurlURLs_StatusCommunityJoined() {
description := &requests.CreateCommunity{
Membership: protobuf.CommunityPermissions_NO_MEMBERSHIP,
Name: "status",
Description: "status community description",
Color: "#123456",
Image: "../_assets/tests/status.png", // 256*256 px
ImageAx: 0,
ImageAy: 0,
ImageBx: 256,
ImageBy: 256,
Banner: images.CroppedImage{
ImagePath: "../_assets/tests/IMG_1205.HEIC.jpg", // 2282*3352 px
X: 0,
Y: 0,
Width: 160,
Height: 90,
},
}
response, err := s.m.CreateCommunity(description, false)
s.Require().NoError(err)
s.Require().NotNil(response)
community := response.Communities()[0]
communityImages := community.Images()
s.Require().Len(communityImages, 3)
// Get icon data
icon, ok := communityImages[images.SmallDimName]
s.Require().True(ok)
iconWidth, iconHeight, err := images.GetImageDimensions(icon.Payload)
s.Require().NoError(err)
iconDataURI, err := images.GetPayloadDataURI(icon.Payload)
s.Require().NoError(err)
// Get banner data
banner, ok := communityImages[images.BannerIdentityName]
s.Require().True(ok)
bannerWidth, bannerHeight, err := images.GetImageDimensions(banner.Payload)
s.Require().NoError(err)
bannerDataURI, err := images.GetPayloadDataURI(banner.Payload)
s.Require().NoError(err)
// Create shared URL
u, err := s.m.ShareCommunityURLWithData(community.ID())
s.Require().NoError(err)
// Unfurl community shared URL
r, err := s.m.UnfurlURLs(nil, []string{u})
s.Require().NoError(err)
s.Require().Len(r.StatusLinkPreviews, 1)
s.Require().Len(r.LinkPreviews, 0)
preview := r.StatusLinkPreviews[0]
s.Require().Equal(u, preview.URL)
s.Require().NotNil(preview.Community)
s.Require().Nil(preview.Channel)
s.Require().Nil(preview.Contact)
s.Require().Equal(community.IDString(), preview.Community.CommunityID)
s.Require().Equal(community.Name(), preview.Community.DisplayName)
s.Require().Equal(community.Identity().Description, preview.Community.Description)
s.Require().Equal(iconWidth, preview.Community.Icon.Width)
s.Require().Equal(iconHeight, preview.Community.Icon.Height)
s.Require().Equal(iconDataURI, preview.Community.Icon.DataURI)
s.Require().Equal(bannerWidth, preview.Community.Banner.Width)
s.Require().Equal(bannerHeight, preview.Community.Banner.Height)
s.Require().Equal(bannerDataURI, preview.Community.Banner.DataURI)
}

View File

@ -55,6 +55,9 @@ func (m *Messenger) EditMessage(ctx context.Context, request *requests.EditMessa
if len(request.LinkPreviews) > 0 {
message.LinkPreviews = request.LinkPreviews
}
if len(request.StatusLinkPreviews) > 0 {
message.StatusLinkPreviews = request.StatusLinkPreviews
}
clock, _ := chat.NextClockAndTimestamp(m.getTimesource())
@ -65,12 +68,19 @@ func (m *Messenger) EditMessage(ctx context.Context, request *requests.EditMessa
editMessage.ChatId = message.ChatId
editMessage.MessageId = message.ID
editMessage.Clock = clock
unfurledLinks, err := message.ConvertLinkPreviewsToProto()
if err != nil {
return nil, err
}
editMessage.UnfurledLinks = unfurledLinks
unfurledStatusLinks, err := message.ConvertStatusLinkPreviewsToProto()
if err != nil {
return nil, err
}
editMessage.UnfurledStatusLinks = unfurledStatusLinks
err = m.applyEditMessage(editMessage.EditMessage, message)
if err != nil {
return nil, err
@ -346,6 +356,7 @@ func (m *Messenger) applyEditMessage(editMessage *protobuf.EditMessage, message
message.Text = editMessage.Text
message.EditedAt = editMessage.Clock
message.UnfurledLinks = editMessage.UnfurledLinks
message.UnfurledStatusLinks = editMessage.UnfurledStatusLinks
if editMessage.ContentType != protobuf.ChatMessage_UNKNOWN_CONTENT_TYPE {
message.ContentType = editMessage.ContentType
}
@ -360,6 +371,7 @@ func (m *Messenger) applyEditMessage(editMessage *protobuf.EditMessage, message
originalEdit.ContentType = message.ContentType
originalEdit.From = message.From
originalEdit.UnfurledLinks = message.UnfurledLinks
originalEdit.UnfurledStatusLinks = message.UnfurledStatusLinks
err := m.persistence.SaveEdit(originalEdit)
if err != nil {
return err

View File

@ -41,10 +41,10 @@ type ContactURLData struct {
}
type URLDataResponse struct {
Community CommunityURLData `json:"community"`
Channel CommunityChannelURLData `json:"channel"`
Contact ContactURLData `json:"contact"`
Shard *common.Shard `json:"shard,omitempty"`
Community *CommunityURLData `json:"community"`
Channel *CommunityChannelURLData `json:"channel"`
Contact *ContactURLData `json:"contact"`
Shard *common.Shard `json:"shard,omitempty"`
}
const baseShareURL = "https://status.app"
@ -92,8 +92,8 @@ func (m *Messenger) ShareCommunityURLWithChatKey(communityID types.HexBytes) (st
return fmt.Sprintf("%s/c#%s", baseShareURL, shortKey), nil
}
func (m *Messenger) prepareCommunityData(community *communities.Community) CommunityURLData {
return CommunityURLData{
func (m *Messenger) prepareCommunityData(community *communities.Community) *CommunityURLData {
return &CommunityURLData{
DisplayName: community.Identity().DisplayName,
Description: community.DescriptionText(),
MembersCount: uint32(community.MembersCount()),
@ -203,7 +203,7 @@ func (m *Messenger) parseCommunityURLWithData(data string, chatKey string) (*URL
}
return &URLDataResponse{
Community: CommunityURLData{
Community: &CommunityURLData{
DisplayName: communityProto.DisplayName,
Description: communityProto.Description,
MembersCount: communityProto.MembersCount,
@ -237,8 +237,8 @@ func (m *Messenger) ShareCommunityChannelURLWithChatKey(request *requests.Commun
return fmt.Sprintf("%s/cc/%s#%s", baseShareURL, request.ChannelID, shortKey), nil
}
func (m *Messenger) prepareCommunityChannelData(channel *protobuf.CommunityChat) CommunityChannelURLData {
return CommunityChannelURLData{
func (m *Messenger) prepareCommunityChannelData(channel *protobuf.CommunityChat) *CommunityChannelURLData {
return &CommunityChannelURLData{
Emoji: channel.Identity.Emoji,
DisplayName: channel.Identity.DisplayName,
Description: channel.Identity.Description,
@ -383,7 +383,7 @@ func (m *Messenger) parseCommunityChannelURLWithData(data string, chatKey string
}
return &URLDataResponse{
Community: CommunityURLData{
Community: &CommunityURLData{
DisplayName: channelProto.Community.DisplayName,
Description: channelProto.Community.Description,
MembersCount: channelProto.Community.MembersCount,
@ -391,7 +391,7 @@ func (m *Messenger) parseCommunityChannelURLWithData(data string, chatKey string
TagIndices: channelProto.Community.TagIndices,
CommunityID: types.EncodeHex(communityID),
},
Channel: CommunityChannelURLData{
Channel: &CommunityChannelURLData{
Emoji: channelProto.Emoji,
DisplayName: channelProto.DisplayName,
Description: channelProto.Description,
@ -416,8 +416,8 @@ func (m *Messenger) ShareUserURLWithChatKey(contactID string) (string, error) {
return fmt.Sprintf("%s/u#%s", baseShareURL, shortKey), nil
}
func (m *Messenger) prepareContactData(contact *Contact) ContactURLData {
return ContactURLData{
func (m *Messenger) prepareContactData(contact *Contact) *ContactURLData {
return &ContactURLData{
DisplayName: contact.DisplayName,
}
}
@ -471,6 +471,7 @@ func (m *Messenger) prepareEncodedUserData(contact *Contact) (string, string, er
userProto := &protobuf.User{
DisplayName: contact.DisplayName,
Description: contact.Bio,
}
userData, err := proto.Marshal(userProto)
@ -528,7 +529,7 @@ func (m *Messenger) parseUserURLWithData(data string, chatKey string) (*URLDataR
}
return &URLDataResponse{
Contact: ContactURLData{
Contact: &ContactURLData{
DisplayName: userProto.DisplayName,
Description: userProto.Description,
PublicKey: chatKey,
@ -536,8 +537,12 @@ func (m *Messenger) parseUserURLWithData(data string, chatKey string) (*URLDataR
}, nil
}
func (m *Messenger) IsStatusSharedURL(url string) bool {
return strings.HasPrefix(url, baseShareURL)
}
func (m *Messenger) ParseSharedURL(url string) (*URLDataResponse, error) {
if !strings.HasPrefix(url, baseShareURL) {
if !m.IsStatusSharedURL(url) {
return nil, fmt.Errorf("url should start with '%s'", baseShareURL)
}

View File

@ -205,6 +205,7 @@ func (s *MessengerShareUrlsSuite) TestParseCommunityURLWithData() {
s.Require().NotNil(urlData)
s.Require().NotNil(urlData.Community)
s.Require().Equal("0x02a3d2fdb9ac335917bf9d46b38d7496c00bbfadbaf832e8aa61d13ac2b4452084", urlData.Community.CommunityID)
s.Require().Equal("Doodles", urlData.Community.DisplayName)
s.Require().Equal("Coloring the world with joy • ᴗ •", urlData.Community.Description)
s.Require().Equal(uint32(446744), urlData.Community.MembersCount)
@ -362,7 +363,7 @@ func (s *MessengerShareUrlsSuite) TestParseUserURLWithChatKey() {
s.Require().NotNil(urlData.Contact)
s.Require().Equal(contact.DisplayName, urlData.Contact.DisplayName)
s.Require().Equal(contact.Bio, urlData.Contact.DisplayName)
s.Require().Equal(contact.Bio, urlData.Contact.Description)
}
func (s *MessengerShareUrlsSuite) TestShareUserURLWithENS() {

View File

@ -2312,6 +2312,21 @@ func (s *MessengerSuite) TestSendMessageWithPreviews() {
}
inputMsg.LinkPreviews = []common.LinkPreview{preview}
sentContactPreview := common.StatusLinkPreview{
URL: "https://status.app/u/TestUrl",
Contact: &common.StatusContactLinkPreview{
PublicKey: "TestPublicKey",
DisplayName: "TestDisplayName",
Description: "Test description",
Icon: common.LinkPreviewThumbnail{
Width: 100,
Height: 200,
DataURI: "data:image/png;base64,iVBORw0KGgoAAAANSUg=",
},
},
}
inputMsg.StatusLinkPreviews = []common.StatusLinkPreview{sentContactPreview}
_, err = s.m.SendChatMessage(context.Background(), inputMsg)
s.NoError(err)
@ -2322,14 +2337,14 @@ func (s *MessengerSuite) TestSendMessageWithPreviews() {
// Test unfurled links have been saved.
s.Require().Len(savedMsg.UnfurledLinks, 1)
unfurledLink := savedMsg.UnfurledLinks[0]
s.Require().Equal(preview.Type, unfurledLink.Type)
s.Require().Equal(preview.URL, unfurledLink.Url)
s.Require().Equal(preview.Title, unfurledLink.Title)
s.Require().Equal(preview.Description, unfurledLink.Description)
savedLinkProto := savedMsg.UnfurledLinks[0]
s.Require().Equal(preview.Type, savedLinkProto.Type)
s.Require().Equal(preview.URL, savedLinkProto.Url)
s.Require().Equal(preview.Title, savedLinkProto.Title)
s.Require().Equal(preview.Description, savedLinkProto.Description)
// Test the saved link thumbnail can be encoded as a data URI.
expectedDataURI, err := images.GetPayloadDataURI(unfurledLink.ThumbnailPayload)
expectedDataURI, err := images.GetPayloadDataURI(savedLinkProto.ThumbnailPayload)
s.Require().NoError(err)
s.Require().Equal(preview.Thumbnail.DataURI, expectedDataURI)
@ -2337,6 +2352,43 @@ func (s *MessengerSuite) TestSendMessageWithPreviews() {
httpServer.MakeLinkPreviewThumbnailURL(inputMsg.ID, preview.URL),
savedMsg.LinkPreviews[0].Thumbnail.URL,
)
// Check saved message protobuf fields
s.Require().NotNil(savedMsg.UnfurledStatusLinks)
s.Require().Len(savedMsg.UnfurledStatusLinks.UnfurledStatusLinks, 1)
savedStatusLinkProto := savedMsg.UnfurledStatusLinks.UnfurledStatusLinks[0]
s.Require().Equal(sentContactPreview.URL, savedStatusLinkProto.Url)
s.Require().NotNil(savedStatusLinkProto.GetContact())
s.Require().Nil(savedStatusLinkProto.GetCommunity())
s.Require().Nil(savedStatusLinkProto.GetChannel())
savedContactProto := savedStatusLinkProto.GetContact()
s.Require().Equal(sentContactPreview.Contact.PublicKey, string(savedContactProto.PublicKey))
s.Require().Equal(sentContactPreview.Contact.DisplayName, savedContactProto.DisplayName)
s.Require().Equal(sentContactPreview.Contact.Description, savedContactProto.Description)
s.Require().NotNil(savedContactProto.Icon)
s.Require().Equal(sentContactPreview.Contact.Icon.Width, int(savedContactProto.Icon.Width))
s.Require().Equal(sentContactPreview.Contact.Icon.Height, int(savedContactProto.Icon.Height))
iconDataURI, err := images.GetPayloadDataURI(savedContactProto.Icon.Payload)
s.Require().NoError(err)
s.Require().Equal(sentContactPreview.Contact.Icon.DataURI, iconDataURI)
// Check message `StatusLinkPreviews` properties
s.Require().Len(savedMsg.StatusLinkPreviews, 1)
savedStatusLinkPreview := savedMsg.StatusLinkPreviews[0]
s.Require().Equal(sentContactPreview.URL, savedStatusLinkPreview.URL)
s.Require().NotNil(savedStatusLinkPreview.Contact)
savedContact := savedStatusLinkPreview.Contact
s.Require().Equal(sentContactPreview.Contact.PublicKey, savedContact.PublicKey)
s.Require().Equal(sentContactPreview.Contact.DisplayName, savedContact.DisplayName)
s.Require().Equal(sentContactPreview.Contact.Description, savedContact.Description)
s.Require().NotNil(savedContact.Icon)
s.Require().Equal(sentContactPreview.Contact.Icon.Width, savedContact.Icon.Width)
s.Require().Equal(sentContactPreview.Contact.Icon.Height, savedContact.Icon.Height)
expectedIconURL := httpServer.MakeStatusLinkPreviewThumbnailURL(inputMsg.ID, sentContactPreview.URL, "contact-icon")
s.Require().Equal(expectedIconURL, savedContact.Icon.URL)
}
func (s *MessengerSuite) TestMessageSent() {

View File

@ -102,6 +102,7 @@
// 1689931300_add_community_tokens_deployer_and_priv_level.up.sql (156B)
// 1693311881_add_unfurled_links_to_message_edits.up.sql (64B)
// 1693311981_community_shard.up.sql (156B)
// 1695331492_add_status_link_previews.up.sql (136B)
// README.md (554B)
// doc.go (850B)
@ -187,7 +188,7 @@ func _000001_initDownDbSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xbb, 0x3f, 0x1, 0x75, 0x19, 0x70, 0x86, 0xa7, 0x34, 0x40, 0x17, 0x34, 0x3e, 0x18, 0x51, 0x79, 0xd4, 0x22, 0xad, 0x8f, 0x80, 0xcc, 0xa6, 0xcc, 0x6, 0x2b, 0x62, 0x2, 0x47, 0xba, 0xf9}}
return a, nil
}
@ -207,7 +208,7 @@ func _000001_initUpDbSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x60, 0xdc, 0xeb, 0xe, 0xc2, 0x4f, 0x75, 0xa, 0xf6, 0x3e, 0xc7, 0xc4, 0x4, 0xe2, 0xe1, 0xa4, 0x73, 0x2f, 0x4a, 0xad, 0x1a, 0x0, 0xc3, 0x93, 0x9d, 0x77, 0x3e, 0x31, 0x91, 0x77, 0x2e, 0xc8}}
return a, nil
}
@ -227,7 +228,7 @@ func _000002_add_last_ens_clock_valueUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x3, 0x8f, 0xd5, 0x85, 0x83, 0x47, 0xbe, 0xf9, 0x82, 0x7e, 0x81, 0xa4, 0xbd, 0xaa, 0xd5, 0x98, 0x18, 0x5, 0x2d, 0x82, 0x42, 0x3b, 0x3, 0x50, 0xc3, 0x1e, 0x84, 0x35, 0xf, 0xb6, 0x2b}}
return a, nil
}
@ -247,7 +248,7 @@ func _1586358095_add_replaceUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0xb3, 0xa9, 0xc7, 0x7f, 0x9d, 0x8f, 0x43, 0x8c, 0x9e, 0x58, 0x8d, 0x44, 0xbc, 0xfa, 0x6b, 0x5f, 0x3f, 0x5a, 0xbe, 0xe8, 0xb1, 0x16, 0xf, 0x91, 0x2a, 0xa0, 0x71, 0xbb, 0x8d, 0x6b, 0xcb}}
return a, nil
}
@ -267,7 +268,7 @@ func _1588665364_add_image_dataUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd6, 0xc6, 0x35, 0xb4, 0x4c, 0x39, 0x96, 0x29, 0x30, 0xda, 0xf4, 0x8f, 0xcb, 0xf1, 0x9f, 0x84, 0xdc, 0x88, 0xd4, 0xd5, 0xbc, 0xb6, 0x5b, 0x46, 0x78, 0x67, 0x76, 0x1a, 0x5, 0x36, 0xdc, 0xe5}}
return a, nil
}
@ -287,7 +288,7 @@ func _1589365189_add_pow_targetUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4e, 0x3a, 0xe2, 0x2e, 0x7d, 0xaf, 0xbb, 0xcc, 0x21, 0xa1, 0x7a, 0x41, 0x9a, 0xd0, 0xbb, 0xa9, 0xc8, 0x35, 0xf9, 0x32, 0x34, 0x46, 0x44, 0x9a, 0x86, 0x40, 0x7c, 0xb9, 0x23, 0xc7, 0x3, 0x3f}}
return a, nil
}
@ -307,7 +308,7 @@ func _1591277220_add_index_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xfe, 0xbe, 0xd5, 0xb8, 0x8f, 0xdd, 0xef, 0xbb, 0xa8, 0xad, 0x7f, 0xed, 0x5b, 0x5b, 0x2f, 0xe6, 0x82, 0x27, 0x78, 0x1f, 0xb9, 0x57, 0xdc, 0x8, 0xc2, 0xb2, 0xa9, 0x9a, 0x4, 0xe1, 0x7a}}
return a, nil
}
@ -327,7 +328,7 @@ func _1593087212_add_mute_chat_and_raw_message_fieldsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x99, 0x61, 0xd1, 0xaa, 0xb4, 0xbf, 0xaf, 0xd7, 0x20, 0x17, 0x40, 0xf9, 0x2, 0xfb, 0xcc, 0x40, 0x2a, 0xd, 0x86, 0x36, 0x30, 0x88, 0x89, 0x25, 0x80, 0x42, 0xb0, 0x5b, 0xe9, 0x73, 0x78}}
return a, nil
}
@ -347,7 +348,7 @@ func _1595862781_add_audio_dataUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0xd2, 0xee, 0x55, 0xfb, 0x36, 0xa4, 0x92, 0x66, 0xe, 0x81, 0x62, 0x1e, 0x7a, 0x69, 0xa, 0xd5, 0x4b, 0xa5, 0x6a, 0x8d, 0x1d, 0xce, 0xf3, 0x3e, 0xc0, 0x5f, 0x9c, 0x66, 0x1b, 0xb4, 0xed}}
return a, nil
}
@ -367,7 +368,7 @@ func _1595865249_create_emoji_reactions_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xc5, 0x43, 0x5c, 0x3d, 0x53, 0x43, 0x2c, 0x1a, 0xa5, 0xb6, 0xbf, 0x7, 0x4, 0x5a, 0x3e, 0x40, 0x8b, 0xa4, 0x57, 0x12, 0x58, 0xbc, 0x42, 0xe2, 0xc3, 0xde, 0x76, 0x98, 0x80, 0xe2, 0xbe}}
return a, nil
}
@ -387,7 +388,7 @@ func _1596805115_create_group_chat_invitations_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0xb1, 0x14, 0x6d, 0x54, 0x28, 0x67, 0xc3, 0x23, 0x6a, 0xfc, 0x80, 0xdf, 0x9e, 0x4c, 0x35, 0x36, 0xf, 0xf8, 0xf3, 0x5f, 0xae, 0xad, 0xb, 0xc1, 0x51, 0x8e, 0x17, 0x7, 0xe5, 0x7f, 0x91}}
return a, nil
}
@ -407,7 +408,7 @@ func _1597322655_add_invitation_admin_chat_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x7a, 0xa0, 0xf2, 0xdb, 0x13, 0x91, 0x91, 0xa8, 0x34, 0x1a, 0xa1, 0x49, 0x68, 0xd5, 0xae, 0x2c, 0xd8, 0xd5, 0xea, 0x8f, 0x8c, 0xc7, 0x2, 0x4e, 0x58, 0x2c, 0x3a, 0x14, 0xd4, 0x4f, 0x2c}}
return a, nil
}
@ -427,7 +428,7 @@ func _1597757544_add_nicknameUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xa2, 0x64, 0x50, 0xc5, 0x4, 0xb9, 0x8b, 0xd1, 0x18, 0x9b, 0xc3, 0x91, 0x36, 0x2a, 0x1f, 0xc3, 0x6c, 0x2d, 0x92, 0xf8, 0x5e, 0xff, 0xb1, 0x59, 0x61, 0x2, 0x1c, 0xe1, 0x85, 0x90, 0xa4}}
return a, nil
}
@ -447,7 +448,7 @@ func _1598955122_add_mentionsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0x22, 0x17, 0x92, 0xd2, 0x11, 0x4e, 0x7, 0x93, 0x9a, 0x55, 0xfd, 0xb, 0x97, 0xc4, 0x63, 0x6a, 0x81, 0x97, 0xcd, 0xb2, 0xf8, 0x4b, 0x5f, 0x3c, 0xfa, 0x3a, 0x38, 0x53, 0x10, 0xed, 0x9d}}
return a, nil
}
@ -467,7 +468,7 @@ func _1599641390_add_emoji_reactions_indexUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xd8, 0xdc, 0xa7, 0xb, 0x92, 0x7a, 0x61, 0x37, 0x24, 0x1c, 0x77, 0x5e, 0xe, 0x7e, 0xfc, 0x9f, 0x98, 0x7b, 0x65, 0xe7, 0xf9, 0x71, 0x57, 0x89, 0x2d, 0x90, 0x1b, 0xf6, 0x5e, 0x37, 0xe8}}
return a, nil
}
@ -487,7 +488,7 @@ func _1599720851_add_seen_index_remove_long_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x24, 0x1c, 0xc4, 0x78, 0x91, 0xc7, 0xeb, 0xfe, 0xc8, 0xa0, 0xd8, 0x13, 0x27, 0x97, 0xc8, 0x96, 0x56, 0x97, 0x33, 0x2c, 0x1e, 0x16, 0x8a, 0xd3, 0x49, 0x99, 0x3, 0xe9, 0xbb, 0xc4, 0x5, 0x3c}}
return a, nil
}
@ -507,7 +508,7 @@ func _1603198582_add_profile_chat_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0xca, 0xe, 0x46, 0xa0, 0x9, 0x9d, 0x47, 0x57, 0xe9, 0xfb, 0x17, 0xeb, 0x9c, 0xf6, 0xb8, 0x1d, 0xe9, 0xd, 0x0, 0xd5, 0xe5, 0xd8, 0x9e, 0x60, 0xa, 0xbf, 0x32, 0x2c, 0x52, 0x7f, 0x6a}}
return a, nil
}
@ -527,7 +528,7 @@ func _1603816533_add_linksUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x24, 0xd6, 0x1d, 0xa, 0x83, 0x1e, 0x4d, 0xf, 0xae, 0x4d, 0x8c, 0x51, 0x32, 0xa8, 0x37, 0xb0, 0x14, 0xfb, 0x32, 0x34, 0xc8, 0xc, 0x4e, 0x5b, 0xc5, 0x15, 0x65, 0x73, 0x0, 0x0, 0x1d}}
return a, nil
}
@ -547,7 +548,7 @@ func _1603888149_create_chat_identity_last_published_tableUpSql() (*asset, error
return nil, err
}
info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x9, 0xf, 0xfb, 0xdb, 0x3c, 0x86, 0x70, 0x82, 0xda, 0x10, 0x25, 0xe2, 0x4e, 0x40, 0x45, 0xab, 0x8b, 0x1c, 0x91, 0x7c, 0xf1, 0x70, 0x2e, 0x81, 0xf3, 0x71, 0x45, 0xda, 0xe2, 0xa4, 0x57}}
return a, nil
}
@ -567,7 +568,7 @@ func _1605075346_add_communitiesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x64, 0xea, 0xb4, 0xae, 0x9e, 0xdb, 0x9, 0x58, 0xb6, 0x5c, 0x7a, 0x50, 0xc5, 0xfe, 0x93, 0x5d, 0x36, 0x85, 0x5d, 0x6a, 0xba, 0xc9, 0x7e, 0x84, 0xd7, 0xbf, 0x2a, 0x53, 0xf3, 0x97, 0xf1}}
return a, nil
}
@ -587,7 +588,7 @@ func _1610117927_add_message_cacheUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xf1, 0xf0, 0x82, 0x79, 0x28, 0x19, 0xc2, 0x39, 0x6a, 0xa5, 0x96, 0x59, 0x23, 0xa0, 0xed, 0x60, 0x58, 0x86, 0x9, 0xb9, 0xad, 0xfb, 0xa, 0xe3, 0x47, 0x6e, 0xa1, 0x18, 0xe8, 0x39, 0x2c}}
return a, nil
}
@ -607,7 +608,7 @@ func _1610959908_add_dont_wrap_to_raw_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x71, 0x2, 0x9a, 0xca, 0xd4, 0x38, 0x44, 0x30, 0x2b, 0xa8, 0x27, 0x32, 0x63, 0x53, 0x22, 0x60, 0x59, 0x84, 0x23, 0x96, 0x77, 0xf0, 0x56, 0xd7, 0x94, 0xe0, 0x95, 0x28, 0x6, 0x1d, 0x4e, 0xb1}}
return a, nil
}
@ -627,7 +628,7 @@ func _1610960912_add_send_on_personal_topicUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0x2f, 0xc4, 0xd, 0xa7, 0x1b, 0x37, 0x30, 0xc2, 0x68, 0xee, 0xde, 0x54, 0x5e, 0xbf, 0x3f, 0xa0, 0xd6, 0xc6, 0x9f, 0xd4, 0x34, 0x12, 0x76, 0x1e, 0x66, 0x4a, 0xfc, 0xf, 0xee, 0xc9}}
return a, nil
}
@ -647,7 +648,7 @@ func _1612870480_add_datasync_idUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x9a, 0xbc, 0xfa, 0xaa, 0x8c, 0x9c, 0x37, 0x67, 0x15, 0x9c, 0x7e, 0x78, 0x75, 0x66, 0x82, 0x18, 0x72, 0x10, 0xbc, 0xd4, 0xab, 0x44, 0xfe, 0x57, 0x85, 0x6d, 0x19, 0xf5, 0x96, 0x8a, 0xbe}}
return a, nil
}
@ -667,7 +668,7 @@ func _1614152139_add_communities_request_to_joinUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x11, 0x3, 0x26, 0xf9, 0x29, 0x50, 0x4f, 0xcd, 0x46, 0xe5, 0xb1, 0x6b, 0xb9, 0x2, 0x40, 0xb1, 0xdf, 0x4a, 0x4c, 0x7a, 0xda, 0x3, 0x35, 0xcd, 0x2d, 0xcc, 0x80, 0x7d, 0x57, 0x5f, 0x3, 0x5c}}
return a, nil
}
@ -687,7 +688,7 @@ func _1615374373_add_confirmationsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdd, 0xa6, 0x65, 0xc5, 0x1d, 0xb2, 0x77, 0x36, 0xe3, 0x79, 0xda, 0xe8, 0x7a, 0xa4, 0xdf, 0x45, 0xae, 0xd8, 0xb4, 0xba, 0x90, 0xfd, 0x74, 0x71, 0x14, 0x75, 0x73, 0x72, 0xb9, 0x9e, 0x1, 0x81}}
return a, nil
}
@ -707,7 +708,7 @@ func _1617694931_add_notification_centerUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x45, 0xc6, 0xc9, 0x73, 0xbb, 0x1f, 0xda, 0xa3, 0x4d, 0x19, 0x98, 0x85, 0x2d, 0xca, 0xda, 0xcc, 0x3b, 0x32, 0xff, 0xc7, 0x7b, 0xe3, 0x9f, 0x9b, 0x2a, 0x93, 0xf5, 0xdf, 0x65, 0x38, 0x91}}
return a, nil
}
@ -727,7 +728,7 @@ func _1618923660_create_pin_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x61, 0x44, 0x3a, 0xbe, 0x30, 0xd2, 0x7e, 0xc0, 0xe2, 0x8e, 0x65, 0x53, 0x54, 0xbb, 0x7a, 0x1c, 0xb3, 0x5d, 0xd2, 0xa6, 0xa9, 0x28, 0xb7, 0xa4, 0x5f, 0x8b, 0x9, 0x5f, 0x17, 0xc1, 0x85, 0x21}}
return a, nil
}
@ -747,7 +748,7 @@ func _1619094007_add_joined_chat_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x30, 0x81, 0x3a, 0x2f, 0x9f, 0xb3, 0x0, 0x55, 0x8e, 0x1d, 0xa8, 0xb0, 0x68, 0xf0, 0x40, 0x1a, 0x6c, 0xaa, 0xfc, 0x33, 0xd1, 0xd1, 0x55, 0x3f, 0xf2, 0xbd, 0x54, 0xa1, 0x2b, 0x40, 0x95}}
return a, nil
}
@ -767,7 +768,7 @@ func _1619099821_add_last_synced_fieldUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x52, 0x22, 0xe, 0x2f, 0xd7, 0x93, 0x5f, 0x42, 0xc2, 0x93, 0x4, 0x35, 0x6f, 0xc9, 0x19, 0xed, 0x6b, 0x52, 0x6f, 0xae, 0x99, 0xe2, 0x68, 0x3d, 0x4f, 0x40, 0xe, 0xe1, 0xa, 0x47, 0x21}}
return a, nil
}
@ -787,7 +788,7 @@ func _1621933219_add_mentionedUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x76, 0x8a, 0xc9, 0x7, 0x8f, 0xa5, 0xcb, 0x12, 0x21, 0x4e, 0xfe, 0x96, 0x77, 0xcf, 0x7f, 0x76, 0x75, 0x36, 0x2c, 0xf8, 0x1d, 0x13, 0xcb, 0xcd, 0x6e, 0x70, 0xbf, 0xf5, 0x93, 0x67, 0xd1}}
return a, nil
}
@ -807,7 +808,7 @@ func _1622010048_add_unviewed_mentions_countUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7c, 0x16, 0x85, 0xa6, 0x5b, 0xe1, 0x66, 0xb9, 0x84, 0xbe, 0x7f, 0xa, 0x77, 0x23, 0xb9, 0xef, 0x8e, 0x2, 0x8, 0xfc, 0x61, 0xb2, 0x43, 0xa9, 0x63, 0xae, 0xb4, 0xdf, 0x30, 0xb1, 0x61, 0x4b}}
return a, nil
}
@ -827,7 +828,7 @@ func _1622061278_add_message_activity_center_notification_fieldUpSql() (*asset,
return nil, err
}
info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8, 0xc, 0xa6, 0x1f, 0xa5, 0xc6, 0x7c, 0x6f, 0xab, 0x2c, 0x2d, 0xb5, 0xa4, 0xdd, 0xc1, 0xd6, 0x44, 0x83, 0xf9, 0xb1, 0xa5, 0xce, 0x34, 0x3d, 0x2, 0xa9, 0x35, 0xcf, 0xc6, 0xb2, 0x43, 0x37}}
return a, nil
}
@ -847,7 +848,7 @@ func _1622464518_set_synced_to_fromUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x33, 0x3e, 0x2b, 0xa, 0x1e, 0xc7, 0x6d, 0x6f, 0xd1, 0x1d, 0xe8, 0x4b, 0xdd, 0x92, 0x76, 0xea, 0xf2, 0x3e, 0x15, 0x85, 0xc4, 0xc3, 0x31, 0xf1, 0xc0, 0xa2, 0xd7, 0x47, 0xde, 0x4e, 0xfd, 0xc6}}
return a, nil
}
@ -867,7 +868,7 @@ func _1622464519_add_chat_descriptionUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x2e, 0x89, 0x31, 0xec, 0xef, 0xeb, 0x43, 0xf5, 0x96, 0x6d, 0xce, 0x91, 0x8a, 0x37, 0x2a, 0x11, 0x7a, 0x3f, 0xd9, 0x10, 0xbb, 0xa1, 0xbc, 0x7, 0xe0, 0x3b, 0xa5, 0xf4, 0xa6, 0xf4, 0xa1}}
return a, nil
}
@ -887,7 +888,7 @@ func _1622622253_add_pinned_by_to_pin_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9b, 0x94, 0xa3, 0x45, 0x91, 0x1e, 0x66, 0xd1, 0x96, 0x5a, 0xaf, 0xfa, 0x29, 0x39, 0xa8, 0x3a, 0x97, 0x4c, 0x65, 0x6, 0x96, 0x90, 0x4c, 0xfe, 0xce, 0x7d, 0x5d, 0xd4, 0xb3, 0x8, 0x6d, 0x5f}}
return a, nil
}
@ -907,7 +908,7 @@ func _1623938329_add_author_activity_center_notification_fieldUpSql() (*asset, e
return nil, err
}
info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0xe6, 0xa7, 0xd5, 0x26, 0xff, 0xab, 0x92, 0x88, 0xf0, 0xd3, 0x34, 0xd9, 0x2f, 0xe7, 0x18, 0x1a, 0x40, 0xf9, 0xbe, 0x8e, 0xfc, 0xd0, 0x4f, 0x1f, 0x4a, 0xb9, 0x83, 0x3f, 0xa9, 0xde, 0xb}}
return a, nil
}
@ -927,7 +928,7 @@ func _1623938330_add_edit_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xd2, 0xce, 0xe, 0x5c, 0x19, 0xbe, 0x5e, 0x29, 0xbe, 0x9b, 0x31, 0x53, 0x76, 0xb2, 0xc8, 0x56, 0xf0, 0x82, 0xfe, 0x7d, 0x6c, 0xe8, 0x5c, 0xe9, 0x7a, 0x5d, 0x5, 0xc4, 0x92, 0x38, 0xe3}}
return a, nil
}
@ -947,7 +948,7 @@ func _1624978434_add_muted_communityUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6, 0xdc, 0x6e, 0x6f, 0x97, 0xc7, 0x3d, 0x50, 0xab, 0x80, 0x87, 0x44, 0x43, 0x38, 0xe6, 0xc5, 0xc1, 0x91, 0x26, 0xf, 0x16, 0xe, 0xd9, 0x32, 0x37, 0x25, 0x96, 0x25, 0x6, 0xc8, 0xb5, 0x4a}}
return a, nil
}
@ -967,7 +968,7 @@ func _1625018910_add_repply_message_activity_center_notification_fieldUpSql() (*
return nil, err
}
info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0x52, 0x12, 0x40, 0xd8, 0x6f, 0x71, 0x97, 0x46, 0x39, 0xaa, 0x74, 0x41, 0xcd, 0x45, 0x4c, 0xe8, 0xd9, 0xe2, 0x56, 0x8e, 0x78, 0x18, 0x62, 0xf6, 0xa8, 0x36, 0xe9, 0x9a, 0x1f, 0xc, 0xb1}}
return a, nil
}
@ -987,7 +988,7 @@ func _1625762506_add_deleted_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x61, 0x42, 0xb6, 0x8c, 0x7f, 0x2d, 0xec, 0xa9, 0x6d, 0x3d, 0x0, 0xa3, 0x32, 0xd8, 0x4a, 0x38, 0x5c, 0x97, 0xfc, 0x68, 0xde, 0xa9, 0xb7, 0xd8, 0xde, 0xb, 0x29, 0x93, 0xdc, 0x81, 0xf8}}
return a, nil
}
@ -1007,7 +1008,7 @@ func _1627388946_add_communities_synced_atUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xbd, 0x9b, 0x6a, 0xc9, 0x1a, 0x7a, 0x34, 0xcf, 0x5f, 0x80, 0x9e, 0x8c, 0x1c, 0xc0, 0xec, 0x4e, 0x78, 0xb0, 0x2d, 0x15, 0x77, 0x38, 0x4a, 0x6a, 0x5, 0x84, 0xf5, 0x8d, 0x8b, 0xbe, 0x9}}
return a, nil
}
@ -1027,7 +1028,7 @@ func _1628280060_createUsermessagesIndexSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x6f, 0x70, 0x47, 0x40, 0xab, 0xa8, 0x60, 0xe0, 0xf9, 0x8, 0x7e, 0x19, 0x9d, 0xba, 0x33, 0x16, 0xfc, 0x3c, 0xdc, 0xa8, 0xa6, 0x53, 0x61, 0x39, 0x82, 0x91, 0xcf, 0x69, 0xd8, 0xf2, 0xcf}}
return a, nil
}
@ -1047,7 +1048,7 @@ func _1632303896_modify_contacts_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x1e, 0x6c, 0x3c, 0xd, 0xd7, 0x7d, 0xbb, 0x19, 0xbc, 0xe4, 0x7, 0xfd, 0xf8, 0x66, 0x6d, 0x78, 0xf6, 0x4, 0xe6, 0x51, 0xe4, 0xe6, 0xdc, 0xe, 0x5a, 0x2e, 0xac, 0xe6, 0xe7, 0x24, 0x69}}
return a, nil
}
@ -1067,7 +1068,7 @@ func _1633349838_add_emoji_column_in_chatsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x33, 0xcb, 0x3b, 0xa9, 0x99, 0x77, 0x6a, 0xea, 0xc4, 0x39, 0xd7, 0xa1, 0x49, 0xa7, 0xdf, 0xff, 0x72, 0xda, 0x34, 0x21, 0x67, 0x66, 0xca, 0x65, 0x46, 0x1, 0xa6, 0x4e, 0xf9, 0x38, 0x86}}
return a, nil
}
@ -1087,7 +1088,7 @@ func _1634831235_add_highlight_column_in_chatsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0x63, 0x5c, 0x73, 0x19, 0x83, 0xbd, 0x35, 0x80, 0x9f, 0x66, 0xec, 0x4c, 0xbc, 0x9d, 0x2d, 0x52, 0x91, 0x6d, 0xb3, 0x2b, 0x87, 0xde, 0x24, 0x46, 0x5c, 0xd, 0xfd, 0x78, 0xf5, 0xe3, 0xe9}}
return a, nil
}
@ -1107,7 +1108,7 @@ func _1634896007_add_last_updated_locally_and_removedUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0xa8, 0x34, 0xe2, 0xc0, 0x62, 0xc8, 0xd6, 0x5a, 0x87, 0xe3, 0x70, 0xe1, 0xc4, 0x16, 0x9c, 0x60, 0x2e, 0x98, 0xf0, 0x91, 0x84, 0xbe, 0xe0, 0xdf, 0x3e, 0x4d, 0x24, 0xc4, 0x6c, 0x40, 0x17}}
return a, nil
}
@ -1127,7 +1128,7 @@ func _1635840039_add_clock_read_at_column_in_chatsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6c, 0xba, 0x3f, 0xba, 0x1a, 0x71, 0xa8, 0x9, 0x19, 0xbe, 0x1e, 0x38, 0x50, 0x30, 0x3a, 0x52, 0x15, 0x29, 0xee, 0x49, 0x19, 0x6f, 0x53, 0xc2, 0xc6, 0x6c, 0xd9, 0x80, 0x7e, 0xb9, 0x58, 0x7a}}
return a, nil
}
@ -1147,7 +1148,7 @@ func _1637852321_add_received_invitation_admin_column_in_chatsUpSql() (*asset, e
return nil, err
}
info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x70, 0x8b, 0x92, 0x56, 0x83, 0x70, 0x7f, 0x6, 0xb2, 0xd, 0x1c, 0x2f, 0xcc, 0x93, 0xc3, 0x85, 0x8c, 0xc2, 0x38, 0x94, 0x7e, 0x88, 0x3f, 0x39, 0x34, 0xf8, 0x90, 0xcf, 0x83, 0x68, 0x3d, 0xe5}}
return a, nil
}
@ -1167,7 +1168,7 @@ func _1645034601_display_nameUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0xfc, 0xda, 0x70, 0x53, 0x19, 0x90, 0x20, 0x4, 0x1c, 0x99, 0x42, 0x53, 0x1a, 0xd6, 0xb8, 0xbb, 0x8a, 0xe8, 0xbe, 0xcc, 0xb7, 0xc, 0x7f, 0x73, 0x50, 0x18, 0xf1, 0x8b, 0x18, 0x54, 0x64}}
return a, nil
}
@ -1187,7 +1188,7 @@ func _1645034602_add_mutual_contact_requestUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0xe0, 0x5d, 0x68, 0xb8, 0x50, 0xa4, 0xbb, 0x3e, 0x4f, 0x2, 0x87, 0xad, 0x87, 0x6e, 0x38, 0xdf, 0xc8, 0x4c, 0xe2, 0x5f, 0xd1, 0x6, 0xdc, 0xe7, 0xbd, 0x4a, 0x9c, 0xf3, 0x91, 0xa1, 0x51}}
return a, nil
}
@ -1207,7 +1208,7 @@ func _1650373957_add_contact_request_stateUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xc1, 0x3f, 0x29, 0xe, 0x19, 0x86, 0x1a, 0x4c, 0x6c, 0x2a, 0x90, 0x9d, 0xdf, 0xb1, 0xb, 0x72, 0x25, 0xcd, 0x6c, 0x5f, 0xd, 0x51, 0x9e, 0x85, 0xc0, 0x9, 0xb7, 0xbc, 0x87, 0x23, 0xec}}
return a, nil
}
@ -1227,7 +1228,7 @@ func _1656958989_contact_verificationUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x3f, 0x28, 0x38, 0x33, 0xdb, 0xe9, 0x4d, 0xc0, 0x54, 0x8c, 0x2a, 0x73, 0xc4, 0xdd, 0x5c, 0xc5, 0x1a, 0x93, 0x4b, 0x6, 0x13, 0xbe, 0x42, 0xd2, 0x7f, 0xd4, 0xc, 0xc5, 0x4e, 0x6d, 0xce}}
return a, nil
}
@ -1247,7 +1248,7 @@ func _1658236268_add_discord_message_authors_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0xb7, 0xdb, 0x79, 0x1, 0x15, 0xe7, 0x76, 0x5d, 0x22, 0x54, 0x82, 0x9a, 0xbe, 0x24, 0xc1, 0x82, 0xcf, 0x67, 0x91, 0x53, 0xcc, 0xac, 0x74, 0x18, 0x61, 0x69, 0x68, 0x19, 0xca, 0x2b, 0xa8}}
return a, nil
}
@ -1267,7 +1268,7 @@ func _1659619997_add_discord_messages_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x12, 0x9c, 0x96, 0xe2, 0x42, 0x3f, 0x94, 0x62, 0xc2, 0x76, 0xab, 0x3b, 0x4c, 0x85, 0x36, 0x48, 0xcc, 0x73, 0x60, 0x93, 0x5a, 0xd6, 0x7, 0xd6, 0x0, 0xee, 0x1b, 0x1e, 0x34, 0x58, 0x99}}
return a, nil
}
@ -1287,7 +1288,7 @@ func _1660226788_create_chat_identity_social_linksUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3c, 0x76, 0x40, 0xe9, 0x85, 0xc4, 0x38, 0xf8, 0xe5, 0x5d, 0xe8, 0x13, 0x46, 0x1b, 0xc, 0x1, 0xe9, 0x2f, 0x74, 0xd1, 0x79, 0x59, 0xa4, 0xdb, 0x4a, 0x4a, 0xf4, 0x98, 0x58, 0x3c, 0x57, 0xd3}}
return a, nil
}
@ -1307,7 +1308,7 @@ func _1660226789_add_walletconnectsessions_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0x5c, 0x72, 0x2, 0xed, 0x36, 0x19, 0x91, 0x4d, 0x1a, 0xc1, 0xab, 0x84, 0xfa, 0x41, 0xb1, 0x46, 0xa5, 0xdb, 0x3f, 0x76, 0x47, 0xd3, 0x75, 0x3c, 0x6a, 0x8e, 0x78, 0xe6, 0x41, 0xdc, 0x7f}}
return a, nil
}
@ -1327,7 +1328,7 @@ func _1661242854_add_communities_requests_to_leaveUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x2e, 0x7d, 0x14, 0xef, 0x6e, 0x95, 0x4b, 0x6, 0x70, 0x2e, 0xd1, 0xf6, 0x59, 0xf9, 0xe, 0x56, 0xa, 0x9c, 0x80, 0x18, 0xca, 0xb9, 0x49, 0x19, 0xf, 0x89, 0x94, 0x36, 0x6d, 0x93, 0x9a}}
return a, nil
}
@ -1347,7 +1348,7 @@ func _1662044232_add_chat_imageUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x74, 0xdf, 0x50, 0x79, 0x73, 0x9e, 0xd0, 0xff, 0xa4, 0xd3, 0x87, 0xc3, 0x48, 0x31, 0x6c, 0xdf, 0xa6, 0x20, 0x85, 0xe6, 0x4e, 0x19, 0x9d, 0xef, 0xcc, 0x84, 0x2b, 0x5d, 0x44, 0x34, 0x6}}
return a, nil
}
@ -1367,7 +1368,7 @@ func _1662106895_add_chat_first_message_timestampUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8b, 0x55, 0x74, 0xfa, 0xf5, 0x51, 0x85, 0x19, 0xfd, 0xfb, 0x6, 0x79, 0x4d, 0x1d, 0xd, 0x3, 0x46, 0x66, 0x34, 0x1e, 0xce, 0x91, 0x21, 0x29, 0xf6, 0x71, 0xe7, 0x31, 0x39, 0x8f, 0x9d, 0x5}}
return a, nil
}
@ -1387,7 +1388,7 @@ func _1662723928_add_discord_author_image_fieldsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1e, 0x5b, 0x48, 0x57, 0x98, 0x55, 0x9a, 0xf1, 0x75, 0xf7, 0xb5, 0x41, 0x5e, 0x96, 0xc5, 0xce, 0xfc, 0x30, 0x5c, 0x15, 0x35, 0x9e, 0x4e, 0x4a, 0x3b, 0x38, 0x42, 0xc4, 0x27, 0x3c, 0x87, 0xbf}}
return a, nil
}
@ -1407,7 +1408,7 @@ func _1664195977_add_deleted_for_mesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7d, 0x9d, 0x13, 0x9, 0xaa, 0x44, 0x14, 0x93, 0xe2, 0xf5, 0x53, 0xb7, 0x79, 0xa8, 0x18, 0xf0, 0x6c, 0xa4, 0x9c, 0x73, 0xc1, 0xaa, 0xc5, 0x2e, 0xc5, 0x41, 0xd7, 0x24, 0xb0, 0xd7, 0xb8, 0xdf}}
return a, nil
}
@ -1427,7 +1428,7 @@ func _1664367420_add_discord_attachments_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0xe1, 0xb6, 0x4f, 0x6f, 0x92, 0x0, 0xb4, 0xf, 0x55, 0x12, 0x1c, 0x98, 0x6d, 0xbc, 0x1e, 0xfd, 0xae, 0x1c, 0xce, 0xd1, 0x3d, 0x2, 0x21, 0x2e, 0xc0, 0x13, 0xa, 0xb2, 0xec, 0x81, 0x13}}
return a, nil
}
@ -1447,7 +1448,7 @@ func _1665079662_add_spectated_column_in_communitiesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x5d, 0xfe, 0xe2, 0xbe, 0xdf, 0xba, 0x45, 0xe9, 0xfc, 0xa7, 0x5f, 0xda, 0x19, 0xdb, 0x40, 0x96, 0x59, 0x78, 0xa, 0xd7, 0x4a, 0xca, 0x1a, 0x93, 0xfb, 0xae, 0x6d, 0x74, 0x7, 0x36, 0xdd}}
return a, nil
}
@ -1467,7 +1468,7 @@ func _1665479047_add_community_id_in_notificationsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd9, 0x8f, 0x8b, 0x1c, 0xaa, 0x6a, 0x56, 0xd6, 0xa5, 0x88, 0x57, 0x13, 0x8f, 0xea, 0xb9, 0x23, 0x82, 0x50, 0xb7, 0x65, 0x1f, 0xab, 0xfa, 0x23, 0x6f, 0x0, 0x7, 0xb6, 0x6e, 0xb5, 0x85, 0x44}}
return a, nil
}
@ -1487,7 +1488,7 @@ func _1665484435_add_encrypted_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0x5c, 0x1e, 0x1c, 0x7f, 0xae, 0x5f, 0xeb, 0x3c, 0x6c, 0xcd, 0xc2, 0x99, 0x48, 0x5c, 0x83, 0xa0, 0xa2, 0x97, 0x5, 0x39, 0x82, 0x71, 0x90, 0x47, 0x21, 0x84, 0x29, 0x19, 0xa4, 0x7a, 0x90}}
return a, nil
}
@ -1507,7 +1508,7 @@ func _1665560200_add_contact_verification_individualUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)}
info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc5, 0xbb, 0x61, 0xfd, 0xbf, 0x33, 0x1d, 0x4e, 0x5f, 0xbd, 0x86, 0x42, 0xb0, 0x6c, 0xf7, 0x39, 0x19, 0x6e, 0x72, 0x35, 0xfd, 0x1b, 0xd6, 0xbd, 0xf6, 0x81, 0x21, 0xc4, 0xaa, 0x6, 0x62, 0x40}}
return a, nil
}
@ -1527,7 +1528,7 @@ func _1670921937_add_album_idUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0664), modTime: time.Unix(1671559305, 0)}
info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xae, 0x83, 0x58, 0xb7, 0x77, 0x5, 0xca, 0xe3, 0xda, 0x32, 0x8f, 0x7b, 0xa4, 0x2f, 0x4c, 0xaf, 0x5f, 0xfa, 0x94, 0x36, 0xe4, 0xf9, 0x7, 0xc6, 0xd6, 0xb7, 0x90, 0xf3, 0xe5, 0xb5, 0x3}}
return a, nil
}
@ -1547,7 +1548,7 @@ func _1673373000_add_repliedUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0664), modTime: time.Unix(1673398499, 0)}
info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x1c, 0xae, 0xf2, 0xf, 0xb4, 0xc2, 0xba, 0x3c, 0xfe, 0x7b, 0xb0, 0xf, 0xf, 0xd5, 0xbc, 0xe2, 0xa7, 0xad, 0x50, 0xd9, 0x5a, 0xe8, 0x96, 0x22, 0x65, 0x89, 0xcf, 0x4a, 0x9a, 0x1b, 0x94}}
return a, nil
}
@ -1567,7 +1568,7 @@ func _1673428910_add_image_width_heightUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0664), modTime: time.Unix(1673527384, 0)}
info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xda, 0x93, 0x2a, 0x9b, 0x6b, 0xb7, 0x96, 0xcd, 0xac, 0xf, 0xaf, 0x54, 0x89, 0x9e, 0x91, 0x5b, 0xd0, 0x4a, 0xa, 0x8d, 0x9e, 0x80, 0x66, 0x26, 0x9e, 0xb5, 0xa9, 0x8, 0xec, 0x2d, 0x6c}}
return a, nil
}
@ -1587,7 +1588,7 @@ func _1674210659_add_contact_request_local_clockUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x72, 0x39, 0xfe, 0x72, 0x98, 0xfc, 0x91, 0x20, 0x10, 0xe8, 0xf5, 0xac, 0x79, 0xa8, 0x1c, 0xca, 0x7b, 0x35, 0xa, 0xc1, 0x56, 0x49, 0x9a, 0xfc, 0xbd, 0x64, 0x9d, 0xdf, 0xd2, 0x60, 0x70}}
return a, nil
}
@ -1607,7 +1608,7 @@ func _1675212323_add_deleted_byUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x85, 0x37, 0x29, 0x2f, 0xd, 0x5a, 0xb6, 0xdb, 0xa7, 0x8, 0x86, 0xfc, 0x7a, 0x70, 0xd8, 0x4d, 0xe6, 0xf0, 0x57, 0xe7, 0xd1, 0x95, 0xd5, 0x4, 0x40, 0x2f, 0x7a, 0x5, 0x4f, 0xc2, 0x97, 0xbc}}
return a, nil
}
@ -1627,7 +1628,7 @@ func _1675247084_add_activity_center_statesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0664), modTime: time.Unix(1676987564, 0)}
info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x90, 0x7d, 0x55, 0xc7, 0x40, 0x29, 0x26, 0x97, 0x45, 0x5c, 0xdf, 0xba, 0x61, 0xb, 0xfc, 0x3d, 0x7a, 0x6c, 0x42, 0xe4, 0x95, 0x78, 0xb0, 0xc5, 0x1f, 0x73, 0xe9, 0x33, 0x51, 0xc8, 0x81}}
return a, nil
}
@ -1647,7 +1648,7 @@ func _1675272329_fix_protocol_migrationUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)}
info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0xe0, 0x11, 0x4c, 0x66, 0x55, 0x72, 0xd3, 0xe6, 0x98, 0xa4, 0xe7, 0x44, 0xf9, 0x3b, 0x3a, 0x3f, 0xd9, 0x91, 0x1e, 0x4f, 0xfc, 0x56, 0x63, 0xe5, 0xa4, 0x83, 0xfc, 0x7c, 0xcf, 0x18, 0x99}}
return a, nil
}
@ -1667,7 +1668,7 @@ func _1676998418_fix_activity_center_migrationUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0664), modTime: time.Unix(1677251785, 0)}
info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8a, 0xdc, 0x64, 0xb1, 0x47, 0x67, 0xda, 0x2c, 0x26, 0x29, 0x6b, 0x6f, 0xb, 0xfa, 0x45, 0xf3, 0xad, 0x8b, 0x1a, 0x5f, 0x1c, 0xed, 0xd7, 0xea, 0x54, 0xf5, 0x3f, 0xb8, 0xf6, 0xf9, 0x44, 0x53}}
return a, nil
}
@ -1687,7 +1688,7 @@ func _1677278861_add_deleted_column_to_activity_center_notifications_tableUpSql(
return nil, err
}
info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)}
info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0x3a, 0x95, 0xaf, 0x81, 0xb0, 0x85, 0x8d, 0x73, 0xda, 0x7b, 0x2a, 0x35, 0xa6, 0xaa, 0xcc, 0x4c, 0x35, 0xa3, 0xa8, 0xbd, 0xd1, 0x37, 0xe8, 0x5d, 0x83, 0xa4, 0x33, 0x1f, 0x10, 0xe4, 0xe6}}
return a, nil
}
@ -1707,7 +1708,7 @@ func _1677486338_add_community_tokens_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)}
info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0x7b, 0x3d, 0x7e, 0x79, 0xc4, 0x3a, 0xf1, 0xda, 0x4b, 0xc6, 0xd1, 0xd, 0xfb, 0xb2, 0xb9, 0x7f, 0x81, 0x29, 0xab, 0xd8, 0x1, 0x20, 0xd7, 0xe1, 0xaf, 0x3e, 0x67, 0x1b, 0xdb, 0xf9, 0xd5}}
return a, nil
}
@ -1727,7 +1728,7 @@ func _1678292329_add_collapsed_categoriesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x46, 0x63, 0x86, 0xd5, 0x7, 0xe2, 0x25, 0x15, 0x1b, 0xfe, 0xf3, 0xe, 0x50, 0x48, 0x11, 0x3c, 0x7c, 0xc6, 0xe5, 0xab, 0x8d, 0x1f, 0xe8, 0x3c, 0xcb, 0xf0, 0x8d, 0xa7, 0x49, 0x4c, 0x16, 0x4f}}
return a, nil
}
@ -1747,7 +1748,7 @@ func _1678800760_add_index_to_raw_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9d, 0xd9, 0x8d, 0x22, 0x46, 0xae, 0x7b, 0x53, 0x3e, 0x51, 0x39, 0xad, 0xad, 0x38, 0x50, 0x6, 0xfa, 0xb9, 0xc4, 0x9f, 0x8d, 0xd2, 0x67, 0x0, 0xef, 0x58, 0x13, 0xab, 0x6a, 0x67, 0xf3, 0x7e}}
return a, nil
}
@ -1767,7 +1768,7 @@ func _1678877478_add_communities_requests_to_join_revealed_addresses_tableUpSql(
return nil, err
}
info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)}
info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x82, 0x1, 0xb4, 0xb2, 0x94, 0x25, 0xd5, 0x2e, 0x45, 0xc3, 0xb1, 0x2c, 0xeb, 0x1a, 0x52, 0xe0, 0x4b, 0x9b, 0x46, 0xf4, 0xc, 0xac, 0x1, 0x1e, 0x90, 0xbc, 0x64, 0x38, 0x10, 0xf1, 0xaf, 0xac}}
return a, nil
}
@ -1787,7 +1788,7 @@ func _1679326850_add_community_token_ownersUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0664), modTime: time.Unix(1680094975, 0)}
info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0xe6, 0x25, 0x67, 0xd1, 0xd6, 0x54, 0x88, 0xb1, 0x80, 0x1e, 0x2d, 0x9c, 0xfa, 0x1c, 0xc7, 0x63, 0x6e, 0xf9, 0x66, 0xb1, 0x68, 0xc6, 0xf8, 0x51, 0xb6, 0xd5, 0x4e, 0x93, 0x39, 0x5e, 0xc0}}
return a, nil
}
@ -1807,7 +1808,7 @@ func _1680011500_add_album_images_countUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)}
info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0x55, 0x99, 0x31, 0xcc, 0x80, 0x78, 0xc3, 0x51, 0x13, 0x63, 0x6f, 0x1a, 0xfd, 0x53, 0xd2, 0xf4, 0x13, 0x4b, 0xb2, 0x4f, 0x99, 0xb8, 0x7b, 0x7, 0x99, 0xb6, 0xab, 0x88, 0x2e, 0x7, 0x8}}
return a, nil
}
@ -1827,7 +1828,7 @@ func _1680114896_add_index_on_album_idUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)}
info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x7e, 0xd5, 0xcd, 0x2d, 0xab, 0xd4, 0x32, 0x26, 0x50, 0x3a, 0x5b, 0x8e, 0x1c, 0xcc, 0x35, 0xf8, 0xa1, 0x2a, 0xc1, 0x23, 0xf6, 0x90, 0xfe, 0x84, 0x3, 0xde, 0x5a, 0xee, 0xc6, 0xfc, 0x2a}}
return a, nil
}
@ -1847,7 +1848,7 @@ func _1681655289_add_mute_tillUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)}
info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xbe, 0xce, 0xb8, 0xe1, 0x30, 0xe7, 0xa7, 0xe0, 0x7d, 0x97, 0xf4, 0x26, 0xb8, 0x57, 0x1d, 0x2a, 0xed, 0x18, 0xf2, 0xa, 0xe3, 0x77, 0x29, 0x18, 0x55, 0x9, 0x74, 0x2c, 0x24, 0x5a, 0x19}}
return a, nil
}
@ -1867,7 +1868,7 @@ func _1681934966_add_index_response_toUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)}
info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0xed, 0xa6, 0x7e, 0x51, 0xf2, 0xa1, 0x3c, 0x78, 0x9a, 0xa7, 0x7a, 0x51, 0x25, 0x7d, 0xdd, 0x4b, 0xf3, 0x45, 0xeb, 0x3f, 0xad, 0x23, 0x3e, 0xac, 0x16, 0x28, 0x62, 0x7, 0x8c, 0xe0, 0xa0}}
return a, nil
}
@ -1887,7 +1888,7 @@ func _1682528339_add_index_user_messages_unseenUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0664), modTime: time.Unix(1683581871, 0)}
info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0xfa, 0x98, 0xdd, 0x74, 0x5e, 0x21, 0x1f, 0xf2, 0x56, 0x17, 0x96, 0xfe, 0xbb, 0x44, 0x4c, 0xa1, 0xd8, 0x9f, 0x2e, 0x6, 0x2f, 0xd8, 0x23, 0xec, 0x94, 0x8c, 0x53, 0xf3, 0xf0, 0x40, 0xe7}}
return a, nil
}
@ -1907,7 +1908,7 @@ func _1683707289_recreate_deleted_for_mesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)}
info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x9d, 0xd6, 0x45, 0x41, 0x29, 0x44, 0xf6, 0x14, 0x38, 0xeb, 0xdf, 0x6b, 0x5d, 0x9c, 0x45, 0x4b, 0xc3, 0xa8, 0xbd, 0x38, 0x14, 0xd9, 0x73, 0xf1, 0x51, 0xbb, 0x9f, 0x14, 0x36, 0xf2, 0x11}}
return a, nil
}
@ -1927,7 +1928,7 @@ func _1683725607_mark_discord_messages_as_seenUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)}
info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd7, 0x2a, 0xc3, 0x43, 0xea, 0x5e, 0x3, 0x2e, 0xce, 0x79, 0xea, 0xa5, 0x67, 0x61, 0x8c, 0xe4, 0xb9, 0xb7, 0x4d, 0xd5, 0xd5, 0xb0, 0x35, 0xc8, 0x2b, 0xa0, 0x3f, 0xd8, 0xde, 0xea, 0x4e, 0x16}}
return a, nil
}
@ -1947,7 +1948,7 @@ func _1684174617_add_url_previews_to_user_messagesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0xb0, 0x72, 0xe3, 0xe4, 0xa9, 0x63, 0x82, 0xea, 0x52, 0x70, 0xb6, 0xa0, 0x73, 0x55, 0x7a, 0x78, 0xa8, 0xd2, 0xb0, 0xf4, 0x78, 0x8a, 0xd, 0x5a, 0xa2, 0x9d, 0x92, 0xdc, 0xce, 0x1c, 0x71}}
return a, nil
}
@ -1967,7 +1968,7 @@ func _1684175608_add_token_balancesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1b, 0x4e, 0xe0, 0x48, 0x34, 0x1, 0x4d, 0x88, 0x11, 0x54, 0x20, 0x52, 0x5c, 0x57, 0x14, 0xa9, 0xa9, 0x36, 0xa4, 0x28, 0x59, 0x48, 0xa8, 0xa, 0x76, 0xec, 0x37, 0xee, 0x9e, 0xd2, 0x20, 0xaa}}
return a, nil
}
@ -1987,7 +1988,7 @@ func _1684979808_sync_activity_center_notificationsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)}
info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0xf5, 0xf7, 0x94, 0xa9, 0xa1, 0x60, 0x26, 0x9d, 0xca, 0x31, 0xf, 0x14, 0xd, 0x70, 0xf8, 0xab, 0x40, 0x29, 0x73, 0x61, 0xbd, 0x1b, 0xb6, 0xc4, 0x31, 0x77, 0x9e, 0x32, 0xa8, 0xce, 0x6d}}
return a, nil
}
@ -2007,7 +2008,7 @@ func _1685383829_add_communities_mute_tillUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbf, 0x58, 0x96, 0xe5, 0x66, 0xcb, 0xde, 0xed, 0x76, 0xb8, 0x5a, 0x86, 0x81, 0x9a, 0x60, 0x51, 0x12, 0x37, 0x54, 0x9a, 0x36, 0x3e, 0xd1, 0x4a, 0xbe, 0x9a, 0xab, 0x20, 0x7f, 0x1d, 0xf4, 0x73}}
return a, nil
}
@ -2027,7 +2028,7 @@ func _1685964183_add_chainids_to_revealed_addressesUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)}
info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xb5, 0xa8, 0xd7, 0xad, 0x9c, 0x54, 0xa5, 0xe9, 0xdb, 0x42, 0x2d, 0xd0, 0xd7, 0x22, 0x1, 0x93, 0xf3, 0x4f, 0x53, 0xf7, 0x1e, 0xbe, 0x4b, 0xac, 0xc7, 0x63, 0x15, 0xdf, 0xe0, 0x6, 0xf8}}
return a, nil
}
@ -2047,7 +2048,7 @@ func _1687370421_add_communities_muted_till_newUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x65, 0x73, 0x96, 0x1d, 0xc8, 0x3e, 0xca, 0xf5, 0xdc, 0xe3, 0xac, 0x3f, 0x9c, 0xc3, 0x67, 0x12, 0x9c, 0x19, 0x1, 0x4, 0x2b, 0xea, 0x6b, 0xe1, 0x59, 0x59, 0x89, 0x3d, 0xef, 0x4a, 0x6e, 0xbe}}
return a, nil
}
@ -2067,7 +2068,7 @@ func _1687416607_add_communities_check_channel_permission_responses_tableUpSql()
return nil, err
}
info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x6, 0x3, 0x1a, 0xde, 0x9d, 0xbc, 0x50, 0x9d, 0xf1, 0x6d, 0x5a, 0x1c, 0x28, 0x92, 0x19, 0x89, 0x76, 0x4e, 0x8b, 0x60, 0xa9, 0xf, 0xe9, 0x76, 0xf1, 0xee, 0x75, 0x92, 0xbd, 0xda, 0x72}}
return a, nil
}
@ -2087,7 +2088,7 @@ func _1687856939_add_community_tokens_decimalsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0x76, 0x42, 0x70, 0xc9, 0x7b, 0x16, 0xf6, 0xfe, 0x7, 0x1c, 0x99, 0xe5, 0x38, 0xfd, 0xa0, 0x3b, 0x93, 0x40, 0xbc, 0x66, 0xc2, 0xd1, 0xdd, 0xe9, 0xc7, 0xbf, 0xae, 0x36, 0xcc, 0x46, 0x57}}
return a, nil
}
@ -2107,7 +2108,7 @@ func _1687959987_modify_community_tokens_supply_as_stringUpSql() (*asset, error)
return nil, err
}
info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x57, 0x89, 0xbf, 0x9b, 0xed, 0x9b, 0x18, 0x3f, 0x84, 0xb5, 0x3c, 0x78, 0x40, 0x60, 0xea, 0x33, 0x26, 0x50, 0x3, 0xda, 0x28, 0x92, 0xd3, 0xb6, 0xff, 0x40, 0xa7, 0x19, 0x2, 0xa7, 0x17, 0xf9}}
return a, nil
}
@ -2127,7 +2128,7 @@ func _1689258900_add_airdrop_address_to_revealed_addressesUpSql() (*asset, error
return nil, err
}
info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)}
info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x7e, 0xaf, 0x5c, 0xd, 0xe5, 0x1e, 0x67, 0x1a, 0x6d, 0xd, 0x28, 0x20, 0x7a, 0x1a, 0x45, 0x6e, 0xba, 0x80, 0x91, 0xb0, 0xd6, 0xfd, 0xc2, 0xb9, 0x42, 0x5c, 0x8d, 0x6e, 0x3e, 0x6e, 0xb2}}
return a, nil
}
@ -2147,7 +2148,7 @@ func _1689266326_create_communities_events_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)}
info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x4e, 0xe, 0xba, 0x29, 0x16, 0x46, 0x38, 0x19, 0xa4, 0x5, 0x40, 0x46, 0xaf, 0x9a, 0x6, 0x89, 0xe0, 0x9c, 0xcc, 0xec, 0x8a, 0xb, 0x40, 0x85, 0x6f, 0xcc, 0x5, 0x24, 0x2a, 0x33, 0xfa}}
return a, nil
}
@ -2167,7 +2168,7 @@ func _1689931300_add_community_tokens_deployer_and_priv_levelUpSql() (*asset, er
return nil, err
}
info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)}
info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3f, 0x24, 0xd9, 0x4d, 0xe, 0x4b, 0xe3, 0x4c, 0xd1, 0xc, 0x72, 0xd4, 0x99, 0xe4, 0xb9, 0xb8, 0xe9, 0x38, 0x9e, 0x11, 0x48, 0xea, 0xe3, 0x5d, 0xd9, 0xd0, 0xef, 0x96, 0x38, 0x5a, 0xd4, 0xa5}}
return a, nil
}
@ -2187,7 +2188,7 @@ func _1693311881_add_unfurled_links_to_message_editsUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0664), modTime: time.Unix(1694098269, 0)}
info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xc7, 0x7c, 0xe4, 0x80, 0x6f, 0xf8, 0x96, 0xb, 0x37, 0xff, 0xa2, 0xab, 0x1c, 0xbd, 0x25, 0x8d, 0x1e, 0x9a, 0x65, 0xe9, 0x45, 0xaf, 0x7f, 0x77, 0x84, 0x1b, 0x10, 0x1b, 0x1a, 0x5, 0xcc}}
return a, nil
}
@ -2207,11 +2208,31 @@ func _1693311981_community_shardUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1693311981_community_shard.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1694098617, 0)}
info := bindataFileInfo{name: "1693311981_community_shard.up.sql", size: 156, mode: os.FileMode(0644), modTime: time.Unix(1697196255, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x12, 0xf9, 0xde, 0x49, 0x9f, 0x95, 0xaa, 0x22, 0x5e, 0x54, 0x5a, 0x1, 0xd, 0xc6, 0x1f, 0x42, 0x93, 0xe8, 0x69, 0x30, 0x11, 0x69, 0x41, 0x7f, 0x87, 0x57, 0x56, 0x2a, 0x32, 0xb9, 0x3e}}
return a, nil
}
var __1695331492_add_status_link_previewsUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\xf4\x09\x71\x0d\x52\x08\x71\x74\xf2\x71\x55\x28\x2d\x4e\x2d\x8a\xcf\x4d\x2d\x2e\x4e\x4c\x4f\x2d\x56\x70\x74\x71\x51\x70\xf6\xf7\x09\xf5\xf5\x53\x28\xcd\x4b\x2b\x2d\xca\x49\x4d\x89\x2f\x2e\x49\x2c\x29\x2d\x8e\xcf\xc9\xcc\xcb\x2e\x56\x70\xf2\xf1\x77\xb2\xe6\xc2\x69\x40\x7c\x6a\x4a\x66\x09\xd1\xc6\x00\x02\x00\x00\xff\xff\x3c\xe3\x6f\xcd\x88\x00\x00\x00")
func _1695331492_add_status_link_previewsUpSqlBytes() ([]byte, error) {
return bindataRead(
__1695331492_add_status_link_previewsUpSql,
"1695331492_add_status_link_previews.up.sql",
)
}
func _1695331492_add_status_link_previewsUpSql() (*asset, error) {
bytes, err := _1695331492_add_status_link_previewsUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "1695331492_add_status_link_previews.up.sql", size: 136, mode: os.FileMode(0644), modTime: time.Unix(1697196265, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0x7d, 0x6e, 0x86, 0xf0, 0xf8, 0x23, 0x4b, 0x16, 0x3d, 0xca, 0x8f, 0xfc, 0x8, 0x22, 0xd5, 0x70, 0x14, 0xbb, 0xdd, 0xa9, 0xb8, 0x3e, 0xc6, 0x20, 0xfb, 0x0, 0x26, 0x73, 0xcb, 0x92, 0xb2}}
return a, nil
}
var _readmeMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x54\x91\xc1\xce\xd3\x30\x10\x84\xef\x7e\x8a\x91\x7a\x01\xa9\x2a\x8f\xc0\x0d\x71\x82\x03\x48\x1c\xc9\x36\x9e\x36\x96\x1c\x6f\xf0\xae\x93\xe6\xed\x91\xa3\xc2\xdf\xff\x66\xed\xd8\x33\xdf\x78\x4f\xa7\x13\xbe\xea\x06\x57\x6c\x35\x39\x31\xa7\x7b\x15\x4f\x5a\xec\x73\x08\xbf\x08\x2d\x79\x7f\x4a\x43\x5b\x86\x17\xfd\x8c\x21\xea\x56\x5e\x47\x90\x4a\x14\x75\x48\xde\x64\x37\x2c\x6a\x96\xae\x99\x48\x05\xf6\x27\x77\x13\xad\x08\xae\x8a\x51\xe7\x25\xf3\xf1\xa9\x9f\xf9\x58\x58\x2c\xad\xbc\xe0\x8b\x56\xf0\x21\x5d\xeb\x4c\x95\xb3\xae\x84\x60\xd4\xdc\xe6\x82\x5d\x1b\x36\x6d\x39\x62\x92\xf5\xb8\x11\xdb\x92\xd3\x28\xce\xe0\x13\xe1\x72\xcd\x3c\x63\xd4\x65\x87\xae\xac\xe8\xc3\x28\x2e\x67\x44\x66\x3a\x21\x25\xa2\x72\xac\x14\x67\xbc\x84\x9f\x53\x32\x8c\x52\x70\x25\x56\xd6\xfd\x8d\x05\x37\xad\x30\x9d\x9f\xa6\x86\x0f\xcd\x58\x7f\xcf\x34\x93\x3b\xed\x90\x9f\xa4\x1f\xcf\x30\x85\x4d\x07\x58\xaf\x7f\x25\xc4\x9d\xf3\x72\x64\x84\xd0\x7f\xf9\x9b\x3a\x2d\x84\xef\x85\x48\x66\x8d\xd8\x88\x9b\x8c\x8c\x98\x5b\xf6\x74\x14\x4e\x33\x0d\xc9\xe0\x93\x38\xda\x12\xc5\x69\xbd\xe4\xf0\x2e\x7a\x78\x07\x1c\xfe\x13\x9f\x91\x29\x31\x95\x7b\x7f\x62\x59\x37\xb4\xe5\x5e\x25\xfe\x33\xee\xd5\x53\x71\xd6\xda\x3a\xd8\xcb\xde\x2e\xf8\xa1\x90\x55\x53\x0c\xc7\xaa\x0d\xe9\x76\x14\x29\x1c\x7b\x68\xdd\x2f\xe1\x6f\x00\x00\x00\xff\xff\x3c\x0a\xc2\xfe\x2a\x02\x00\x00")
func readmeMdBytes() ([]byte, error) {
@ -2227,7 +2248,7 @@ func readmeMd() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x6e, 0xfb, 0xcc, 0x81, 0x94, 0x4d, 0x8c, 0xa0, 0x3b, 0x5, 0xb0, 0x18, 0xd6, 0xbb, 0xb3, 0x79, 0xc8, 0x8f, 0xff, 0xc1, 0x10, 0xf9, 0xf, 0x20, 0x1b, 0x4a, 0x74, 0x96, 0x42, 0xd7, 0xa8}}
return a, nil
}
@ -2247,7 +2268,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0xcc, 0x41, 0xe1, 0x61, 0x12, 0x97, 0xe, 0x36, 0x8c, 0xa7, 0x9e, 0xe0, 0x6e, 0x59, 0x9e, 0xee, 0xd5, 0x4a, 0xcf, 0x1e, 0x60, 0xd6, 0xc3, 0x3a, 0xc9, 0x6c, 0xf2, 0x86, 0x5a, 0xb4, 0x1e}}
return a, nil
}
@ -2547,6 +2568,8 @@ var _bindata = map[string]func() (*asset, error){
"1693311981_community_shard.up.sql": _1693311981_community_shardUpSql,
"1695331492_add_status_link_previews.up.sql": _1695331492_add_status_link_previewsUpSql,
"README.md": readmeMd,
"doc.go": docGo,
@ -2695,8 +2718,9 @@ var _bintree = &bintree{nil, map[string]*bintree{
"1689931300_add_community_tokens_deployer_and_priv_level.up.sql": &bintree{_1689931300_add_community_tokens_deployer_and_priv_levelUpSql, map[string]*bintree{}},
"1693311881_add_unfurled_links_to_message_edits.up.sql": &bintree{_1693311881_add_unfurled_links_to_message_editsUpSql, map[string]*bintree{}},
"1693311981_community_shard.up.sql": &bintree{_1693311981_community_shardUpSql, map[string]*bintree{}},
"README.md": &bintree{readmeMd, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}},
"1695331492_add_status_link_previews.up.sql": &bintree{_1695331492_add_status_link_previewsUpSql, map[string]*bintree{}},
"README.md": &bintree{readmeMd, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}},
}}
// RestoreAsset restores an asset under the given directory.

View File

@ -0,0 +1,2 @@
ALTER TABLE user_messages ADD COLUMN unfurled_status_links BLOB;
ALTER TABLE user_messages_edits ADD COLUMN unfurled_status_links BLOB;

View File

@ -70,7 +70,7 @@ func (x UnfurledLink_LinkType) String() string {
}
func (UnfurledLink_LinkType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{10, 0}
return fileDescriptor_263952f55fd35689, []int{11, 0}
}
type ChatMessage_ContentType int32
@ -149,7 +149,7 @@ func (x ChatMessage_ContentType) String() string {
}
func (ChatMessage_ContentType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{11, 0}
return fileDescriptor_263952f55fd35689, []int{17, 0}
}
type StickerMessage struct {
@ -345,6 +345,7 @@ type EditMessage struct {
MessageType MessageType `protobuf:"varint,6,opt,name=message_type,json=messageType,proto3,enum=protobuf.MessageType" json:"message_type,omitempty"`
ContentType ChatMessage_ContentType `protobuf:"varint,7,opt,name=content_type,json=contentType,proto3,enum=protobuf.ChatMessage_ContentType" json:"content_type,omitempty"`
UnfurledLinks []*UnfurledLink `protobuf:"bytes,8,rep,name=unfurled_links,json=unfurledLinks,proto3" json:"unfurled_links,omitempty"`
UnfurledStatusLinks *UnfurledStatusLinks `protobuf:"bytes,9,opt,name=unfurled_status_links,json=unfurledStatusLinks,proto3" json:"unfurled_status_links,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -431,6 +432,13 @@ func (m *EditMessage) GetUnfurledLinks() []*UnfurledLink {
return nil
}
func (m *EditMessage) GetUnfurledStatusLinks() *UnfurledStatusLinks {
if m != nil {
return m.UnfurledStatusLinks
}
return nil
}
type DeleteMessage struct {
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
ChatId string `protobuf:"bytes,2,opt,name=chat_id,json=chatId,proto3" json:"chat_id,omitempty"`
@ -891,6 +899,61 @@ func (m *DiscordMessageAttachment) GetLocalUrl() string {
return ""
}
type UnfurledLinkThumbnail struct {
Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
Width uint32 `protobuf:"varint,2,opt,name=width,proto3" json:"width,omitempty"`
Height uint32 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UnfurledLinkThumbnail) Reset() { *m = UnfurledLinkThumbnail{} }
func (m *UnfurledLinkThumbnail) String() string { return proto.CompactTextString(m) }
func (*UnfurledLinkThumbnail) ProtoMessage() {}
func (*UnfurledLinkThumbnail) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{10}
}
func (m *UnfurledLinkThumbnail) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnfurledLinkThumbnail.Unmarshal(m, b)
}
func (m *UnfurledLinkThumbnail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UnfurledLinkThumbnail.Marshal(b, m, deterministic)
}
func (m *UnfurledLinkThumbnail) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnfurledLinkThumbnail.Merge(m, src)
}
func (m *UnfurledLinkThumbnail) XXX_Size() int {
return xxx_messageInfo_UnfurledLinkThumbnail.Size(m)
}
func (m *UnfurledLinkThumbnail) XXX_DiscardUnknown() {
xxx_messageInfo_UnfurledLinkThumbnail.DiscardUnknown(m)
}
var xxx_messageInfo_UnfurledLinkThumbnail proto.InternalMessageInfo
func (m *UnfurledLinkThumbnail) GetPayload() []byte {
if m != nil {
return m.Payload
}
return nil
}
func (m *UnfurledLinkThumbnail) GetWidth() uint32 {
if m != nil {
return m.Width
}
return 0
}
func (m *UnfurledLinkThumbnail) GetHeight() uint32 {
if m != nil {
return m.Height
}
return 0
}
type UnfurledLink struct {
// A valid URL which uniquely identifies this link.
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
@ -912,7 +975,7 @@ func (m *UnfurledLink) Reset() { *m = UnfurledLink{} }
func (m *UnfurledLink) String() string { return proto.CompactTextString(m) }
func (*UnfurledLink) ProtoMessage() {}
func (*UnfurledLink) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{10}
return fileDescriptor_263952f55fd35689, []int{11}
}
func (m *UnfurledLink) XXX_Unmarshal(b []byte) error {
@ -982,6 +1045,379 @@ func (m *UnfurledLink) GetType() UnfurledLink_LinkType {
return UnfurledLink_LINK
}
type UnfurledStatusContactLink struct {
PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
Icon *UnfurledLinkThumbnail `protobuf:"bytes,4,opt,name=icon,proto3" json:"icon,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UnfurledStatusContactLink) Reset() { *m = UnfurledStatusContactLink{} }
func (m *UnfurledStatusContactLink) String() string { return proto.CompactTextString(m) }
func (*UnfurledStatusContactLink) ProtoMessage() {}
func (*UnfurledStatusContactLink) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{12}
}
func (m *UnfurledStatusContactLink) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnfurledStatusContactLink.Unmarshal(m, b)
}
func (m *UnfurledStatusContactLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UnfurledStatusContactLink.Marshal(b, m, deterministic)
}
func (m *UnfurledStatusContactLink) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnfurledStatusContactLink.Merge(m, src)
}
func (m *UnfurledStatusContactLink) XXX_Size() int {
return xxx_messageInfo_UnfurledStatusContactLink.Size(m)
}
func (m *UnfurledStatusContactLink) XXX_DiscardUnknown() {
xxx_messageInfo_UnfurledStatusContactLink.DiscardUnknown(m)
}
var xxx_messageInfo_UnfurledStatusContactLink proto.InternalMessageInfo
func (m *UnfurledStatusContactLink) GetPublicKey() []byte {
if m != nil {
return m.PublicKey
}
return nil
}
func (m *UnfurledStatusContactLink) GetDisplayName() string {
if m != nil {
return m.DisplayName
}
return ""
}
func (m *UnfurledStatusContactLink) GetDescription() string {
if m != nil {
return m.Description
}
return ""
}
func (m *UnfurledStatusContactLink) GetIcon() *UnfurledLinkThumbnail {
if m != nil {
return m.Icon
}
return nil
}
type UnfurledStatusCommunityLink struct {
CommunityId []byte `protobuf:"bytes,1,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"`
DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
MembersCount uint32 `protobuf:"varint,4,opt,name=members_count,json=membersCount,proto3" json:"members_count,omitempty"`
Color string `protobuf:"bytes,5,opt,name=color,proto3" json:"color,omitempty"`
Icon *UnfurledLinkThumbnail `protobuf:"bytes,7,opt,name=icon,proto3" json:"icon,omitempty"`
Banner *UnfurledLinkThumbnail `protobuf:"bytes,8,opt,name=banner,proto3" json:"banner,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UnfurledStatusCommunityLink) Reset() { *m = UnfurledStatusCommunityLink{} }
func (m *UnfurledStatusCommunityLink) String() string { return proto.CompactTextString(m) }
func (*UnfurledStatusCommunityLink) ProtoMessage() {}
func (*UnfurledStatusCommunityLink) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{13}
}
func (m *UnfurledStatusCommunityLink) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnfurledStatusCommunityLink.Unmarshal(m, b)
}
func (m *UnfurledStatusCommunityLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UnfurledStatusCommunityLink.Marshal(b, m, deterministic)
}
func (m *UnfurledStatusCommunityLink) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnfurledStatusCommunityLink.Merge(m, src)
}
func (m *UnfurledStatusCommunityLink) XXX_Size() int {
return xxx_messageInfo_UnfurledStatusCommunityLink.Size(m)
}
func (m *UnfurledStatusCommunityLink) XXX_DiscardUnknown() {
xxx_messageInfo_UnfurledStatusCommunityLink.DiscardUnknown(m)
}
var xxx_messageInfo_UnfurledStatusCommunityLink proto.InternalMessageInfo
func (m *UnfurledStatusCommunityLink) GetCommunityId() []byte {
if m != nil {
return m.CommunityId
}
return nil
}
func (m *UnfurledStatusCommunityLink) GetDisplayName() string {
if m != nil {
return m.DisplayName
}
return ""
}
func (m *UnfurledStatusCommunityLink) GetDescription() string {
if m != nil {
return m.Description
}
return ""
}
func (m *UnfurledStatusCommunityLink) GetMembersCount() uint32 {
if m != nil {
return m.MembersCount
}
return 0
}
func (m *UnfurledStatusCommunityLink) GetColor() string {
if m != nil {
return m.Color
}
return ""
}
func (m *UnfurledStatusCommunityLink) GetIcon() *UnfurledLinkThumbnail {
if m != nil {
return m.Icon
}
return nil
}
func (m *UnfurledStatusCommunityLink) GetBanner() *UnfurledLinkThumbnail {
if m != nil {
return m.Banner
}
return nil
}
type UnfurledStatusChannelLink struct {
ChannelUuid []byte `protobuf:"bytes,1,opt,name=channel_uuid,json=channelUuid,proto3" json:"channel_uuid,omitempty"`
Emoji string `protobuf:"bytes,2,opt,name=emoji,proto3" json:"emoji,omitempty"`
DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
Color string `protobuf:"bytes,5,opt,name=color,proto3" json:"color,omitempty"`
Community *UnfurledStatusCommunityLink `protobuf:"bytes,6,opt,name=community,proto3" json:"community,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UnfurledStatusChannelLink) Reset() { *m = UnfurledStatusChannelLink{} }
func (m *UnfurledStatusChannelLink) String() string { return proto.CompactTextString(m) }
func (*UnfurledStatusChannelLink) ProtoMessage() {}
func (*UnfurledStatusChannelLink) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{14}
}
func (m *UnfurledStatusChannelLink) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnfurledStatusChannelLink.Unmarshal(m, b)
}
func (m *UnfurledStatusChannelLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UnfurledStatusChannelLink.Marshal(b, m, deterministic)
}
func (m *UnfurledStatusChannelLink) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnfurledStatusChannelLink.Merge(m, src)
}
func (m *UnfurledStatusChannelLink) XXX_Size() int {
return xxx_messageInfo_UnfurledStatusChannelLink.Size(m)
}
func (m *UnfurledStatusChannelLink) XXX_DiscardUnknown() {
xxx_messageInfo_UnfurledStatusChannelLink.DiscardUnknown(m)
}
var xxx_messageInfo_UnfurledStatusChannelLink proto.InternalMessageInfo
func (m *UnfurledStatusChannelLink) GetChannelUuid() []byte {
if m != nil {
return m.ChannelUuid
}
return nil
}
func (m *UnfurledStatusChannelLink) GetEmoji() string {
if m != nil {
return m.Emoji
}
return ""
}
func (m *UnfurledStatusChannelLink) GetDisplayName() string {
if m != nil {
return m.DisplayName
}
return ""
}
func (m *UnfurledStatusChannelLink) GetDescription() string {
if m != nil {
return m.Description
}
return ""
}
func (m *UnfurledStatusChannelLink) GetColor() string {
if m != nil {
return m.Color
}
return ""
}
func (m *UnfurledStatusChannelLink) GetCommunity() *UnfurledStatusCommunityLink {
if m != nil {
return m.Community
}
return nil
}
type UnfurledStatusLink struct {
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
// Types that are valid to be assigned to Payload:
//
// *UnfurledStatusLink_Contact
// *UnfurledStatusLink_Community
// *UnfurledStatusLink_Channel
Payload isUnfurledStatusLink_Payload `protobuf_oneof:"payload"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UnfurledStatusLink) Reset() { *m = UnfurledStatusLink{} }
func (m *UnfurledStatusLink) String() string { return proto.CompactTextString(m) }
func (*UnfurledStatusLink) ProtoMessage() {}
func (*UnfurledStatusLink) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{15}
}
func (m *UnfurledStatusLink) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnfurledStatusLink.Unmarshal(m, b)
}
func (m *UnfurledStatusLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UnfurledStatusLink.Marshal(b, m, deterministic)
}
func (m *UnfurledStatusLink) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnfurledStatusLink.Merge(m, src)
}
func (m *UnfurledStatusLink) XXX_Size() int {
return xxx_messageInfo_UnfurledStatusLink.Size(m)
}
func (m *UnfurledStatusLink) XXX_DiscardUnknown() {
xxx_messageInfo_UnfurledStatusLink.DiscardUnknown(m)
}
var xxx_messageInfo_UnfurledStatusLink proto.InternalMessageInfo
func (m *UnfurledStatusLink) GetUrl() string {
if m != nil {
return m.Url
}
return ""
}
type isUnfurledStatusLink_Payload interface {
isUnfurledStatusLink_Payload()
}
type UnfurledStatusLink_Contact struct {
Contact *UnfurledStatusContactLink `protobuf:"bytes,2,opt,name=contact,proto3,oneof"`
}
type UnfurledStatusLink_Community struct {
Community *UnfurledStatusCommunityLink `protobuf:"bytes,3,opt,name=community,proto3,oneof"`
}
type UnfurledStatusLink_Channel struct {
Channel *UnfurledStatusChannelLink `protobuf:"bytes,4,opt,name=channel,proto3,oneof"`
}
func (*UnfurledStatusLink_Contact) isUnfurledStatusLink_Payload() {}
func (*UnfurledStatusLink_Community) isUnfurledStatusLink_Payload() {}
func (*UnfurledStatusLink_Channel) isUnfurledStatusLink_Payload() {}
func (m *UnfurledStatusLink) GetPayload() isUnfurledStatusLink_Payload {
if m != nil {
return m.Payload
}
return nil
}
func (m *UnfurledStatusLink) GetContact() *UnfurledStatusContactLink {
if x, ok := m.GetPayload().(*UnfurledStatusLink_Contact); ok {
return x.Contact
}
return nil
}
func (m *UnfurledStatusLink) GetCommunity() *UnfurledStatusCommunityLink {
if x, ok := m.GetPayload().(*UnfurledStatusLink_Community); ok {
return x.Community
}
return nil
}
func (m *UnfurledStatusLink) GetChannel() *UnfurledStatusChannelLink {
if x, ok := m.GetPayload().(*UnfurledStatusLink_Channel); ok {
return x.Channel
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*UnfurledStatusLink) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*UnfurledStatusLink_Contact)(nil),
(*UnfurledStatusLink_Community)(nil),
(*UnfurledStatusLink_Channel)(nil),
}
}
// Create a wrapper around repeated property for proper unmarshalling
type UnfurledStatusLinks struct {
UnfurledStatusLinks []*UnfurledStatusLink `protobuf:"bytes,1,rep,name=unfurled_status_links,json=unfurledStatusLinks,proto3" json:"unfurled_status_links,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UnfurledStatusLinks) Reset() { *m = UnfurledStatusLinks{} }
func (m *UnfurledStatusLinks) String() string { return proto.CompactTextString(m) }
func (*UnfurledStatusLinks) ProtoMessage() {}
func (*UnfurledStatusLinks) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{16}
}
func (m *UnfurledStatusLinks) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnfurledStatusLinks.Unmarshal(m, b)
}
func (m *UnfurledStatusLinks) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UnfurledStatusLinks.Marshal(b, m, deterministic)
}
func (m *UnfurledStatusLinks) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnfurledStatusLinks.Merge(m, src)
}
func (m *UnfurledStatusLinks) XXX_Size() int {
return xxx_messageInfo_UnfurledStatusLinks.Size(m)
}
func (m *UnfurledStatusLinks) XXX_DiscardUnknown() {
xxx_messageInfo_UnfurledStatusLinks.DiscardUnknown(m)
}
var xxx_messageInfo_UnfurledStatusLinks proto.InternalMessageInfo
func (m *UnfurledStatusLinks) GetUnfurledStatusLinks() []*UnfurledStatusLink {
if m != nil {
return m.UnfurledStatusLinks
}
return nil
}
type ChatMessage struct {
// Lamport timestamp of the chat message
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
@ -1019,6 +1455,7 @@ type ChatMessage struct {
ContactRequestPropagatedState *ContactRequestPropagatedState `protobuf:"bytes,15,opt,name=contact_request_propagated_state,json=contactRequestPropagatedState,proto3" json:"contact_request_propagated_state,omitempty"`
UnfurledLinks []*UnfurledLink `protobuf:"bytes,16,rep,name=unfurled_links,json=unfurledLinks,proto3" json:"unfurled_links,omitempty"`
Shard *Shard `protobuf:"bytes,17,opt,name=shard,proto3" json:"shard,omitempty"`
UnfurledStatusLinks *UnfurledStatusLinks `protobuf:"bytes,18,opt,name=unfurled_status_links,json=unfurledStatusLinks,proto3" json:"unfurled_status_links,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1028,7 +1465,7 @@ func (m *ChatMessage) Reset() { *m = ChatMessage{} }
func (m *ChatMessage) String() string { return proto.CompactTextString(m) }
func (*ChatMessage) ProtoMessage() {}
func (*ChatMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_263952f55fd35689, []int{11}
return fileDescriptor_263952f55fd35689, []int{17}
}
func (m *ChatMessage) XXX_Unmarshal(b []byte) error {
@ -1216,6 +1653,13 @@ func (m *ChatMessage) GetShard() *Shard {
return nil
}
func (m *ChatMessage) GetUnfurledStatusLinks() *UnfurledStatusLinks {
if m != nil {
return m.UnfurledStatusLinks
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*ChatMessage) XXX_OneofWrappers() []interface{} {
return []interface{}{
@ -1241,7 +1685,13 @@ func init() {
proto.RegisterType((*DiscordMessageAuthor)(nil), "protobuf.DiscordMessageAuthor")
proto.RegisterType((*DiscordMessageReference)(nil), "protobuf.DiscordMessageReference")
proto.RegisterType((*DiscordMessageAttachment)(nil), "protobuf.DiscordMessageAttachment")
proto.RegisterType((*UnfurledLinkThumbnail)(nil), "protobuf.UnfurledLinkThumbnail")
proto.RegisterType((*UnfurledLink)(nil), "protobuf.UnfurledLink")
proto.RegisterType((*UnfurledStatusContactLink)(nil), "protobuf.UnfurledStatusContactLink")
proto.RegisterType((*UnfurledStatusCommunityLink)(nil), "protobuf.UnfurledStatusCommunityLink")
proto.RegisterType((*UnfurledStatusChannelLink)(nil), "protobuf.UnfurledStatusChannelLink")
proto.RegisterType((*UnfurledStatusLink)(nil), "protobuf.UnfurledStatusLink")
proto.RegisterType((*UnfurledStatusLinks)(nil), "protobuf.UnfurledStatusLinks")
proto.RegisterType((*ChatMessage)(nil), "protobuf.ChatMessage")
}
@ -1250,101 +1700,120 @@ func init() {
}
var fileDescriptor_263952f55fd35689 = []byte{
// 1523 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x4f, 0x73, 0xe3, 0x4a,
0x11, 0x8f, 0xff, 0x5b, 0x2d, 0xdb, 0xd1, 0xce, 0xe6, 0x65, 0xf5, 0xb6, 0x5e, 0x5e, 0xbc, 0x66,
0xa9, 0x0d, 0x05, 0x65, 0xaa, 0xf6, 0x3d, 0xa8, 0x57, 0x45, 0x51, 0x94, 0x62, 0xeb, 0x25, 0x62,
0xe3, 0x3f, 0x8c, 0xe5, 0x3c, 0xc2, 0x45, 0xa5, 0x48, 0x93, 0x58, 0x15, 0x59, 0x32, 0xd2, 0x18,
0x30, 0x27, 0xbe, 0x11, 0x37, 0x4e, 0x1c, 0x39, 0x70, 0xe0, 0xca, 0x57, 0xe0, 0x13, 0xf0, 0x01,
0xa8, 0x99, 0xd1, 0x5f, 0x93, 0x64, 0x61, 0x2f, 0xc9, 0x74, 0x4f, 0x77, 0xab, 0xe7, 0x37, 0x3d,
0xfd, 0x6b, 0x03, 0x72, 0x56, 0x36, 0xb5, 0xd6, 0x24, 0x8e, 0xed, 0x7b, 0x32, 0xdc, 0x44, 0x21,
0x0d, 0x51, 0x9b, 0xff, 0xbb, 0xdd, 0xde, 0xbd, 0x96, 0x49, 0xb0, 0x5d, 0xc7, 0x42, 0xfd, 0xba,
0xeb, 0x84, 0x01, 0xb5, 0x1d, 0x9a, 0x88, 0x72, 0xbc, 0xb2, 0x23, 0x57, 0x08, 0x83, 0x6f, 0xa0,
0xb7, 0xa0, 0x9e, 0xf3, 0x40, 0xa2, 0x89, 0x08, 0x85, 0x10, 0xd4, 0x57, 0x76, 0xbc, 0x52, 0x2b,
0xfd, 0xca, 0x99, 0x84, 0xf9, 0x9a, 0xe9, 0x36, 0xb6, 0xf3, 0xa0, 0x56, 0xfb, 0x95, 0xb3, 0x06,
0xe6, 0xeb, 0xc1, 0xdf, 0x2b, 0xd0, 0x31, 0xd6, 0xf6, 0x3d, 0x49, 0x1d, 0x55, 0x68, 0x6d, 0xec,
0x9d, 0x1f, 0xda, 0x2e, 0xf7, 0xed, 0xe0, 0x54, 0x44, 0xef, 0xa0, 0x4e, 0x77, 0x1b, 0xc2, 0xdd,
0x7b, 0xef, 0x5f, 0x0e, 0xd3, 0x34, 0x87, 0xdc, 0xdf, 0xdc, 0x6d, 0x08, 0xe6, 0x06, 0xe8, 0x73,
0x68, 0xdb, 0xfe, 0xed, 0x76, 0x6d, 0x79, 0xae, 0x5a, 0xe3, 0xdf, 0x6f, 0x71, 0xd9, 0x70, 0xd1,
0x11, 0x34, 0x7e, 0xef, 0xb9, 0x74, 0xa5, 0xd6, 0xfb, 0x95, 0xb3, 0x2e, 0x16, 0x02, 0x3a, 0x86,
0xe6, 0x8a, 0x78, 0xf7, 0x2b, 0xaa, 0x36, 0xb8, 0x3a, 0x91, 0xd0, 0x8f, 0x00, 0x25, 0x81, 0xd8,
0x17, 0x62, 0xcb, 0x09, 0xb7, 0x01, 0x55, 0x9b, 0xdc, 0x46, 0x11, 0x21, 0xf9, 0xc6, 0x88, 0xe9,
0x07, 0x7f, 0xa9, 0x40, 0x47, 0xdb, 0xba, 0x5e, 0xf8, 0xf1, 0xa3, 0x7c, 0x5d, 0x3a, 0x4a, 0x3f,
0x3f, 0x4a, 0xd1, 0x5f, 0x08, 0x85, 0x73, 0x9d, 0x82, 0xec, 0x6e, 0x23, 0x9b, 0x7a, 0x61, 0x60,
0xad, 0x63, 0x7e, 0xb4, 0x3a, 0x86, 0x54, 0x35, 0x89, 0x07, 0x3f, 0x01, 0x29, 0xf3, 0x41, 0xc7,
0x80, 0x96, 0xd3, 0x0f, 0xd3, 0xd9, 0x77, 0x53, 0x4b, 0x5b, 0x8e, 0x8d, 0x99, 0x65, 0xde, 0xcc,
0x75, 0xe5, 0x00, 0xb5, 0xa0, 0xa6, 0x69, 0x23, 0xa5, 0xc2, 0x17, 0x13, 0xac, 0x54, 0x07, 0x7f,
0xab, 0x82, 0xac, 0xbb, 0x1e, 0x4d, 0xf3, 0x3e, 0x82, 0x86, 0xe3, 0x87, 0xce, 0x03, 0xcf, 0xba,
0x8e, 0x85, 0xc0, 0x6e, 0x8f, 0x92, 0x3f, 0x50, 0x9e, 0xb3, 0x84, 0xf9, 0x1a, 0xbd, 0x82, 0x16,
0x2f, 0xa0, 0x0c, 0xe8, 0x26, 0x13, 0x0d, 0x17, 0x9d, 0x00, 0x24, 0x45, 0xc5, 0xf6, 0xea, 0x7c,
0x4f, 0x4a, 0x34, 0xe2, 0x1a, 0xee, 0x23, 0x3b, 0x10, 0x78, 0x77, 0xb0, 0x10, 0xd0, 0x37, 0xd0,
0x49, 0x9d, 0x38, 0x3a, 0x4d, 0x8e, 0xce, 0x67, 0x39, 0x3a, 0x49, 0x82, 0x1c, 0x12, 0x79, 0x9d,
0x0b, 0x68, 0x0c, 0x1d, 0x56, 0x9d, 0x24, 0xa0, 0xc2, 0xb3, 0xc5, 0x3d, 0xdf, 0xe4, 0x9e, 0xa3,
0x95, 0x9d, 0x1e, 0x6f, 0x38, 0x12, 0x96, 0x22, 0x8a, 0x93, 0x0b, 0xe8, 0xe7, 0xd0, 0xdb, 0x06,
0x77, 0xdb, 0xc8, 0x27, 0xae, 0xe5, 0x7b, 0xc1, 0x43, 0xac, 0xb6, 0xfb, 0xb5, 0x33, 0xf9, 0xfd,
0x71, 0x1e, 0x67, 0x99, 0xec, 0x5f, 0x79, 0xc1, 0x03, 0xee, 0x6e, 0x0b, 0x52, 0x3c, 0xf8, 0x47,
0x05, 0xba, 0x63, 0xe2, 0x13, 0x4a, 0x9e, 0x07, 0xb2, 0x00, 0x5a, 0xf5, 0x19, 0xd0, 0x6a, 0x4f,
0x82, 0x56, 0x7f, 0x0e, 0xb4, 0xc6, 0xff, 0x0c, 0xda, 0x09, 0x80, 0xcb, 0xd3, 0x75, 0xad, 0xdb,
0x1d, 0x07, 0x5b, 0xc2, 0x52, 0xa2, 0x39, 0xdf, 0x0d, 0x26, 0x70, 0xbc, 0xd8, 0x05, 0x8e, 0x38,
0xd1, 0xb7, 0x61, 0x34, 0xf9, 0xc8, 0xb1, 0xca, 0xd9, 0x57, 0xf7, 0xb2, 0x1f, 0xfc, 0xb3, 0x0a,
0xbd, 0xb1, 0x17, 0x3b, 0x61, 0xe4, 0xa6, 0x71, 0x7a, 0x50, 0xf5, 0xdc, 0xa4, 0x43, 0x54, 0x3d,
0x97, 0x57, 0x58, 0xfa, 0x2a, 0xa4, 0xa4, 0xe6, 0xbf, 0x00, 0x89, 0x7a, 0x6b, 0x12, 0x53, 0x7b,
0xbd, 0x49, 0x21, 0xc9, 0x14, 0xe8, 0x0c, 0x0e, 0x33, 0x81, 0x55, 0x30, 0x49, 0x6b, 0x6d, 0x5f,
0xcd, 0xde, 0x62, 0x72, 0xd5, 0x1c, 0x21, 0x09, 0xa7, 0x22, 0xfa, 0x29, 0x34, 0xed, 0x2d, 0x5d,
0x85, 0x11, 0x87, 0x40, 0x7e, 0xff, 0x65, 0x0e, 0x5d, 0x39, 0x5f, 0x8d, 0x5b, 0xe1, 0xc4, 0x1a,
0xfd, 0x02, 0xa4, 0x88, 0xdc, 0x91, 0x88, 0x04, 0x8e, 0x28, 0x38, 0xb9, 0x58, 0x70, 0x65, 0x57,
0x9c, 0x1a, 0xe2, 0xdc, 0x07, 0x8d, 0x41, 0xb6, 0x29, 0xb5, 0x9d, 0xd5, 0x9a, 0x04, 0x34, 0xad,
0xb5, 0xc1, 0x93, 0x5f, 0xcf, 0x4c, 0x71, 0xd1, 0x6d, 0xf0, 0xaf, 0x0a, 0x1c, 0x3d, 0x96, 0xe7,
0x63, 0xe8, 0x06, 0xf6, 0x3a, 0x43, 0x97, 0xad, 0xd1, 0x5b, 0xe8, 0xba, 0x5e, 0xec, 0x44, 0xde,
0xda, 0x0b, 0x6c, 0x1a, 0x46, 0x09, 0xc2, 0x65, 0x25, 0x7a, 0x0d, 0xed, 0xc0, 0x73, 0x1e, 0xb8,
0xb7, 0x80, 0x37, 0x93, 0xd9, 0xfd, 0xd8, 0xbf, 0xb3, 0xa9, 0x1d, 0x2d, 0x23, 0x3f, 0x41, 0x36,
0x57, 0xa0, 0x21, 0x20, 0x21, 0xf0, 0x3e, 0x39, 0x4f, 0x9a, 0x61, 0x93, 0xd7, 0xef, 0x23, 0x3b,
0xec, 0x4b, 0x7e, 0xe8, 0xd8, 0x3e, 0x0b, 0xd6, 0x12, 0x5f, 0x4a, 0xe5, 0x41, 0x08, 0xaf, 0x9e,
0x00, 0x95, 0x25, 0x91, 0x15, 0x5a, 0x72, 0xe2, 0xc2, 0xbb, 0xf9, 0x02, 0x24, 0x67, 0x65, 0x07,
0x01, 0xf1, 0x8d, 0xac, 0x2e, 0x33, 0x05, 0x2b, 0x8c, 0xfb, 0xad, 0xe7, 0xbb, 0x46, 0xc6, 0x15,
0x89, 0x38, 0xf8, 0x77, 0x05, 0xd4, 0xa7, 0xee, 0xe0, 0xbf, 0xd0, 0x2d, 0xa5, 0xb0, 0x5f, 0xfc,
0x48, 0x81, 0xda, 0x36, 0xf2, 0x93, 0x0f, 0xb0, 0x25, 0x3b, 0xe9, 0x9d, 0xe7, 0x93, 0x69, 0x01,
0xd3, 0x54, 0x66, 0xb7, 0xc2, 0xd6, 0x0b, 0xef, 0x8f, 0xe4, 0x7c, 0x47, 0x49, 0xcc, 0x71, 0xad,
0xe3, 0xb2, 0x12, 0xf5, 0xa1, 0xd8, 0xbc, 0x92, 0xf7, 0x5b, 0xea, 0x67, 0x05, 0xfe, 0x69, 0x95,
0xf9, 0xa7, 0x88, 0x73, 0x7b, 0x0f, 0xe7, 0x3f, 0x57, 0xa1, 0x53, 0x6c, 0x73, 0x69, 0xf2, 0x95,
0x3c, 0xf9, 0x23, 0x68, 0x50, 0x8f, 0xfa, 0x69, 0x2d, 0x09, 0x81, 0x25, 0xe4, 0x12, 0x56, 0x37,
0x1b, 0x46, 0x47, 0xc9, 0x61, 0x8b, 0x2a, 0xf4, 0x43, 0x78, 0x41, 0x57, 0xdb, 0xf5, 0x6d, 0x60,
0x7b, 0xbe, 0x95, 0xa6, 0x26, 0xba, 0x99, 0x92, 0x6d, 0xcc, 0x33, 0xba, 0x3f, 0xcc, 0x8d, 0x05,
0x69, 0x0b, 0x76, 0xee, 0x65, 0xea, 0xef, 0x38, 0x7b, 0xff, 0x00, 0x72, 0x67, 0x2b, 0xe1, 0x71,
0xc1, 0xd1, 0x79, 0x80, 0x4b, 0x41, 0xe8, 0x5f, 0x25, 0x1d, 0x46, 0xf0, 0xc3, 0xe9, 0xe3, 0x7d,
0x7d, 0xc8, 0xfe, 0xe4, 0xb4, 0x3b, 0x38, 0x85, 0x76, 0xaa, 0x41, 0x6d, 0xa8, 0x5f, 0x19, 0xd3,
0x0f, 0xca, 0x01, 0x92, 0xa0, 0x61, 0x4c, 0xb4, 0x0b, 0x5d, 0xa9, 0x0c, 0xfe, 0x04, 0x20, 0x17,
0x08, 0xe6, 0x89, 0xfe, 0x58, 0xea, 0x64, 0x55, 0xbe, 0x53, 0xe8, 0x64, 0x29, 0xbb, 0xd6, 0x0a,
0xec, 0x7a, 0x0a, 0x72, 0x44, 0xe2, 0x4d, 0x18, 0xc4, 0xc4, 0xa2, 0x61, 0x52, 0x26, 0x90, 0xaa,
0xcc, 0x90, 0x0d, 0x3a, 0x24, 0x88, 0x2d, 0xfe, 0x30, 0x93, 0xae, 0x46, 0x82, 0x98, 0xd7, 0x50,
0x81, 0x64, 0x9a, 0x25, 0x92, 0xd9, 0xe7, 0x8b, 0xd6, 0x27, 0x93, 0x6c, 0xfb, 0x93, 0x48, 0xf6,
0x6b, 0x68, 0xc5, 0x62, 0x54, 0x54, 0x25, 0xde, 0x34, 0xd5, 0x3c, 0x40, 0x79, 0x86, 0xbc, 0x3c,
0xc0, 0xa9, 0x29, 0x1a, 0x42, 0x83, 0xcf, 0x60, 0x2a, 0x70, 0x9f, 0xe3, 0xbd, 0xe1, 0x2f, 0xf7,
0x10, 0x66, 0xcc, 0xde, 0x66, 0x93, 0x90, 0x2a, 0xef, 0xdb, 0x17, 0x27, 0x2c, 0x66, 0xcf, 0xcd,
0xd0, 0x97, 0x20, 0x39, 0xe1, 0x7a, 0xbd, 0x0d, 0x3c, 0xba, 0x53, 0x3b, 0xac, 0x22, 0x2f, 0x0f,
0x70, 0xae, 0x42, 0x23, 0x38, 0x74, 0x45, 0x2b, 0x48, 0x87, 0x65, 0xd5, 0xd9, 0xcf, 0xbe, 0xdc,
0x2b, 0x2e, 0x0f, 0x70, 0xcf, 0x2d, 0xf3, 0x5d, 0x46, 0xe0, 0xdd, 0x22, 0x81, 0xbf, 0x81, 0x8e,
0xeb, 0xc5, 0x1b, 0xdf, 0xde, 0x89, 0x8b, 0xec, 0x25, 0xef, 0x46, 0xe8, 0xf8, 0x65, 0x6e, 0xa0,
0x9f, 0x0c, 0xdf, 0x56, 0x44, 0x7e, 0xbb, 0x25, 0x31, 0xb5, 0x36, 0x51, 0xb8, 0xb1, 0xef, 0x6d,
0x46, 0xde, 0x31, 0xb5, 0x29, 0x51, 0x0f, 0x79, 0x3a, 0xef, 0x0a, 0xb7, 0x21, 0x3c, 0xb0, 0x70,
0x98, 0x67, 0xf6, 0x0b, 0x66, 0x8e, 0x4f, 0x9c, 0xe7, 0xb6, 0x1f, 0x19, 0x85, 0x94, 0xff, 0x63,
0x14, 0x42, 0xdf, 0x87, 0x06, 0xff, 0x79, 0xa0, 0xbe, 0xe0, 0x59, 0x1d, 0x16, 0xae, 0x98, 0xa9,
0xb1, 0xd8, 0x1d, 0xfc, 0xb5, 0x06, 0xf2, 0xa8, 0xd4, 0xb0, 0x8e, 0xd2, 0x91, 0x75, 0x34, 0x9b,
0x9a, 0xfa, 0xd4, 0x4c, 0x87, 0xd6, 0x1e, 0x80, 0xa9, 0xff, 0xda, 0xb4, 0xe6, 0x57, 0x9a, 0x31,
0x55, 0x2a, 0x48, 0x86, 0xd6, 0xc2, 0x34, 0x46, 0x1f, 0x74, 0xac, 0x54, 0x11, 0x40, 0x73, 0x61,
0x6a, 0xe6, 0x72, 0xa1, 0xd4, 0xd8, 0xb3, 0xd4, 0x27, 0xb3, 0x5f, 0x1a, 0x4a, 0x1d, 0xbd, 0x82,
0x97, 0x26, 0xd6, 0xa6, 0x0b, 0x6d, 0x64, 0x1a, 0x33, 0x16, 0x71, 0x32, 0xd1, 0xa6, 0x63, 0xa5,
0x81, 0xce, 0xe0, 0xed, 0xe2, 0x66, 0x61, 0xea, 0x13, 0x6b, 0xa2, 0x2f, 0x16, 0xda, 0x85, 0x9e,
0x7d, 0x6d, 0x8e, 0x8d, 0x6b, 0xcd, 0xd4, 0xad, 0x0b, 0x3c, 0x5b, 0xce, 0x95, 0x66, 0xfe, 0xc8,
0x5b, 0x6c, 0xc9, 0xc7, 0x68, 0xa5, 0x8d, 0xba, 0x20, 0xb1, 0x60, 0xcb, 0xa9, 0x61, 0xde, 0x28,
0x12, 0x1b, 0xb4, 0xf7, 0xc2, 0x5d, 0x68, 0x73, 0x05, 0xd0, 0x4b, 0x38, 0x64, 0x71, 0xb5, 0x91,
0x69, 0x61, 0xfd, 0x57, 0x4b, 0x7d, 0x61, 0x2a, 0x32, 0x53, 0x8e, 0x8d, 0xc5, 0x68, 0x86, 0xc7,
0xa9, 0xb5, 0xd2, 0x41, 0x9f, 0xc3, 0x67, 0xc6, 0x58, 0x9f, 0x9a, 0x86, 0x79, 0x63, 0x5d, 0xeb,
0xd8, 0xf8, 0xd6, 0x18, 0x69, 0x2c, 0x67, 0xa5, 0x8b, 0xde, 0xc0, 0xc9, 0x5e, 0xf0, 0xb9, 0x31,
0x9d, 0xea, 0xb9, 0x77, 0x0f, 0xbd, 0x85, 0xfe, 0x9e, 0xc9, 0x64, 0x69, 0x2e, 0xb5, 0x2b, 0x4b,
0xbf, 0x66, 0x67, 0x5a, 0xe8, 0x53, 0x53, 0x39, 0x7c, 0xe4, 0xd0, 0x25, 0x2b, 0x6d, 0x34, 0xd2,
0xe7, 0xa6, 0x3e, 0x56, 0x14, 0xf4, 0x0e, 0xbe, 0xf7, 0x9c, 0x25, 0xd6, 0x27, 0xb3, 0x6b, 0x7d,
0xac, 0xbc, 0x38, 0x97, 0x32, 0x7e, 0x39, 0xef, 0xfe, 0x46, 0x1e, 0xfe, 0xf8, 0x67, 0xe9, 0x2d,
0xdf, 0x36, 0xf9, 0xea, 0xab, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x18, 0x95, 0x9c, 0x97, 0x5f,
0x0e, 0x00, 0x00,
// 1840 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xdd, 0x92, 0xdb, 0x58,
0x11, 0x1e, 0xff, 0x8f, 0x5a, 0xb6, 0x47, 0x39, 0x33, 0x99, 0x38, 0x21, 0xb3, 0x71, 0x94, 0x6c,
0x65, 0x28, 0xa8, 0xa1, 0x6a, 0xb2, 0xc0, 0x56, 0x51, 0xd4, 0x96, 0x62, 0x6b, 0x13, 0x91, 0xd8,
0xe3, 0x95, 0xe5, 0x2c, 0xe1, 0x46, 0xa5, 0x91, 0x4e, 0xc6, 0x62, 0xf4, 0x63, 0xf4, 0x03, 0x98,
0x17, 0xe1, 0x2d, 0xe0, 0x86, 0xe2, 0x8a, 0x07, 0xe0, 0x82, 0x3b, 0x8a, 0x57, 0xe0, 0x09, 0xb8,
0xe2, 0x8a, 0x3a, 0x3f, 0xfa, 0xf3, 0xd8, 0x93, 0x4d, 0x8a, 0x2b, 0xab, 0xfb, 0x74, 0x9f, 0xd3,
0xfd, 0x75, 0x9f, 0x3e, 0xdd, 0x06, 0x64, 0x2f, 0xad, 0xc4, 0xf4, 0x71, 0x1c, 0x5b, 0x57, 0xf8,
0x6c, 0x15, 0x85, 0x49, 0x88, 0xf6, 0xe9, 0xcf, 0x65, 0xfa, 0xfe, 0x81, 0x88, 0x83, 0xd4, 0x8f,
0x19, 0xfb, 0x41, 0xcf, 0x0e, 0x83, 0xc4, 0xb2, 0x13, 0x4e, 0x8a, 0xf1, 0xd2, 0x8a, 0x1c, 0x46,
0xc8, 0x5f, 0x42, 0x7f, 0x9e, 0xb8, 0xf6, 0x35, 0x8e, 0x26, 0x6c, 0x2b, 0x84, 0xa0, 0xb9, 0xb4,
0xe2, 0xe5, 0xa0, 0x36, 0xac, 0x9d, 0x0a, 0x3a, 0xfd, 0x26, 0xbc, 0x95, 0x65, 0x5f, 0x0f, 0xea,
0xc3, 0xda, 0x69, 0x4b, 0xa7, 0xdf, 0xf2, 0xdf, 0x6b, 0xd0, 0xd5, 0x7c, 0xeb, 0x0a, 0x67, 0x8a,
0x03, 0xe8, 0xac, 0xac, 0xb5, 0x17, 0x5a, 0x0e, 0xd5, 0xed, 0xea, 0x19, 0x89, 0x9e, 0x41, 0x33,
0x59, 0xaf, 0x30, 0x55, 0xef, 0x9f, 0x1f, 0x9e, 0x65, 0x66, 0x9e, 0x51, 0x7d, 0x63, 0xbd, 0xc2,
0x3a, 0x15, 0x40, 0xf7, 0x61, 0xdf, 0xf2, 0x2e, 0x53, 0xdf, 0x74, 0x9d, 0x41, 0x83, 0x9e, 0xdf,
0xa1, 0xb4, 0xe6, 0xa0, 0x23, 0x68, 0xfd, 0xce, 0x75, 0x92, 0xe5, 0xa0, 0x39, 0xac, 0x9d, 0xf6,
0x74, 0x46, 0xa0, 0x63, 0x68, 0x2f, 0xb1, 0x7b, 0xb5, 0x4c, 0x06, 0x2d, 0xca, 0xe6, 0x14, 0xfa,
0x21, 0x20, 0xbe, 0x11, 0x39, 0x21, 0x36, 0xed, 0x30, 0x0d, 0x92, 0x41, 0x9b, 0xca, 0x48, 0x6c,
0x4b, 0xba, 0x30, 0x22, 0x7c, 0xf9, 0xaf, 0x35, 0xe8, 0x2a, 0xa9, 0xe3, 0x86, 0x1f, 0x76, 0xe5,
0x8b, 0x8a, 0x2b, 0xc3, 0xc2, 0x95, 0xb2, 0x3e, 0x23, 0x4a, 0x7e, 0x3d, 0x02, 0xd1, 0x49, 0x23,
0x2b, 0x71, 0xc3, 0xc0, 0xf4, 0x63, 0xea, 0x5a, 0x53, 0x87, 0x8c, 0x35, 0x89, 0xe5, 0x1f, 0x83,
0x90, 0xeb, 0xa0, 0x63, 0x40, 0x8b, 0xe9, 0xeb, 0xe9, 0xc5, 0xb7, 0x53, 0x53, 0x59, 0x8c, 0xb5,
0x0b, 0xd3, 0x78, 0x37, 0x53, 0xa5, 0x3d, 0xd4, 0x81, 0x86, 0xa2, 0x8c, 0xa4, 0x1a, 0xfd, 0x98,
0xe8, 0x52, 0x5d, 0xfe, 0x63, 0x03, 0x44, 0xd5, 0x71, 0x93, 0xcc, 0xee, 0x23, 0x68, 0xd9, 0x5e,
0x68, 0x5f, 0x53, 0xab, 0x9b, 0x3a, 0x23, 0x48, 0xf4, 0x12, 0xfc, 0xfb, 0x84, 0xda, 0x2c, 0xe8,
0xf4, 0x1b, 0xdd, 0x83, 0x0e, 0x4d, 0xa0, 0x1c, 0xe8, 0x36, 0x21, 0x35, 0x07, 0x9d, 0x00, 0xf0,
0xa4, 0x22, 0x6b, 0x4d, 0xba, 0x26, 0x70, 0x0e, 0x0b, 0xc3, 0x55, 0x64, 0x05, 0x0c, 0xef, 0xae,
0xce, 0x08, 0xf4, 0x25, 0x74, 0x33, 0x25, 0x8a, 0x4e, 0x9b, 0xa2, 0x73, 0xb7, 0x40, 0x87, 0x1b,
0x48, 0x21, 0x11, 0xfd, 0x82, 0x40, 0x63, 0xe8, 0x92, 0xec, 0xc4, 0x41, 0xc2, 0x34, 0x3b, 0x54,
0xf3, 0x71, 0xa1, 0x39, 0x5a, 0x5a, 0x99, 0x7b, 0x67, 0x23, 0x26, 0xc9, 0x76, 0xb1, 0x0b, 0x02,
0xfd, 0x1c, 0xfa, 0x69, 0xf0, 0x3e, 0x8d, 0x3c, 0xec, 0x98, 0x9e, 0x1b, 0x5c, 0xc7, 0x83, 0xfd,
0x61, 0xe3, 0x54, 0x3c, 0x3f, 0x2e, 0xf6, 0x59, 0xf0, 0xf5, 0x37, 0x6e, 0x70, 0xad, 0xf7, 0xd2,
0x12, 0x15, 0xa3, 0x6f, 0xe0, 0x6e, 0xae, 0x1e, 0x27, 0x56, 0x92, 0xc6, 0x7c, 0x17, 0x61, 0x58,
0x3b, 0x15, 0xcf, 0x4f, 0x6e, 0xee, 0x32, 0xa7, 0x52, 0x54, 0x5b, 0x3f, 0x4c, 0x6f, 0x32, 0xe5,
0x7f, 0xd4, 0xa0, 0x37, 0xc6, 0x1e, 0x4e, 0xf0, 0xed, 0xb1, 0x29, 0xc5, 0xa1, 0x7e, 0x4b, 0x1c,
0x1a, 0x3b, 0xe3, 0xd0, 0xbc, 0x2d, 0x0e, 0xad, 0xef, 0x1c, 0x87, 0x13, 0x00, 0x87, 0x9a, 0xeb,
0x98, 0x97, 0x6b, 0x1a, 0x3f, 0x41, 0x17, 0x38, 0xe7, 0xc5, 0x5a, 0x9e, 0xc0, 0xf1, 0x7c, 0x1d,
0xd8, 0xcc, 0xa3, 0xaf, 0xc3, 0x68, 0xf2, 0x01, 0xb7, 0xaa, 0xd6, 0xd7, 0x37, 0xac, 0x97, 0xff,
0x55, 0x87, 0xfe, 0xd8, 0x8d, 0xed, 0x30, 0x72, 0xb2, 0x7d, 0xfa, 0x50, 0x77, 0x1d, 0x5e, 0x74,
0xea, 0xae, 0x43, 0x93, 0x36, 0xbb, 0x68, 0x02, 0xbf, 0x46, 0x0f, 0x41, 0x48, 0x5c, 0x1f, 0xc7,
0x89, 0xe5, 0xaf, 0x32, 0x48, 0x72, 0x06, 0x3a, 0x85, 0x83, 0x9c, 0x20, 0x97, 0x02, 0x67, 0xe9,
0xbb, 0xc9, 0x26, 0xd7, 0x9b, 0x67, 0x0f, 0x45, 0x48, 0xd0, 0x33, 0x12, 0xfd, 0x04, 0xda, 0x56,
0x9a, 0x2c, 0xc3, 0x88, 0x42, 0x20, 0x9e, 0x7f, 0x56, 0x40, 0x57, 0xb5, 0x57, 0xa1, 0x52, 0x3a,
0x97, 0x46, 0x5f, 0x81, 0x10, 0xe1, 0xf7, 0x38, 0xc2, 0x81, 0xcd, 0x72, 0x58, 0x2c, 0xe7, 0x70,
0x55, 0x55, 0xcf, 0x04, 0xf5, 0x42, 0x07, 0x8d, 0x41, 0xb4, 0x92, 0xc4, 0xb2, 0x97, 0x3e, 0x0e,
0x92, 0x2c, 0x7d, 0xe5, 0x9d, 0xa7, 0xe7, 0xa2, 0x7a, 0x59, 0x4d, 0xfe, 0x77, 0x0d, 0x8e, 0xb6,
0xd9, 0xb9, 0x0d, 0xdd, 0xc0, 0xf2, 0x73, 0x74, 0xc9, 0x37, 0x7a, 0x0a, 0x3d, 0xc7, 0x8d, 0xed,
0xc8, 0xf5, 0xdd, 0xc0, 0x4a, 0xc2, 0x88, 0x23, 0x5c, 0x65, 0xa2, 0x07, 0xb0, 0x1f, 0xb8, 0xf6,
0x35, 0xd5, 0x66, 0xf0, 0xe6, 0x34, 0x89, 0x8f, 0xf5, 0x5b, 0x2b, 0xb1, 0xa2, 0x45, 0xe4, 0x71,
0x64, 0x0b, 0x06, 0x3a, 0x03, 0xc4, 0x08, 0x5a, 0x7a, 0x67, 0xbc, 0xbe, 0xb6, 0x69, 0xfe, 0x6e,
0x59, 0x21, 0x27, 0x79, 0xa1, 0x6d, 0x79, 0x64, 0xb3, 0x0e, 0x3b, 0x29, 0xa3, 0xe5, 0x10, 0xee,
0xed, 0x00, 0x95, 0x18, 0x91, 0x27, 0x1a, 0xf7, 0xb8, 0x74, 0x6f, 0x1e, 0x82, 0x60, 0x2f, 0xad,
0x20, 0xc0, 0x9e, 0x96, 0xe7, 0x65, 0xce, 0x20, 0x89, 0x71, 0x95, 0xba, 0x9e, 0xa3, 0xe5, 0xcf,
0x0f, 0x27, 0xe5, 0xff, 0xd4, 0x60, 0xb0, 0x2b, 0x06, 0x37, 0xd0, 0xad, 0x98, 0xb0, 0x99, 0xfc,
0x48, 0x82, 0x46, 0x1a, 0x79, 0xfc, 0x00, 0xf2, 0x49, 0x3c, 0x7d, 0xef, 0x7a, 0x78, 0x5a, 0xc2,
0x34, 0xa3, 0x49, 0x54, 0xc8, 0xf7, 0xdc, 0xfd, 0x03, 0x7e, 0xb1, 0x4e, 0x70, 0x4c, 0x71, 0x6d,
0xea, 0x55, 0x26, 0x1a, 0x42, 0xb9, 0x1e, 0xf2, 0xfb, 0x5b, 0x29, 0x91, 0xa5, 0x27, 0xad, 0x53,
0x7d, 0xd2, 0xca, 0x38, 0xef, 0x6f, 0xe0, 0x6c, 0xc2, 0xdd, 0x72, 0xe1, 0x34, 0x96, 0xa9, 0x7f,
0x19, 0x58, 0xae, 0x77, 0xcb, 0x0b, 0x99, 0x3f, 0xd4, 0xf5, 0xed, 0x0f, 0x75, 0xa3, 0xfc, 0x50,
0xcb, 0x7f, 0xae, 0x43, 0xb7, 0x7c, 0x42, 0x86, 0x4e, 0xad, 0x40, 0xe7, 0x08, 0x5a, 0x89, 0x9b,
0x78, 0x59, 0xb2, 0x32, 0x82, 0x78, 0xec, 0x60, 0x92, 0x98, 0x2b, 0xf2, 0x84, 0x72, 0x34, 0xcb,
0x2c, 0xf4, 0x03, 0xb8, 0x93, 0x64, 0xf6, 0x9a, 0x99, 0xb1, 0xac, 0x5c, 0x4a, 0xf9, 0xc2, 0x2c,
0x6f, 0x51, 0x0e, 0x0a, 0x61, 0x66, 0x3f, 0xeb, 0x28, 0xfa, 0x39, 0xfb, 0x5b, 0xea, 0xc8, 0xf7,
0xa1, 0x50, 0x36, 0xb9, 0x4b, 0xac, 0xaf, 0x28, 0x36, 0x78, 0xc5, 0x9a, 0x90, 0xe7, 0xbc, 0x84,
0xb1, 0x37, 0xed, 0xd1, 0xf6, 0xb7, 0xe8, 0x8c, 0xe2, 0x9a, 0xb7, 0x0a, 0xf2, 0x23, 0xd8, 0xcf,
0x38, 0x68, 0x1f, 0x9a, 0x6f, 0xb4, 0xe9, 0x6b, 0x69, 0x0f, 0x09, 0xd0, 0xd2, 0x26, 0xca, 0x4b,
0x55, 0xaa, 0xc9, 0x7f, 0xa9, 0xc1, 0xfd, 0xea, 0x33, 0x34, 0x62, 0xed, 0x1d, 0x85, 0xef, 0x04,
0x60, 0x95, 0x5e, 0x7a, 0xae, 0x6d, 0x5e, 0xe3, 0x35, 0x0f, 0x8d, 0xc0, 0x38, 0xaf, 0xf1, 0x1a,
0x3d, 0x86, 0xae, 0xe3, 0xc6, 0x2b, 0xcf, 0x5a, 0x9b, 0xa5, 0xfb, 0x2f, 0x72, 0x1e, 0x4d, 0xb8,
0x0f, 0x03, 0xfb, 0x1c, 0x9a, 0xae, 0x1d, 0x06, 0x14, 0x4b, 0x71, 0x97, 0x5f, 0x79, 0xaa, 0xe8,
0x54, 0x58, 0xfe, 0x53, 0x1d, 0xbe, 0xb7, 0x69, 0xb6, 0xef, 0xa7, 0x81, 0x9b, 0xac, 0xa9, 0xe1,
0x8f, 0x49, 0x23, 0xc0, 0x19, 0xa6, 0x9b, 0x65, 0x95, 0x98, 0xf3, 0x34, 0xe7, 0xff, 0x63, 0xfc,
0x13, 0xe8, 0xf9, 0xd8, 0xbf, 0xc4, 0x51, 0xd6, 0x14, 0xb2, 0x7e, 0xb2, 0xcb, 0x99, 0xb4, 0x21,
0xa4, 0x8f, 0x5a, 0xe8, 0x85, 0x11, 0x2f, 0x62, 0x8c, 0xc8, 0xfd, 0xee, 0x7c, 0x84, 0xdf, 0xe8,
0xa7, 0xd0, 0xbe, 0x24, 0xe5, 0x25, 0xa2, 0x77, 0xeb, 0x3b, 0xa8, 0x71, 0x71, 0x52, 0x71, 0x36,
0xe3, 0xcc, 0xea, 0x54, 0x0e, 0x17, 0x23, 0xcd, 0x34, 0x2d, 0xc1, 0xc5, 0x78, 0x8b, 0xd4, 0xa5,
0x17, 0x11, 0xfb, 0xe1, 0xaf, 0xdd, 0xec, 0xde, 0x50, 0xe2, 0x06, 0x88, 0x8d, 0x0f, 0x82, 0xd8,
0xbc, 0x09, 0xe2, 0x76, 0x7c, 0x46, 0x20, 0xe4, 0xe1, 0xe2, 0xef, 0xe7, 0xe7, 0xbb, 0x5a, 0xa7,
0x4a, 0xf0, 0xf5, 0x42, 0x4f, 0xfe, 0x6f, 0x0d, 0xd0, 0xcd, 0x2e, 0x6b, 0x4b, 0x59, 0xf8, 0x8a,
0x3d, 0xe2, 0x96, 0xcd, 0x1a, 0x5b, 0xf1, 0xfc, 0xc9, 0xee, 0xb3, 0xf2, 0xfb, 0xf1, 0x6a, 0x4f,
0xcf, 0xb4, 0x90, 0x5a, 0x36, 0xb7, 0xf1, 0x11, 0xe6, 0xbe, 0xda, 0x2b, 0x19, 0x4c, 0xed, 0x60,
0xa8, 0xf3, 0x0b, 0xb1, 0xdb, 0x8e, 0x22, 0x7e, 0xd4, 0x0e, 0x46, 0xbe, 0x10, 0xf2, 0x52, 0x2a,
0x5f, 0xc1, 0xe1, 0x96, 0x0e, 0x13, 0xcd, 0x76, 0xf5, 0xa7, 0x35, 0xda, 0x26, 0x3c, 0xbc, 0xad,
0x3f, 0xdd, 0xde, 0x9e, 0xfe, 0x13, 0x40, 0x2c, 0x75, 0xd6, 0x3b, 0xba, 0xb8, 0x4a, 0xbf, 0x55,
0xa7, 0x2b, 0xa5, 0x7e, 0x2b, 0x1b, 0x2b, 0x1a, 0xa5, 0xb1, 0xe2, 0x11, 0x88, 0x11, 0x8e, 0x57,
0x61, 0x10, 0x63, 0x33, 0x09, 0x79, 0xea, 0x40, 0xc6, 0x32, 0x42, 0x32, 0xe1, 0xe1, 0x20, 0x66,
0xa9, 0xc7, 0x7b, 0x2f, 0x1c, 0xc4, 0x34, 0xed, 0x4a, 0xad, 0x70, 0xbb, 0xd2, 0x0a, 0x6f, 0x76,
0xb5, 0x9d, 0x4f, 0x9e, 0x2e, 0xf6, 0x3f, 0x69, 0xba, 0xf8, 0x02, 0x3a, 0x31, 0x9b, 0x91, 0xf9,
0x40, 0x30, 0x28, 0x36, 0xa8, 0x0e, 0xcf, 0x24, 0xac, 0x5c, 0x14, 0x9d, 0x41, 0x8b, 0x0e, 0x9f,
0x03, 0xa0, 0x3a, 0xc7, 0x1b, 0x53, 0x6f, 0xa1, 0xc1, 0xc4, 0x88, 0xbc, 0x45, 0x46, 0xc0, 0x81,
0xb8, 0x29, 0x5f, 0x1e, 0x2d, 0x89, 0x3c, 0x15, 0x43, 0x9f, 0x95, 0xd3, 0xb7, 0x4b, 0xae, 0x7f,
0x35, 0x2f, 0x47, 0x70, 0xe0, 0xb0, 0x86, 0x25, 0xfb, 0x97, 0x60, 0x60, 0x6f, 0x5a, 0x5f, 0xed,
0x68, 0x5e, 0xed, 0xe9, 0x7d, 0xa7, 0xda, 0x95, 0xe7, 0x63, 0x46, 0xaf, 0x3c, 0x66, 0x6c, 0xd6,
0x90, 0xfe, 0xcd, 0x1a, 0xb2, 0x82, 0x21, 0xbf, 0x67, 0x66, 0x84, 0x7f, 0x93, 0xe2, 0x38, 0x31,
0x57, 0x51, 0xb8, 0xb2, 0xae, 0xac, 0x84, 0x27, 0x31, 0x1e, 0x1c, 0x50, 0x73, 0x9e, 0x95, 0xa2,
0xc1, 0x34, 0x74, 0xa6, 0x30, 0xcb, 0xe5, 0x49, 0xe6, 0x62, 0xfd, 0xc4, 0xbe, 0x6d, 0x79, 0xcb,
0x0c, 0x28, 0x7d, 0xcc, 0x0c, 0xf8, 0x39, 0xb4, 0xe8, 0xff, 0x22, 0x83, 0x3b, 0xd4, 0xaa, 0x83,
0x52, 0x88, 0x09, 0x5b, 0x67, 0xab, 0xbb, 0x47, 0x45, 0xf4, 0xc9, 0xa3, 0xe2, 0xdf, 0x1a, 0x20,
0x8e, 0x2a, 0x9d, 0xda, 0x51, 0x36, 0xfe, 0x8f, 0x2e, 0xa6, 0x86, 0x3a, 0x35, 0xb2, 0x3f, 0x00,
0xfa, 0x00, 0x86, 0xfa, 0x4b, 0xc3, 0x9c, 0xbd, 0x51, 0xb4, 0xa9, 0x54, 0x43, 0x22, 0x74, 0xe6,
0x86, 0x36, 0x7a, 0xad, 0xea, 0x52, 0x1d, 0x01, 0xb4, 0xe7, 0x86, 0x62, 0x2c, 0xe6, 0x52, 0x83,
0xb4, 0x0b, 0xea, 0xe4, 0xe2, 0x17, 0x9a, 0xd4, 0x44, 0xf7, 0xe0, 0xd0, 0xd0, 0x95, 0xe9, 0x5c,
0x19, 0x19, 0xda, 0x05, 0xd9, 0x71, 0x32, 0x51, 0xa6, 0x63, 0xa9, 0x85, 0x4e, 0xe1, 0xe9, 0xfc,
0xdd, 0xdc, 0x50, 0x27, 0xe6, 0x44, 0x9d, 0xcf, 0x95, 0x97, 0x6a, 0x7e, 0xda, 0x4c, 0xd7, 0xde,
0x2a, 0x86, 0x6a, 0xbe, 0xd4, 0x2f, 0x16, 0x33, 0xa9, 0x5d, 0x34, 0x1f, 0x1d, 0xf2, 0x49, 0xff,
0x92, 0x90, 0xf6, 0x51, 0x0f, 0x04, 0xb2, 0xd9, 0x62, 0xaa, 0x19, 0xef, 0x24, 0x01, 0x1d, 0x03,
0xda, 0xd8, 0xee, 0xa5, 0x32, 0x93, 0x00, 0x1d, 0xc2, 0x01, 0xd9, 0x57, 0x19, 0x19, 0xa6, 0xae,
0x7e, 0xb3, 0x50, 0xe7, 0x86, 0x24, 0x12, 0xe6, 0x58, 0x9b, 0x8f, 0x2e, 0xf4, 0x71, 0x26, 0x2d,
0x75, 0xd1, 0x7d, 0xb8, 0xab, 0x8d, 0xd5, 0xa9, 0xa1, 0x19, 0xef, 0xcc, 0xb7, 0xaa, 0xae, 0x7d,
0xad, 0x8d, 0x14, 0x62, 0xb3, 0xd4, 0x43, 0x8f, 0xe1, 0x64, 0x63, 0xf3, 0x99, 0x36, 0x9d, 0xaa,
0x85, 0x76, 0x1f, 0x3d, 0x85, 0xe1, 0x86, 0xc8, 0x64, 0x61, 0x2c, 0x94, 0x37, 0xa6, 0xfa, 0x96,
0xf8, 0x34, 0x57, 0xa7, 0x86, 0x74, 0xb0, 0xc5, 0xe9, 0x8a, 0x94, 0x32, 0x1a, 0xa9, 0x33, 0x43,
0x1d, 0x4b, 0x12, 0x7a, 0x06, 0x4f, 0x6e, 0x93, 0xd4, 0xd5, 0xc9, 0xc5, 0x5b, 0x75, 0x2c, 0xdd,
0x29, 0x95, 0xef, 0x17, 0xbd, 0x5f, 0x89, 0x67, 0x3f, 0xfa, 0x59, 0x96, 0x01, 0x97, 0x6d, 0xfa,
0xf5, 0xfc, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3e, 0x26, 0x1f, 0x1a, 0xab, 0x13, 0x00, 0x00,
}

View File

@ -48,6 +48,7 @@ message EditMessage {
ChatMessage.ContentType content_type = 7;
repeated UnfurledLink unfurled_links = 8;
UnfurledStatusLinks unfurled_status_links = 9;
}
message DeleteMessage {
@ -108,6 +109,12 @@ message DiscordMessageAttachment {
string localUrl = 8;
}
message UnfurledLinkThumbnail {
bytes payload = 1;
uint32 width = 2;
uint32 height = 3;
}
message UnfurledLink {
// A valid URL which uniquely identifies this link.
string url = 1;
@ -127,6 +134,46 @@ message UnfurledLink {
}
}
message UnfurledStatusContactLink {
bytes public_key = 1;
string display_name = 2;
string description = 3;
UnfurledLinkThumbnail icon = 4;
}
message UnfurledStatusCommunityLink {
bytes community_id = 1;
string display_name = 2;
string description = 3;
uint32 members_count = 4;
string color = 5;
UnfurledLinkThumbnail icon = 7;
UnfurledLinkThumbnail banner = 8;
}
message UnfurledStatusChannelLink {
bytes channel_uuid = 1;
string emoji = 2;
string display_name = 3;
string description = 4;
string color = 5;
UnfurledStatusCommunityLink community = 6;
}
message UnfurledStatusLink {
string url = 1;
oneof payload {
UnfurledStatusContactLink contact = 2;
UnfurledStatusCommunityLink community = 3;
UnfurledStatusChannelLink channel = 4;
}
}
// Create a wrapper around repeated property for proper unmarshalling
message UnfurledStatusLinks {
repeated UnfurledStatusLink unfurled_status_links = 1;
}
message ChatMessage {
// Lamport timestamp of the chat message
uint64 clock = 1;
@ -171,6 +218,8 @@ message ChatMessage {
Shard shard = 17;
UnfurledStatusLinks unfurled_status_links = 18;
enum ContentType {
UNKNOWN_CONTENT_TYPE = 0;
TEXT_PLAIN = 1;

View File

@ -39,7 +39,6 @@ const (
SyncSetting_DISPLAY_NAME SyncSetting_Type = 13
SyncSetting_BIO SyncSetting_Type = 14
SyncSetting_MNEMONIC_REMOVED SyncSetting_Type = 15
SyncSetting_INCLUDE_WATCHONLY_ACCOUNT SyncSetting_Type = 17
)
var SyncSetting_Type_name = map[int32]string{
@ -225,37 +224,36 @@ func init() {
}
var fileDescriptor_e2f7a0bce2873c78 = []byte{
// 508 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x92, 0xcf, 0x6f, 0xd3, 0x30,
0x14, 0xc7, 0x9b, 0x35, 0x5d, 0xbb, 0x97, 0x6e, 0x33, 0xde, 0x04, 0x61, 0x80, 0x16, 0xc6, 0x25,
0xa7, 0x20, 0x01, 0xe2, 0xc2, 0xc9, 0x75, 0xdc, 0xd5, 0x6a, 0x62, 0x47, 0xb6, 0xd3, 0xaa, 0x5c,
0x2c, 0x5a, 0x95, 0xa9, 0xa2, 0x6a, 0xaa, 0x35, 0x43, 0xea, 0x91, 0x7f, 0x82, 0xbf, 0x17, 0x25,
0xa1, 0xfc, 0x3c, 0xd9, 0xef, 0xfb, 0x3e, 0xef, 0xeb, 0xe7, 0x67, 0xc3, 0xc5, 0x6e, 0xbf, 0x59,
0xd8, 0xdd, 0xb2, 0x2c, 0x57, 0x9b, 0xbb, 0x5d, 0xb4, 0xbd, 0x2f, 0xca, 0x02, 0xf7, 0xea, 0x65,
0xfe, 0xf0, 0xf9, 0xe6, 0x5b, 0x07, 0x3c, 0xbd, 0xdf, 0x2c, 0x74, 0x03, 0xe0, 0x08, 0xdc, 0x72,
0xbf, 0x5d, 0xfa, 0x4e, 0xe0, 0x84, 0x67, 0x6f, 0xae, 0xa2, 0x03, 0x18, 0xfd, 0x01, 0x45, 0x66,
0xbf, 0x5d, 0xaa, 0x9a, 0xc3, 0x97, 0xd0, 0x59, 0xac, 0x8b, 0xc5, 0x17, 0xff, 0x28, 0x70, 0x42,
0x57, 0x35, 0x01, 0x7e, 0x05, 0xfd, 0xaf, 0x9f, 0xd6, 0x0f, 0x4b, 0xbb, 0x2b, 0xef, 0x57, 0x9b,
0x3b, 0xbf, 0x1d, 0x38, 0xe1, 0xc9, 0xa8, 0xa5, 0xbc, 0x5a, 0xd5, 0xb5, 0x88, 0x5f, 0x42, 0x13,
0xda, 0xf9, 0xbe, 0x5c, 0xee, 0x7c, 0x37, 0x70, 0xc2, 0xfe, 0xa8, 0xa5, 0xa0, 0x16, 0x07, 0x95,
0x86, 0xaf, 0x01, 0x7e, 0x22, 0x45, 0xb1, 0xf6, 0x3b, 0x81, 0x13, 0xf6, 0x46, 0x2d, 0x75, 0xd2,
0x10, 0x45, 0xb1, 0xfe, 0xed, 0xb1, 0xda, 0x94, 0xef, 0xdf, 0xf9, 0xc7, 0x81, 0x13, 0xb6, 0x7f,
0x79, 0xf0, 0x4a, 0xbb, 0xf9, 0xde, 0x06, 0xb7, 0x6a, 0x18, 0x7b, 0xd0, 0xcd, 0xc5, 0x58, 0xc8,
0xa9, 0x40, 0x2d, 0xdc, 0x87, 0x1e, 0xcd, 0x95, 0x62, 0x82, 0xce, 0x90, 0x83, 0xcf, 0xc1, 0xbb,
0xe5, 0x43, 0xab, 0x18, 0x65, 0xc2, 0x68, 0x74, 0x84, 0x31, 0x9c, 0x55, 0xc2, 0x90, 0x4c, 0x64,
0xae, 0xb8, 0x61, 0x1a, 0xb5, 0xf1, 0x35, 0x3c, 0x4b, 0x99, 0xd6, 0xe4, 0x96, 0x69, 0x3b, 0x54,
0x32, 0xb5, 0x54, 0x0a, 0x43, 0xa8, 0xd1, 0x56, 0x8a, 0x64, 0x86, 0xdc, 0xaa, 0x28, 0x53, 0x6c,
0xc8, 0x94, 0x62, 0xb1, 0x15, 0x24, 0x65, 0xa8, 0x83, 0x2f, 0xe0, 0x3c, 0x53, 0x6c, 0xc2, 0xd9,
0xd4, 0x66, 0x8a, 0x4f, 0x08, 0x9d, 0xa1, 0x63, 0xfc, 0x1c, 0xfc, 0x4c, 0xc9, 0x21, 0x4f, 0x98,
0xcd, 0x38, 0x35, 0xb9, 0x62, 0xda, 0xea, 0x91, 0x9c, 0x5a, 0x23, 0x51, 0xb7, 0x3a, 0xe7, 0xbf,
0xec, 0x84, 0x6b, 0x3e, 0xe0, 0x09, 0x37, 0x33, 0xd4, 0xc3, 0x4f, 0xe0, 0x42, 0x33, 0x11, 0x5b,
0x6d, 0x88, 0xc9, 0xb5, 0xcd, 0xb3, 0x98, 0x54, 0x1d, 0x9e, 0x54, 0xbe, 0xda, 0x70, 0x3a, 0x66,
0x4a, 0xdb, 0x8c, 0xd0, 0xb1, 0xb6, 0x5c, 0x68, 0x43, 0x92, 0x84, 0xc5, 0x08, 0xf0, 0x15, 0x3c,
0xfe, 0x27, 0x9b, 0x31, 0x11, 0x73, 0x71, 0x8b, 0xbc, 0xbf, 0x2a, 0x9b, 0x29, 0xd8, 0x43, 0x8c,
0xfa, 0x18, 0x41, 0x3f, 0xe6, 0x3a, 0x4b, 0xc8, 0xac, 0xb9, 0xd6, 0x29, 0xee, 0x42, 0x7b, 0xc0,
0x25, 0x3a, 0xc3, 0x97, 0x80, 0x52, 0xc1, 0x52, 0x29, 0x38, 0xb5, 0x8a, 0xa5, 0x72, 0xc2, 0x62,
0x74, 0x8e, 0x5f, 0xc0, 0x53, 0x2e, 0x68, 0x92, 0xc7, 0xcc, 0x4e, 0x89, 0xa1, 0xa3, 0x6a, 0x40,
0x96, 0x50, 0x2a, 0x73, 0x61, 0xd0, 0xa3, 0x1b, 0xb7, 0x87, 0x10, 0x1a, 0x74, 0xa1, 0xd3, 0x3c,
0xe4, 0xe9, 0x47, 0x2f, 0x7a, 0xfd, 0xe1, 0xf0, 0xd3, 0xe6, 0xc7, 0xf5, 0xee, 0xed, 0x8f, 0x00,
0x00, 0x00, 0xff, 0xff, 0xe1, 0x41, 0x4b, 0xcb, 0xba, 0x02, 0x00, 0x00,
// 484 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x92, 0x4d, 0x8f, 0xda, 0x3c,
0x10, 0x80, 0x09, 0x84, 0xaf, 0x09, 0x0b, 0x96, 0x59, 0xbd, 0x6f, 0xb4, 0xad, 0xb4, 0x29, 0xbd,
0xe4, 0x94, 0x4a, 0x6d, 0xd5, 0x4b, 0x4f, 0x21, 0x31, 0x60, 0x91, 0xd8, 0x91, 0xed, 0x80, 0xe8,
0xc5, 0x2a, 0x88, 0xae, 0x50, 0x11, 0x41, 0x4b, 0xb6, 0x52, 0xfe, 0x6e, 0xff, 0x44, 0xaf, 0x55,
0x92, 0xd2, 0xcf, 0x53, 0x32, 0xcf, 0x3c, 0x33, 0x1e, 0x7f, 0xc0, 0xf8, 0x52, 0x9c, 0x76, 0xfa,
0xb2, 0xcf, 0xf3, 0xc3, 0xe9, 0xe1, 0xe2, 0x9d, 0x1f, 0xb3, 0x3c, 0xc3, 0xbd, 0xea, 0xb3, 0x7d,
0xfa, 0x34, 0xf9, 0x6a, 0x82, 0x25, 0x8b, 0xd3, 0x4e, 0xd6, 0x02, 0xf6, 0xc0, 0xcc, 0x8b, 0xf3,
0xde, 0x36, 0x1c, 0xc3, 0x1d, 0xbe, 0xbe, 0xf3, 0xae, 0xa2, 0xf7, 0x9b, 0xe4, 0xa9, 0xe2, 0xbc,
0x17, 0x95, 0x87, 0x6f, 0xa1, 0xbd, 0x3b, 0x66, 0xbb, 0xcf, 0x76, 0xd3, 0x31, 0x5c, 0x53, 0xd4,
0x01, 0x7e, 0x09, 0x83, 0x2f, 0x1f, 0x8f, 0x4f, 0x7b, 0x7d, 0xc9, 0x1f, 0x0f, 0xa7, 0x07, 0xbb,
0xe5, 0x18, 0x6e, 0x7f, 0xd1, 0x10, 0x56, 0x45, 0x65, 0x05, 0xf1, 0x0b, 0xa8, 0x43, 0xbd, 0x2d,
0xf2, 0xfd, 0xc5, 0x36, 0x1d, 0xc3, 0x1d, 0x2c, 0x1a, 0x02, 0x2a, 0x38, 0x2d, 0x19, 0xbe, 0x07,
0xf8, 0xa1, 0x64, 0xd9, 0xd1, 0x6e, 0x3b, 0x86, 0xdb, 0x5b, 0x34, 0x44, 0xbf, 0x36, 0xb2, 0xec,
0xf8, 0xab, 0xc7, 0xe1, 0x94, 0xbf, 0x7b, 0x6b, 0x77, 0x1c, 0xc3, 0x6d, 0xfd, 0xec, 0x41, 0x4b,
0x36, 0xf9, 0xd6, 0x04, 0xb3, 0x1c, 0x18, 0x5b, 0xd0, 0x4d, 0xd9, 0x92, 0xf1, 0x35, 0x43, 0x0d,
0x3c, 0x80, 0x5e, 0x90, 0x0a, 0x41, 0x58, 0xb0, 0x41, 0x06, 0x1e, 0x81, 0x35, 0xa7, 0x33, 0x2d,
0x48, 0x40, 0x98, 0x92, 0xa8, 0x89, 0x31, 0x0c, 0x4b, 0x30, 0xf3, 0x57, 0x3c, 0x15, 0x54, 0x11,
0x89, 0x5a, 0xf8, 0x1e, 0x9e, 0xc5, 0x44, 0x4a, 0x7f, 0x4e, 0xa4, 0x9e, 0x09, 0x1e, 0xeb, 0x80,
0x33, 0xe5, 0x07, 0x4a, 0x6a, 0xce, 0xa2, 0x0d, 0x32, 0xcb, 0xa2, 0x44, 0x90, 0x19, 0x11, 0x82,
0x84, 0x9a, 0xf9, 0x31, 0x41, 0x6d, 0x3c, 0x86, 0x51, 0x22, 0xc8, 0x8a, 0x92, 0xb5, 0x4e, 0x04,
0x5d, 0xf9, 0xc1, 0x06, 0x75, 0xf0, 0x73, 0xb0, 0x13, 0xc1, 0x67, 0x34, 0x22, 0x3a, 0xa1, 0x81,
0x4a, 0x05, 0x91, 0x5a, 0x2e, 0xf8, 0x5a, 0x2b, 0x8e, 0xba, 0xe5, 0x3a, 0xff, 0x64, 0x57, 0x54,
0xd2, 0x29, 0x8d, 0xa8, 0xda, 0xa0, 0x1e, 0xfe, 0x1f, 0xc6, 0x92, 0xb0, 0x50, 0x4b, 0xe5, 0xab,
0x54, 0xea, 0x34, 0x09, 0xfd, 0x72, 0xc2, 0x7e, 0xd9, 0x57, 0x2a, 0x1a, 0x2c, 0x89, 0x90, 0x3a,
0xf1, 0x83, 0xa5, 0xd4, 0x94, 0x49, 0xe5, 0x47, 0x11, 0x09, 0x11, 0xe0, 0x3b, 0xf8, 0xef, 0xaf,
0x6c, 0x42, 0x58, 0x48, 0xd9, 0x1c, 0x59, 0x7f, 0x54, 0xd6, 0xa7, 0xa0, 0xaf, 0x31, 0x1a, 0x60,
0x04, 0x83, 0x90, 0xca, 0x24, 0xf2, 0x37, 0xf5, 0xb6, 0x6e, 0x70, 0x17, 0x5a, 0x53, 0xca, 0xd1,
0x10, 0xdf, 0x02, 0x8a, 0x19, 0x89, 0x39, 0xa3, 0x81, 0x16, 0x24, 0xe6, 0x2b, 0x12, 0xa2, 0xd1,
0xc4, 0xec, 0x21, 0x84, 0xa6, 0x5d, 0x68, 0xd7, 0x37, 0x75, 0xf3, 0xc1, 0xf2, 0x5e, 0xbd, 0xbf,
0x3e, 0xa5, 0x6d, 0xa7, 0xfa, 0x7b, 0xf3, 0x3d, 0x00, 0x00, 0xff, 0xff, 0xd4, 0x80, 0xfb, 0x9e,
0x9b, 0x02, 0x00, 0x00,
}

View File

@ -90,7 +90,7 @@ func _1593601729_initial_schemaDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1593601729_initial_schema.down.sql", size: 144, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1593601729_initial_schema.down.sql", size: 144, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa, 0x95, 0x55, 0x64, 0x38, 0x40, 0x16, 0xbf, 0x8b, 0x1c, 0x18, 0xb4, 0xc5, 0x7f, 0xd0, 0xb8, 0xf0, 0x3c, 0xa2, 0x82, 0xf8, 0x8d, 0x5a, 0xd3, 0xb6, 0x6e, 0xa3, 0xb4, 0xc, 0x9, 0x33, 0x0}}
return a, nil
}
@ -110,7 +110,7 @@ func _1593601729_initial_schemaUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1593601729_initial_schema.up.sql", size: 1773, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1593601729_initial_schema.up.sql", size: 1773, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4e, 0x1e, 0x5, 0x35, 0x9, 0xb2, 0x2d, 0x6f, 0x33, 0x63, 0xa2, 0x7a, 0x5b, 0xd2, 0x2d, 0xcb, 0x79, 0x7e, 0x6, 0xb4, 0x9d, 0x35, 0xd8, 0x9b, 0x55, 0xe5, 0xf8, 0x44, 0xca, 0xa6, 0xf3, 0xd3}}
return a, nil
}
@ -130,7 +130,7 @@ func _1597909626_add_server_typeDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1597909626_add_server_type.down.sql", size: 0, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1597909626_add_server_type.down.sql", size: 0, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}}
return a, nil
}
@ -150,7 +150,7 @@ func _1597909626_add_server_typeUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1597909626_add_server_type.up.sql", size: 145, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1597909626_add_server_type.up.sql", size: 145, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc8, 0x3f, 0xe0, 0xe7, 0x57, 0x0, 0x5d, 0x60, 0xf3, 0x55, 0x64, 0x71, 0x80, 0x3c, 0xca, 0x8, 0x61, 0xb5, 0x3c, 0xe, 0xa1, 0xe4, 0x61, 0xd1, 0x4e, 0xd8, 0xb2, 0x55, 0xdd, 0x87, 0x62, 0x9b}}
return a, nil
}
@ -170,7 +170,7 @@ func _1599053776_add_chat_id_and_typeDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1599053776_add_chat_id_and_type.down.sql", size: 0, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1599053776_add_chat_id_and_type.down.sql", size: 0, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}}
return a, nil
}
@ -190,7 +190,7 @@ func _1599053776_add_chat_id_and_typeUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1599053776_add_chat_id_and_type.up.sql", size: 264, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1599053776_add_chat_id_and_type.up.sql", size: 264, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x7a, 0xf9, 0xc4, 0xa2, 0x96, 0x2e, 0xf9, 0x8f, 0x7, 0xf1, 0x1e, 0x73, 0x8a, 0xa6, 0x3a, 0x13, 0x4, 0x73, 0x82, 0x83, 0xb, 0xe3, 0xb5, 0x3b, 0x7e, 0xd, 0x23, 0xce, 0x98, 0xd4, 0xdc}}
return a, nil
}
@ -210,7 +210,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 382, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "doc.go", size: 382, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc0, 0x2f, 0x1e, 0x64, 0x9, 0x93, 0xe4, 0x8b, 0xf2, 0x98, 0x5a, 0x45, 0xe2, 0x80, 0x88, 0x67, 0x7a, 0x2d, 0xd7, 0x4b, 0xd1, 0x73, 0xb6, 0x6d, 0x15, 0xc2, 0x0, 0x34, 0xcd, 0xa0, 0xdb, 0x20}}
return a, nil
}

View File

@ -88,7 +88,7 @@ func _1593601728_initial_schemaDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1593601728_initial_schema.down.sql", size: 200, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1593601728_initial_schema.down.sql", size: 200, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x88, 0x8a, 0x61, 0x81, 0x57, 0x45, 0x9b, 0x97, 0x9b, 0x1f, 0xf6, 0x94, 0x8a, 0x20, 0xb3, 0x2b, 0xff, 0x69, 0x49, 0xf4, 0x58, 0xcc, 0xd0, 0x55, 0xcc, 0x9a, 0x8b, 0xb6, 0x7f, 0x29, 0x53, 0xc1}}
return a, nil
}
@ -108,7 +108,7 @@ func _1593601728_initial_schemaUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1593601728_initial_schema.up.sql", size: 675, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1593601728_initial_schema.up.sql", size: 675, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfd, 0x61, 0x90, 0x79, 0xd9, 0x14, 0x65, 0xe9, 0x96, 0x53, 0x17, 0x33, 0x54, 0xeb, 0x8b, 0x5d, 0x95, 0x99, 0x10, 0x36, 0x58, 0xdd, 0xb2, 0xbf, 0x45, 0xd9, 0xbb, 0xc4, 0x92, 0xe, 0xce, 0x2}}
return a, nil
}
@ -128,7 +128,7 @@ func _1598419937_add_push_notifications_tableDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1598419937_add_push_notifications_table.down.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1598419937_add_push_notifications_table.down.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0x98, 0xc8, 0x30, 0x45, 0x5b, 0xc5, 0x7d, 0x13, 0x5d, 0xe7, 0xc8, 0x23, 0x43, 0xf7, 0xdc, 0x9c, 0xe2, 0xdd, 0x63, 0xf0, 0xb7, 0x16, 0x40, 0xc, 0xda, 0xb9, 0x16, 0x70, 0x2b, 0x5a, 0x7e}}
return a, nil
}
@ -148,7 +148,7 @@ func _1598419937_add_push_notifications_tableUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1598419937_add_push_notifications_table.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1598419937_add_push_notifications_table.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2, 0x3e, 0xef, 0xf, 0xc2, 0xdf, 0xbc, 0x99, 0x7a, 0xc2, 0xd3, 0x64, 0x4f, 0x4c, 0x7e, 0xfc, 0x2e, 0x8c, 0xa7, 0x54, 0xd3, 0x4d, 0x25, 0x98, 0x41, 0xbc, 0xea, 0xd7, 0x2, 0xc1, 0xd0, 0x52}}
return a, nil
}
@ -168,7 +168,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 382, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "doc.go", size: 382, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc0, 0x2f, 0x1e, 0x64, 0x9, 0x93, 0xe4, 0x8b, 0xf2, 0x98, 0x5a, 0x45, 0xe2, 0x80, 0x88, 0x67, 0x7a, 0x2d, 0xd7, 0x4b, 0xd1, 0x73, 0xb6, 0x6d, 0x15, 0xc2, 0x0, 0x34, 0xcd, 0xa0, 0xdb, 0x20}}
return a, nil
}

View File

@ -12,10 +12,11 @@ var ErrEditMessageInvalidID = errors.New("edit-message: invalid id")
var ErrEditMessageInvalidText = errors.New("edit-message: invalid text")
type EditMessage struct {
ID types.HexBytes `json:"id"`
Text string `json:"text"`
ContentType protobuf.ChatMessage_ContentType `json:"content-type"`
LinkPreviews []common.LinkPreview `json:"linkPreviews"`
ID types.HexBytes `json:"id"`
Text string `json:"text"`
ContentType protobuf.ChatMessage_ContentType `json:"content-type"`
LinkPreviews []common.LinkPreview `json:"linkPreviews"`
StatusLinkPreviews []common.StatusLinkPreview `json:"statusLinkPreviews"`
}
func (e *EditMessage) Validate() error {

View File

@ -89,7 +89,7 @@ func _1561059284_add_waku_keysDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1561059284_add_waku_keys.down.sql", size: 22, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1561059284_add_waku_keys.down.sql", size: 22, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe5, 0x2a, 0x7e, 0x9, 0xa3, 0xdd, 0xc6, 0x3, 0xfa, 0xaa, 0x98, 0xa0, 0x26, 0x5e, 0x67, 0x43, 0xe6, 0x20, 0xfd, 0x10, 0xfd, 0x60, 0x89, 0x17, 0x13, 0x87, 0x1b, 0x44, 0x36, 0x79, 0xb6, 0x60}}
return a, nil
}
@ -109,7 +109,7 @@ func _1561059284_add_waku_keysUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1561059284_add_waku_keys.up.sql", size: 109, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1561059284_add_waku_keys.up.sql", size: 109, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x5c, 0x8, 0x32, 0xef, 0x12, 0x88, 0x21, 0xd, 0x7a, 0x42, 0x4d, 0xe7, 0x2d, 0x6c, 0x99, 0xb6, 0x1, 0xf1, 0xba, 0x2c, 0x40, 0x8d, 0xa9, 0x4b, 0xe6, 0xc4, 0x21, 0xec, 0x47, 0x6b, 0xf7}}
return a, nil
}
@ -129,7 +129,7 @@ func _1616691080_add_wakuv2_keysDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1616691080_add_wakuV2_keys.down.sql", size: 24, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1616691080_add_wakuV2_keys.down.sql", size: 24, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x42, 0xb6, 0x23, 0x70, 0xb8, 0x63, 0x18, 0x61, 0xea, 0x35, 0x6e, 0xae, 0xe9, 0x71, 0x89, 0xa, 0xa5, 0x72, 0xa2, 0x64, 0xaa, 0x45, 0x1, 0xf, 0xfc, 0xee, 0x1b, 0xd9, 0xd2, 0x27, 0xf4, 0xe2}}
return a, nil
}
@ -149,7 +149,7 @@ func _1616691080_add_wakuv2_keysUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1616691080_add_wakuV2_keys.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1616691080_add_wakuV2_keys.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0xf0, 0x97, 0x25, 0xfe, 0x96, 0x2c, 0xa8, 0x62, 0x4a, 0x71, 0x75, 0xff, 0x5f, 0x43, 0x1e, 0x71, 0x53, 0xf1, 0xde, 0xf, 0xcf, 0xcd, 0x87, 0x15, 0x61, 0x9d, 0x25, 0x2e, 0xaf, 0x18, 0x99}}
return a, nil
}
@ -169,7 +169,7 @@ func _1634723014_add_wakuv2_keysUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1634723014_add_wakuV2_keys.up.sql", size: 125, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "1634723014_add_wakuV2_keys.up.sql", size: 125, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xe1, 0x7a, 0x1e, 0x6, 0xad, 0x1b, 0x37, 0xdb, 0xea, 0x94, 0xaf, 0xe0, 0x7d, 0xc9, 0xd6, 0xda, 0x52, 0x71, 0x8a, 0x44, 0xb3, 0xa6, 0x7b, 0x1e, 0x90, 0xdb, 0x1e, 0x5a, 0xa, 0x40, 0x26}}
return a, nil
}
@ -189,7 +189,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 373, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "doc.go", size: 373, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x23, 0x6a, 0xc1, 0xce, 0x94, 0xf6, 0xef, 0xf1, 0x97, 0x95, 0xb, 0x35, 0xaf, 0x5f, 0xe7, 0x5f, 0xac, 0x6e, 0xb8, 0xab, 0xba, 0xb5, 0x35, 0x97, 0x22, 0x36, 0x11, 0xce, 0x44, 0xfc, 0xfa, 0xac}}
return a, nil
}

View File

@ -3,9 +3,7 @@ package server
import (
"bytes"
"database/sql"
"encoding/json"
"errors"
"fmt"
"image"
"image/color"
"net/http"
@ -22,17 +20,17 @@ import (
"github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/protocol/identity/colorhash"
"github.com/status-im/status-go/protocol/identity/ring"
"github.com/status-im/status-go/protocol/protobuf"
)
const (
basePath = "/messages"
imagesPath = basePath + "/images"
audioPath = basePath + "/audio"
ipfsPath = "/ipfs"
discordAuthorsPath = "/discord/authors"
discordAttachmentsPath = basePath + "/discord/attachments"
LinkPreviewThumbnailPath = "/link-preview/thumbnail"
basePath = "/messages"
imagesPath = basePath + "/images"
audioPath = basePath + "/audio"
ipfsPath = "/ipfs"
discordAuthorsPath = "/discord/authors"
discordAttachmentsPath = basePath + "/discord/attachments"
LinkPreviewThumbnailPath = "/link-preview/thumbnail"
StatusLinkPreviewThumbnailPath = "/status-link-preview/thumbnail"
// Handler routes for pairing
accountImagesPath = "/accountImages"
@ -80,6 +78,7 @@ type ImageParams struct {
URL string
MessageID string
AttachmentID string
ImageID string
Hash string
Download bool
@ -266,6 +265,10 @@ func ParseImageParams(logger *zap.Logger, params url.Values) ImageParams {
parsed.AuthorID = authorIds[0]
}
if imageIds := params["image-id"]; len(imageIds) != 0 {
parsed.ImageID = imageIds[0]
}
urls := params["url"]
if len(urls) != 0 {
parsed.URL = urls[0]
@ -917,66 +920,3 @@ func handleQRCodeGeneration(multiaccountsDB *multiaccounts.Database, logger *zap
}
}
}
func getThumbnailPayload(db *sql.DB, logger *zap.Logger, msgID string, thumbnailURL string) ([]byte, error) {
var payload []byte
var result []byte
err := db.QueryRow(`SELECT unfurled_links FROM user_messages WHERE id = ?`, msgID).Scan(&result)
if err != nil {
return payload, fmt.Errorf("could not find message with message-id '%s': %w", msgID, err)
}
var links []*protobuf.UnfurledLink
err = json.Unmarshal(result, &links)
if err != nil {
return payload, fmt.Errorf("failed to unmarshal protobuf.UrlPreview: %w", err)
}
for _, p := range links {
if p.Url == thumbnailURL {
payload = p.ThumbnailPayload
break
}
}
return payload, nil
}
func handleLinkPreviewThumbnail(db *sql.DB, logger *zap.Logger) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
params := r.URL.Query()
parsed := ParseImageParams(logger, params)
if parsed.MessageID == "" {
http.Error(w, "missing query parameter 'message-id'", http.StatusBadRequest)
return
}
if parsed.URL == "" {
http.Error(w, "missing query parameter 'url'", http.StatusBadRequest)
return
}
thumbnail, err := getThumbnailPayload(db, logger, parsed.MessageID, parsed.URL)
if err != nil {
logger.Error("failed to get thumbnail", zap.String("msgID", parsed.MessageID))
http.Error(w, "failed to get thumbnail", http.StatusInternalServerError)
return
}
mimeType, err := images.GetMimeType(thumbnail)
if err != nil {
http.Error(w, "mime type not supported", http.StatusNotImplemented)
return
}
w.Header().Set("Content-Type", "image/"+mimeType)
w.Header().Set("Cache-Control", "no-store")
_, err = w.Write(thumbnail)
if err != nil {
logger.Error("failed to write response", zap.Error(err))
}
}
}

View File

@ -0,0 +1,209 @@
package server
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
"github.com/golang/protobuf/proto"
"go.uber.org/zap"
"github.com/status-im/status-go/images"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/protobuf"
)
func getThumbnailPayload(db *sql.DB, logger *zap.Logger, msgID string, thumbnailURL string) ([]byte, error) {
var payload []byte
var result []byte
err := db.QueryRow(`SELECT unfurled_links FROM user_messages WHERE id = ?`, msgID).Scan(&result)
if err != nil {
return payload, fmt.Errorf("could not find message with message-id '%s': %w", msgID, err)
}
var links []*protobuf.UnfurledLink
err = json.Unmarshal(result, &links)
if err != nil {
return payload, fmt.Errorf("failed to unmarshal protobuf.UrlPreview: %w", err)
}
for _, p := range links {
if p.Url == thumbnailURL {
payload = p.ThumbnailPayload
break
}
}
return payload, nil
}
func handleLinkPreviewThumbnail(db *sql.DB, logger *zap.Logger) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
params := r.URL.Query()
parsed := ParseImageParams(logger, params)
if parsed.MessageID == "" {
http.Error(w, "missing query parameter 'message-id'", http.StatusBadRequest)
return
}
if parsed.URL == "" {
http.Error(w, "missing query parameter 'url'", http.StatusBadRequest)
return
}
thumbnail, err := getThumbnailPayload(db, logger, parsed.MessageID, parsed.URL)
if err != nil {
logger.Error("failed to get thumbnail", zap.String("msgID", parsed.MessageID))
http.Error(w, "failed to get thumbnail", http.StatusInternalServerError)
return
}
mimeType, err := images.GetMimeType(thumbnail)
if err != nil {
http.Error(w, "mime type not supported", http.StatusNotImplemented)
return
}
w.Header().Set("Content-Type", "image/"+mimeType)
w.Header().Set("Cache-Control", "no-store")
_, err = w.Write(thumbnail)
if err != nil {
logger.Error("failed to write response", zap.Error(err))
}
}
}
func getStatusLinkPreviewImage(p *protobuf.UnfurledStatusLink, imageID common.MediaServerImageID) ([]byte, error) {
switch imageID {
case common.MediaServerContactIcon:
contact := p.GetContact()
if contact == nil {
return nil, fmt.Errorf("this is not a contact link")
}
if contact.Icon == nil {
return nil, fmt.Errorf("contact icon is empty")
}
return contact.Icon.Payload, nil
case common.MediaServerCommunityIcon:
community := p.GetCommunity()
if community == nil {
return nil, fmt.Errorf("this is not a community link")
}
if community.Icon == nil {
return nil, fmt.Errorf("community icon is empty")
}
return community.Icon.Payload, nil
case common.MediaServerCommunityBanner:
community := p.GetCommunity()
if community == nil {
return nil, fmt.Errorf("this is not a community link")
}
if community.Banner == nil {
return nil, fmt.Errorf("community banner is empty")
}
return community.Banner.Payload, nil
case common.MediaServerChannelCommunityIcon:
channel := p.GetChannel()
if channel == nil {
return nil, fmt.Errorf("this is not a community channel link")
}
if channel.Community == nil {
return nil, fmt.Errorf("channel community is empty")
}
if channel.Community.Icon == nil {
return nil, fmt.Errorf("channel community icon is empty")
}
return channel.Community.Icon.Payload, nil
case common.MediaServerChannelCommunityBanner:
channel := p.GetChannel()
if channel == nil {
return nil, fmt.Errorf("this is not a community channel link")
}
if channel.Community == nil {
return nil, fmt.Errorf("channel community is empty")
}
if channel.Community.Banner == nil {
return nil, fmt.Errorf("channel community banner is empty")
}
return channel.Community.Banner.Payload, nil
}
return nil, fmt.Errorf("value not supported")
}
func getStatusLinkPreviewThumbnail(db *sql.DB, messageID string, URL string, imageID common.MediaServerImageID) ([]byte, int, error) {
var messageLinks []byte
err := db.QueryRow(`SELECT unfurled_status_links FROM user_messages WHERE id = ?`, messageID).Scan(&messageLinks)
if err != nil {
return nil, http.StatusBadRequest, fmt.Errorf("could not find message with message-id '%s': %w", messageID, err)
}
var links protobuf.UnfurledStatusLinks
err = proto.Unmarshal(messageLinks, &links)
if err != nil {
return nil, http.StatusInternalServerError, fmt.Errorf("failed to unmarshal protobuf.UrlPreview: %w", err)
}
for _, p := range links.UnfurledStatusLinks {
if p.Url == URL {
thumbnailPayload, err := getStatusLinkPreviewImage(p, imageID)
if err != nil {
return nil, http.StatusBadRequest, fmt.Errorf("invalid query parameter 'image-id' value: %w", err)
}
return thumbnailPayload, http.StatusOK, nil
}
}
return nil, http.StatusBadRequest, fmt.Errorf("no link preview found for given url")
}
func handleStatusLinkPreviewThumbnail(db *sql.DB, logger *zap.Logger) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
params := r.URL.Query()
parsed := ParseImageParams(logger, params)
if parsed.MessageID == "" {
http.Error(w, "missing query parameter 'message-id'", http.StatusBadRequest)
return
}
if parsed.URL == "" {
http.Error(w, "missing query parameter 'url'", http.StatusBadRequest)
return
}
if parsed.ImageID == "" {
http.Error(w, "missing query parameter 'image-id'", http.StatusBadRequest)
return
}
thumbnail, httpsStatusCode, err := getStatusLinkPreviewThumbnail(db, parsed.MessageID, parsed.URL, common.MediaServerImageID(parsed.ImageID))
if err != nil {
http.Error(w, err.Error(), httpsStatusCode)
return
}
mimeType, err := images.GetMimeType(thumbnail)
if err != nil {
http.Error(w, "mime type not supported", http.StatusNotImplemented)
return
}
w.Header().Set("Content-Type", "image/"+mimeType)
w.Header().Set("Cache-Control", "no-store")
_, err = w.Write(thumbnail)
if err != nil {
logger.Error("failed to write response", zap.Error(err))
}
}
}

View File

@ -8,28 +8,40 @@ import (
"net/url"
"testing"
"github.com/stretchr/testify/require"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/suite"
"go.uber.org/zap"
"github.com/status-im/status-go/appdatabase"
"github.com/status-im/status-go/logutils"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/sqlite"
"github.com/status-im/status-go/protocol/tt"
"github.com/status-im/status-go/t/helpers"
)
func setupTest(t *testing.T) (*sql.DB, *zap.Logger) {
db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{})
require.NoError(t, err)
err = sqlite.Migrate(db)
require.NoError(t, err)
logger := logutils.ZapLogger()
return db, logger
func TestHandlersSuite(t *testing.T) {
suite.Run(t, new(HandlersSuite))
}
func createUserMessage(t *testing.T, db *sql.DB, msg *common.Message) {
type HandlersSuite struct {
suite.Suite
db *sql.DB
logger *zap.Logger
}
func (s *HandlersSuite) SetupTest() {
db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{})
s.Require().NoError(err)
err = sqlite.Migrate(db)
s.Require().NoError(err)
s.logger = tt.MustCreateTestLogger()
s.db = db
}
func (s *HandlersSuite) saveUserMessage(msg *common.Message) {
whisperTimestamp := 0
source := ""
text := ""
@ -40,7 +52,7 @@ func createUserMessage(t *testing.T, db *sql.DB, msg *common.Message) {
responseTo := ""
clockValue := 0
stmt, err := db.Prepare(`
stmt, err := s.db.Prepare(`
INSERT INTO user_messages (
id,
whisper_timestamp,
@ -52,13 +64,25 @@ func createUserMessage(t *testing.T, db *sql.DB, msg *common.Message) {
local_chat_id,
response_to,
clock_value,
unfurled_links
) VALUES (?,?,?,?,?,?,?,?,?,?,?)
unfurled_links,
unfurled_status_links
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
`)
require.NoError(t, err)
links, err := json.Marshal(msg.UnfurledLinks)
require.NoError(t, err)
s.Require().NoError(err)
links := []byte{}
statusLinks := []byte{}
if msg.UnfurledLinks != nil {
links, err = json.Marshal(msg.UnfurledLinks)
s.Require().NoError(err)
}
if msg.UnfurledStatusLinks != nil {
statusLinks, err = proto.Marshal(msg.UnfurledStatusLinks)
s.Require().NoError(err)
}
_, err = stmt.Exec(
msg.ID,
@ -72,13 +96,14 @@ func createUserMessage(t *testing.T, db *sql.DB, msg *common.Message) {
responseTo,
clockValue,
links,
statusLinks,
)
require.NoError(t, err)
s.Require().NoError(err)
}
func httpGetReqRecorder(t *testing.T, handler http.HandlerFunc, reqURL string) *httptest.ResponseRecorder {
func (s *HandlersSuite) httpGetReqRecorder(handler http.HandlerFunc, reqURL string) *httptest.ResponseRecorder {
req, err := http.NewRequest("GET", reqURL, nil)
require.NoError(t, err)
s.Require().NoError(err)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
@ -86,49 +111,437 @@ func httpGetReqRecorder(t *testing.T, handler http.HandlerFunc, reqURL string) *
return rr
}
func TestHandleLinkPreviewThumbnail(t *testing.T) {
db, logger := setupTest(t)
func (s *HandlersSuite) verifyHTTPResponseThumbnail(rr *httptest.ResponseRecorder, expectedPayload []byte) {
s.Require().Equal(expectedPayload, rr.Body.Bytes())
s.Require().Equal("image/jpeg", rr.HeaderMap.Get("Content-Type"))
s.Require().Equal("no-store", rr.HeaderMap.Get("Cache-Control"))
}
func (s *HandlersSuite) TestHandleLinkPreviewThumbnail() {
previewURL := "https://github.com"
defaultPayload := []byte{0xff, 0xd8, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x50, 0x37, 0x3c, 0x46, 0x3c, 0x32, 0x50}
msg := common.Message{
ID: "1",
ChatMessage: &protobuf.ChatMessage{
UnfurledLinks: []*protobuf.UnfurledLink{
{
Type: protobuf.UnfurledLink_LINK,
Url: previewURL,
ThumbnailWidth: 100,
ThumbnailHeight: 200,
ThumbnailPayload: []byte{0xff, 0xd8, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x50, 0x37, 0x3c, 0x46, 0x3c, 0x32, 0x50},
Type: protobuf.UnfurledLink_LINK,
Url: previewURL,
ThumbnailWidth: 100,
ThumbnailHeight: 200,
},
},
},
}
createUserMessage(t, db, &msg)
s.saveUserMessage(&msg)
// Test happy path.
reqURL := "/dummy?" + url.Values{"message-id": {msg.ID}, "url": {previewURL}}.Encode()
rr := httpGetReqRecorder(t, handleLinkPreviewThumbnail(db, logger), reqURL)
require.Equal(t, http.StatusOK, rr.Code)
require.Equal(t, msg.UnfurledLinks[0].ThumbnailPayload, rr.Body.Bytes())
require.Equal(t, "image/jpeg", rr.HeaderMap.Get("Content-Type"))
require.Equal(t, "no-store", rr.HeaderMap.Get("Cache-Control"))
testCases := []struct {
Name string
ExpectedHTTPStatusCode int
ThumbnailPayload []byte
Parameters url.Values
CheckFunc func(s *HandlersSuite, rr *httptest.ResponseRecorder)
}{
{
Name: "Test happy path",
ExpectedHTTPStatusCode: http.StatusOK,
ThumbnailPayload: defaultPayload,
Parameters: url.Values{
"message-id": {msg.ID},
"url": {previewURL},
},
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, msg.UnfurledLinks[0].ThumbnailPayload)
},
},
{
Name: "Test request with missing 'url' parameter",
ThumbnailPayload: defaultPayload,
ExpectedHTTPStatusCode: http.StatusBadRequest,
Parameters: url.Values{
"message-id": {msg.ID},
},
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("missing query parameter 'url'\n", rr.Body.String())
},
},
{
Name: "Test request with missing 'message-id' parameter",
ThumbnailPayload: defaultPayload,
ExpectedHTTPStatusCode: http.StatusBadRequest,
Parameters: url.Values{
"url": {previewURL},
},
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("missing query parameter 'message-id'\n", rr.Body.String())
},
},
{
Name: "Test mime type not supported",
ThumbnailPayload: []byte("unsupported image"),
ExpectedHTTPStatusCode: http.StatusNotImplemented,
Parameters: url.Values{
"message-id": {msg.ID},
"url": {previewURL},
},
},
}
// Test bad requests.
reqURL = "/dummy?" + url.Values{"message-id": {msg.ID}}.Encode()
rr = httpGetReqRecorder(t, handleLinkPreviewThumbnail(db, logger), reqURL)
require.Equal(t, http.StatusBadRequest, rr.Code)
require.Equal(t, "missing query parameter 'url'\n", rr.Body.String())
handler := handleLinkPreviewThumbnail(s.db, s.logger)
reqURL = "/dummy?" + url.Values{"url": {previewURL}}.Encode()
rr = httpGetReqRecorder(t, handleLinkPreviewThumbnail(db, logger), reqURL)
require.Equal(t, http.StatusBadRequest, rr.Code)
require.Equal(t, "missing query parameter 'message-id'\n", rr.Body.String())
for _, tc := range testCases {
s.Run(tc.Name, func() {
msg.UnfurledLinks[0].ThumbnailPayload = tc.ThumbnailPayload
s.saveUserMessage(&msg)
// Test mime type not supported.
msg.UnfurledLinks[0].ThumbnailPayload = []byte("unsupported image")
createUserMessage(t, db, &msg)
reqURL = "/dummy?" + url.Values{"message-id": {msg.ID}, "url": {previewURL}}.Encode()
rr = httpGetReqRecorder(t, handleLinkPreviewThumbnail(db, logger), reqURL)
require.Equal(t, http.StatusNotImplemented, rr.Code)
requestURL := "/dummy?" + tc.Parameters.Encode()
rr := s.httpGetReqRecorder(handler, requestURL)
s.Require().Equal(tc.ExpectedHTTPStatusCode, rr.Code)
if tc.CheckFunc != nil {
tc.CheckFunc(s, rr)
}
})
}
}
func (s *HandlersSuite) TestHandleStatusLinkPreviewThumbnail() {
contact := &protobuf.UnfurledStatusContactLink{
PublicKey: []byte("PublicKey_1"),
Icon: &protobuf.UnfurledLinkThumbnail{
Width: 10,
Height: 20,
Payload: []byte{0xff, 0xd8, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x50, 0x37, 0x3c, 0x46, 0x3c, 0x32, 0x50},
},
}
contactWithUnsupportedImage := &protobuf.UnfurledStatusContactLink{
PublicKey: []byte("PublicKey_2"),
Icon: &protobuf.UnfurledLinkThumbnail{
Width: 10,
Height: 20,
Payload: []byte("unsupported image"),
},
}
community := &protobuf.UnfurledStatusCommunityLink{
CommunityId: []byte("CommunityId_1"),
Icon: &protobuf.UnfurledLinkThumbnail{
Width: 30,
Height: 40,
Payload: []byte{0xff, 0xd8, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x50, 0x37, 0x3c, 0x46, 0x3c, 0x32, 0x51},
},
Banner: &protobuf.UnfurledLinkThumbnail{
Width: 50,
Height: 60,
Payload: []byte{0xff, 0xd8, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x50, 0x37, 0x3c, 0x46, 0x3c, 0x32, 0x52},
},
}
channel := &protobuf.UnfurledStatusChannelLink{
ChannelUuid: []byte("ChannelUuid_1"),
Community: &protobuf.UnfurledStatusCommunityLink{
CommunityId: []byte("CommunityId_2"),
Icon: &protobuf.UnfurledLinkThumbnail{
Width: 70,
Height: 80,
Payload: []byte{0xff, 0xd8, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x50, 0x37, 0x3c, 0x46, 0x3c, 0x32, 0x53},
},
Banner: &protobuf.UnfurledLinkThumbnail{
Width: 90,
Height: 100,
Payload: []byte{0xff, 0xd8, 0xff, 0xdb, 0x0, 0x84, 0x0, 0x50, 0x37, 0x3c, 0x46, 0x3c, 0x32, 0x54},
},
},
}
unfurledContact := &protobuf.UnfurledStatusLink{
Url: "https://status.app/u/",
Payload: &protobuf.UnfurledStatusLink_Contact{
Contact: contact,
},
}
unfurledContactWithUnsupportedImage := &protobuf.UnfurledStatusLink{
Url: "https://status.app/u/",
Payload: &protobuf.UnfurledStatusLink_Contact{
Contact: contactWithUnsupportedImage,
},
}
unfurledCommunity := &protobuf.UnfurledStatusLink{
Url: "https://status.app/c/",
Payload: &protobuf.UnfurledStatusLink_Community{
Community: community,
},
}
unfurledChannel := &protobuf.UnfurledStatusLink{
Url: "https://status.app/cc/",
Payload: &protobuf.UnfurledStatusLink_Channel{
Channel: channel,
},
}
const (
messageIDContactOnly = "1"
messageIDCommunityOnly = "2"
messageIDChannelOnly = "3"
messageIDAllLinks = "4"
messageIDUnsupportedImage = "5"
)
s.saveUserMessage(&common.Message{
ID: messageIDContactOnly,
ChatMessage: &protobuf.ChatMessage{
UnfurledStatusLinks: &protobuf.UnfurledStatusLinks{
UnfurledStatusLinks: []*protobuf.UnfurledStatusLink{
unfurledContact,
},
},
},
})
s.saveUserMessage(&common.Message{
ID: messageIDCommunityOnly,
ChatMessage: &protobuf.ChatMessage{
UnfurledStatusLinks: &protobuf.UnfurledStatusLinks{
UnfurledStatusLinks: []*protobuf.UnfurledStatusLink{
unfurledCommunity,
},
},
},
})
s.saveUserMessage(&common.Message{
ID: messageIDChannelOnly,
ChatMessage: &protobuf.ChatMessage{
UnfurledStatusLinks: &protobuf.UnfurledStatusLinks{
UnfurledStatusLinks: []*protobuf.UnfurledStatusLink{
unfurledChannel,
},
},
},
})
s.saveUserMessage(&common.Message{
ID: messageIDAllLinks,
ChatMessage: &protobuf.ChatMessage{
UnfurledStatusLinks: &protobuf.UnfurledStatusLinks{
UnfurledStatusLinks: []*protobuf.UnfurledStatusLink{
unfurledContact,
unfurledCommunity,
unfurledChannel,
},
},
},
})
s.saveUserMessage(&common.Message{
ID: messageIDUnsupportedImage,
ChatMessage: &protobuf.ChatMessage{
UnfurledStatusLinks: &protobuf.UnfurledStatusLinks{
UnfurledStatusLinks: []*protobuf.UnfurledStatusLink{
unfurledContactWithUnsupportedImage,
},
},
},
})
testCases := []struct {
Name string
ExpectedHTTPStatusCode int
Parameters url.Values
CheckFunc func(s *HandlersSuite, rr *httptest.ResponseRecorder)
}{
{
Name: "Test valid contact icon link",
Parameters: url.Values{
"message-id": {messageIDContactOnly},
"url": {unfurledContact.Url},
"image-id": {string(common.MediaServerContactIcon)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledContact.GetContact().Icon.Payload)
},
},
{
Name: "Test invalid request for community icon in a contact link",
Parameters: url.Values{
"message-id": {messageIDContactOnly},
"url": {unfurledContact.Url},
"image-id": {string(common.MediaServerCommunityIcon)},
},
ExpectedHTTPStatusCode: http.StatusBadRequest,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("invalid query parameter 'image-id' value: this is not a community link\n", rr.Body.String())
},
},
{
Name: "Test invalid request for cahnnel community banner in a contact link",
Parameters: url.Values{
"message-id": {messageIDContactOnly},
"url": {unfurledContact.Url},
"image-id": {string(common.MediaServerChannelCommunityBanner)},
},
ExpectedHTTPStatusCode: http.StatusBadRequest,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("invalid query parameter 'image-id' value: this is not a community channel link\n", rr.Body.String())
},
},
{
Name: "Test invalid request for channel community banner in a contact link",
Parameters: url.Values{
"message-id": {messageIDContactOnly},
"url": {unfurledContact.Url},
"image-id": {"contact-banner"},
},
ExpectedHTTPStatusCode: http.StatusBadRequest,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("invalid query parameter 'image-id' value: value not supported\n", rr.Body.String())
},
},
{
Name: "Test valid community icon link",
Parameters: url.Values{
"message-id": {messageIDCommunityOnly},
"url": {unfurledCommunity.Url},
"image-id": {string(common.MediaServerCommunityIcon)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledCommunity.GetCommunity().Icon.Payload)
},
},
{
Name: "Test valid community banner link",
Parameters: url.Values{
"message-id": {messageIDCommunityOnly},
"url": {unfurledCommunity.Url},
"image-id": {string(common.MediaServerCommunityBanner)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledCommunity.GetCommunity().Banner.Payload)
},
},
{
Name: "Test valid channel community icon link",
Parameters: url.Values{
"message-id": {messageIDChannelOnly},
"url": {unfurledChannel.Url},
"image-id": {string(common.MediaServerChannelCommunityIcon)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledChannel.GetChannel().GetCommunity().Icon.Payload)
},
},
{
Name: "Test valid channel community banner link",
Parameters: url.Values{
"message-id": {messageIDChannelOnly},
"url": {unfurledChannel.Url},
"image-id": {string(common.MediaServerChannelCommunityBanner)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledChannel.GetChannel().GetCommunity().Banner.Payload)
},
},
{
Name: "Test valid contact icon link in a diverse message",
Parameters: url.Values{
"message-id": {messageIDAllLinks},
"url": {unfurledContact.Url},
"image-id": {string(common.MediaServerContactIcon)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledContact.GetContact().Icon.Payload)
},
},
{
Name: "Test valid community icon link in a diverse message",
Parameters: url.Values{
"message-id": {messageIDAllLinks},
"url": {unfurledCommunity.Url},
"image-id": {string(common.MediaServerCommunityIcon)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledCommunity.GetCommunity().Icon.Payload)
},
},
{
Name: "Test valid channel community icon link in a diverse message",
Parameters: url.Values{
"message-id": {messageIDAllLinks},
"url": {unfurledChannel.Url},
"image-id": {string(common.MediaServerChannelCommunityIcon)},
},
ExpectedHTTPStatusCode: http.StatusOK,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.verifyHTTPResponseThumbnail(rr, unfurledChannel.GetChannel().GetCommunity().Icon.Payload)
},
},
{
Name: "Test mime type not supported",
Parameters: url.Values{
"message-id": {messageIDUnsupportedImage},
"url": {unfurledContactWithUnsupportedImage.Url},
"image-id": {string(common.MediaServerContactIcon)},
},
ExpectedHTTPStatusCode: http.StatusNotImplemented,
},
{
Name: "Test request with missing 'message-id' parameter",
Parameters: url.Values{
"url": {unfurledCommunity.Url},
"image-id": {string(common.MediaServerCommunityIcon)},
},
ExpectedHTTPStatusCode: http.StatusBadRequest,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("missing query parameter 'message-id'\n", rr.Body.String())
},
},
{
Name: "Test request with missing 'url' parameter",
Parameters: url.Values{
"message-id": {messageIDCommunityOnly},
"image-id": {string(common.MediaServerCommunityIcon)},
},
ExpectedHTTPStatusCode: http.StatusBadRequest,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("missing query parameter 'url'\n", rr.Body.String())
},
},
{
Name: "Test request with missing 'image-id' parameter",
Parameters: url.Values{
"message-id": {messageIDCommunityOnly},
"url": {unfurledCommunity.Url},
},
ExpectedHTTPStatusCode: http.StatusBadRequest,
CheckFunc: func(s *HandlersSuite, rr *httptest.ResponseRecorder) {
s.Require().Equal("missing query parameter 'image-id'\n", rr.Body.String())
},
},
}
handler := handleStatusLinkPreviewThumbnail(s.db, s.logger)
for _, tc := range testCases {
s.Run(tc.Name, func() {
requestURL := "/dummy?" + tc.Parameters.Encode()
rr := s.httpGetReqRecorder(handler, requestURL)
s.Require().Equal(tc.ExpectedHTTPStatusCode, rr.Code)
if tc.CheckFunc != nil {
tc.CheckFunc(s, rr)
}
})
}
}

View File

@ -7,6 +7,7 @@ import (
"github.com/status-im/status-go/ipfs"
"github.com/status-im/status-go/logutils"
"github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/signal"
)
@ -37,16 +38,17 @@ func NewMediaServer(db *sql.DB, downloader *ipfs.Downloader, multiaccountsDB *mu
multiaccountsDB: multiaccountsDB,
}
s.SetHandlers(HandlerPatternMap{
accountImagesPath: handleAccountImages(s.multiaccountsDB, s.logger),
accountInitialsPath: handleAccountInitials(s.multiaccountsDB, s.logger),
audioPath: handleAudio(s.db, s.logger),
contactImagesPath: handleContactImages(s.db, s.logger),
discordAttachmentsPath: handleDiscordAttachment(s.db, s.logger),
discordAuthorsPath: handleDiscordAuthorAvatar(s.db, s.logger),
generateQRCode: handleQRCodeGeneration(s.multiaccountsDB, s.logger),
imagesPath: handleImage(s.db, s.logger),
ipfsPath: handleIPFS(s.downloader, s.logger),
LinkPreviewThumbnailPath: handleLinkPreviewThumbnail(s.db, s.logger),
accountImagesPath: handleAccountImages(s.multiaccountsDB, s.logger),
accountInitialsPath: handleAccountInitials(s.multiaccountsDB, s.logger),
audioPath: handleAudio(s.db, s.logger),
contactImagesPath: handleContactImages(s.db, s.logger),
discordAttachmentsPath: handleDiscordAttachment(s.db, s.logger),
discordAuthorsPath: handleDiscordAuthorAvatar(s.db, s.logger),
generateQRCode: handleQRCodeGeneration(s.multiaccountsDB, s.logger),
imagesPath: handleImage(s.db, s.logger),
ipfsPath: handleIPFS(s.downloader, s.logger),
LinkPreviewThumbnailPath: handleLinkPreviewThumbnail(s.db, s.logger),
StatusLinkPreviewThumbnailPath: handleStatusLinkPreviewThumbnail(s.db, s.logger),
})
return s, nil
@ -73,6 +75,13 @@ func (s *MediaServer) MakeLinkPreviewThumbnailURL(msgID string, previewURL strin
return u.String()
}
func (s *MediaServer) MakeStatusLinkPreviewThumbnailURL(msgID string, previewURL string, imageID common.MediaServerImageID) string {
u := s.MakeBaseURL()
u.Path = StatusLinkPreviewThumbnailPath
u.RawQuery = url.Values{"message-id": {msgID}, "url": {previewURL}, "image-id": {string(imageID)}}.Encode()
return u.String()
}
func (s *MediaServer) MakeDiscordAuthorAvatarURL(authorID string) string {
u := s.MakeBaseURL()
u.Path = discordAuthorsPath

View File

@ -16,6 +16,7 @@ import (
"github.com/stretchr/testify/suite"
"github.com/status-im/status-go/images"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/server/servertest"
)
@ -116,6 +117,16 @@ func (s *ServerURLSuite) TestServer_MakeLinkPreviewThumbnailURL() {
s.serverNoPort.MakeLinkPreviewThumbnailURL("99", "https://github.com"))
}
func (s *ServerURLSuite) TestServer_MakeStatusLinkPreviewThumbnailURL() {
s.Require().Equal(
baseURLWithCustomPort+"/status-link-preview/thumbnail?image-id=contact-icon&message-id=99&url=https%3A%2F%2Fstatus.app",
s.server.MakeStatusLinkPreviewThumbnailURL("99", "https://status.app", common.MediaServerContactIcon))
s.testNoPort(
baseURLWithDefaultPort+"/status-link-preview/thumbnail?image-id=contact-icon&message-id=99&url=https%3A%2F%2Fstatus.app",
s.serverNoPort.MakeStatusLinkPreviewThumbnailURL("99", "https://status.app", common.MediaServerContactIcon))
}
func (s *ServerURLSuite) TestServer_MakeAudioURL() {
s.Require().Equal(
baseURLWithCustomPort+"/messages/audio?messageId=0xde1e7ebee71e",

View File

@ -1166,7 +1166,7 @@ func (api *PublicAPI) GetTextURLs(text string) []string {
// be removed from the response.
//
// This endpoint expects the client to send URLs normalized by GetTextURLs.
func (api *PublicAPI) UnfurlURLs(urls []string) ([]common.LinkPreview, error) {
func (api *PublicAPI) UnfurlURLs(urls []string) (protocol.UnfurlURLsResponse, error) {
return api.service.messenger.UnfurlURLs(nil, urls)
}

View File

@ -104,7 +104,7 @@ func emojisTxt() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "emojis.txt", size: 28134, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "emojis.txt", size: 28134, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x28, 0xc, 0x22, 0x34, 0xa1, 0xeb, 0x8, 0x8d, 0xef, 0x38, 0x1b, 0xd8, 0xc2, 0x1a, 0x6d, 0xa2, 0x62, 0xad, 0x43, 0xfc, 0x1c, 0x38, 0xda, 0x8c, 0x3f, 0x34, 0xa, 0x8c, 0x6f, 0x5d, 0xd8}}
return a, nil
}
@ -124,7 +124,7 @@ func ConfigReadmeMd() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/README.md", size: 3031, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "../config/README.md", size: 3031, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0x44, 0x2b, 0x13, 0x14, 0x34, 0xa, 0x66, 0x62, 0x1b, 0xc6, 0x4a, 0x2c, 0x7d, 0x4d, 0x89, 0xfb, 0xc9, 0x69, 0xe4, 0x18, 0x5f, 0x3, 0x98, 0x6d, 0x3c, 0x9e, 0xa8, 0xcd, 0x53, 0x5d, 0x75}}
return a, nil
}
@ -144,7 +144,7 @@ func ConfigCliAnonMetricNodeClientJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/anon-metric-node-client.json", size: 857, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "../config/cli/anon-metric-node-client.json", size: 857, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x90, 0xdf, 0xcd, 0xc8, 0x92, 0x1d, 0x63, 0x5e, 0xe1, 0xf9, 0x7f, 0xed, 0xf2, 0x68, 0x6b, 0x20, 0xff, 0x1d, 0x3b, 0xc9, 0x7b, 0xb9, 0x6a, 0xba, 0xd3, 0xbd, 0xf7, 0x48, 0x7b, 0x5a, 0x52, 0x79}}
return a, nil
}
@ -164,7 +164,7 @@ func ConfigCliAnonMetricNodeServerJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/anon-metric-node-server.json", size: 696, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "../config/cli/anon-metric-node-server.json", size: 696, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf0, 0x2f, 0x97, 0xab, 0x77, 0x61, 0x93, 0x9d, 0x1f, 0x33, 0x18, 0x72, 0xad, 0xce, 0xa3, 0x35, 0xa9, 0x44, 0xbf, 0x29, 0xa8, 0xea, 0x21, 0xb7, 0x22, 0x7f, 0x7d, 0x3a, 0x6b, 0x55, 0x3c, 0x66}}
return a, nil
}
@ -184,7 +184,7 @@ func ConfigCliFleetEthProdJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-eth.prod.json", size: 3619, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-eth.prod.json", size: 3619, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x4f, 0x86, 0x8b, 0x6e, 0x2, 0x27, 0xa3, 0x37, 0x27, 0x74, 0x51, 0xf0, 0x97, 0x5b, 0x64, 0x8e, 0xbd, 0x29, 0xba, 0x75, 0x2d, 0x75, 0x78, 0x46, 0xb9, 0x56, 0x6, 0xb1, 0xf9, 0x85, 0xdd}}
return a, nil
}
@ -204,7 +204,7 @@ func ConfigCliFleetEthStagingJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-eth.staging.json", size: 2139, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-eth.staging.json", size: 2139, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb0, 0xac, 0xc9, 0x61, 0x97, 0x42, 0x0, 0x3a, 0xfc, 0x78, 0x11, 0xa1, 0xc7, 0x55, 0x71, 0x46, 0x72, 0x3e, 0x52, 0xb0, 0x89, 0x69, 0x7f, 0x8f, 0xf1, 0x26, 0x44, 0xc5, 0xfc, 0x20, 0x9f, 0xa1}}
return a, nil
}
@ -224,7 +224,7 @@ func ConfigCliFleetShardsTestJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-shards.test.json", size: 1954, mode: os.FileMode(0664), modTime: time.Unix(1696363813, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-shards.test.json", size: 1954, mode: os.FileMode(0644), modTime: time.Unix(1697196255, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcf, 0xeb, 0x33, 0xd4, 0x3, 0x54, 0xff, 0xda, 0x1f, 0xc4, 0xc, 0x91, 0x88, 0x1e, 0x53, 0xbf, 0x49, 0xa, 0x6c, 0x45, 0xf9, 0x19, 0x91, 0xec, 0xe, 0x1a, 0xfc, 0x14, 0x86, 0x8d, 0xa3, 0x5a}}
return a, nil
}
@ -244,7 +244,7 @@ func ConfigCliFleetStatusProdJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-status.prod.json", size: 2338, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-status.prod.json", size: 2338, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0xea, 0x14, 0x57, 0xed, 0x60, 0x4d, 0xb6, 0x32, 0x7e, 0xd3, 0xbe, 0x1e, 0xc7, 0xfe, 0x42, 0xee, 0xfe, 0x10, 0xe4, 0x22, 0x64, 0xc1, 0xb9, 0xce, 0x34, 0xcd, 0xdd, 0xe3, 0x38, 0x43, 0xd3}}
return a, nil
}
@ -264,7 +264,7 @@ func ConfigCliFleetStatusTestJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-status.test.json", size: 1457, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-status.test.json", size: 1457, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x9f, 0x8f, 0x25, 0x1f, 0x31, 0xbd, 0x72, 0x26, 0xb7, 0xd, 0x7e, 0xcb, 0xbb, 0x12, 0xef, 0x9f, 0x1a, 0x2e, 0xb, 0x96, 0x64, 0x7d, 0x52, 0x9e, 0x68, 0x13, 0x55, 0xd5, 0x88, 0x38, 0x7b}}
return a, nil
}
@ -284,7 +284,7 @@ func ConfigCliFleetWakuv2ProdJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-wakuv2.prod.json", size: 1264, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-wakuv2.prod.json", size: 1264, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x71, 0xb9, 0x1c, 0x57, 0x50, 0xa9, 0x93, 0x70, 0xcd, 0xd7, 0x22, 0xee, 0x65, 0x72, 0x11, 0x71, 0xd3, 0x20, 0xd0, 0xf0, 0x4d, 0x53, 0x94, 0x44, 0x81, 0xbd, 0x11, 0xed, 0x5e, 0x72, 0x0, 0x12}}
return a, nil
}
@ -304,7 +304,7 @@ func ConfigCliFleetWakuv2TestJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-wakuv2.test.json", size: 1264, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-wakuv2.test.json", size: 1264, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2c, 0x67, 0x1e, 0xd1, 0x98, 0x7b, 0xf3, 0x9f, 0x76, 0xa0, 0xbe, 0x67, 0x29, 0xdb, 0xd7, 0x3e, 0xb8, 0x7c, 0x65, 0x2d, 0x2, 0x84, 0xe0, 0xab, 0x8d, 0x3d, 0x4a, 0x53, 0xb4, 0xa7, 0x2e, 0xf0}}
return a, nil
}
@ -324,7 +324,7 @@ func ConfigCliLesEnabledJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/les-enabled.json", size: 58, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "../config/cli/les-enabled.json", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xee, 0x27, 0xa7, 0x74, 0xa0, 0x46, 0xa1, 0x41, 0xed, 0x4d, 0x16, 0x5b, 0xf3, 0xf0, 0x7c, 0xc8, 0x2f, 0x6f, 0x47, 0xa4, 0xbb, 0x5f, 0x43, 0x33, 0xd, 0x9, 0x9d, 0xea, 0x9e, 0x15, 0xee}}
return a, nil
}
@ -344,7 +344,7 @@ func ConfigCliMailserverEnabledJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/mailserver-enabled.json", size: 176, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "../config/cli/mailserver-enabled.json", size: 176, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xec, 0x81, 0x8b, 0x99, 0xb6, 0xdb, 0xc0, 0x8b, 0x46, 0x97, 0x96, 0xc7, 0x58, 0x30, 0x33, 0xef, 0x54, 0x25, 0x87, 0x7b, 0xb9, 0x94, 0x6b, 0x18, 0xa4, 0x5b, 0x58, 0x67, 0x7c, 0x44, 0xa6}}
return a, nil
}
@ -364,7 +364,7 @@ func ConfigStatusChainGenesisJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/status-chain-genesis.json", size: 612, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "../config/status-chain-genesis.json", size: 612, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb, 0xf0, 0xc, 0x1, 0x95, 0x65, 0x6, 0x55, 0x48, 0x8f, 0x83, 0xa0, 0xb4, 0x81, 0xda, 0xad, 0x30, 0x6d, 0xb2, 0x78, 0x1b, 0x26, 0x4, 0x13, 0x12, 0x9, 0x6, 0xae, 0x3a, 0x2c, 0x1, 0x71}}
return a, nil
}
@ -384,7 +384,7 @@ func keysBootnodeKey() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/bootnode.key", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "keys/bootnode.key", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x31, 0xcf, 0x27, 0xd4, 0x96, 0x2e, 0x32, 0xcd, 0x58, 0x96, 0x2a, 0xe5, 0x8c, 0xa0, 0xf1, 0x73, 0x1f, 0xd6, 0xd6, 0x8b, 0xb, 0x73, 0xd3, 0x2c, 0x84, 0x1a, 0x56, 0xa4, 0x74, 0xb6, 0x95, 0x20}}
return a, nil
}
@ -404,7 +404,7 @@ func keysFirebaseauthkey() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/firebaseauthkey", size: 153, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "keys/firebaseauthkey", size: 153, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe, 0x69, 0x23, 0x64, 0x7d, 0xf9, 0x14, 0x37, 0x6f, 0x2b, 0x1, 0xf0, 0xb0, 0xa4, 0xb2, 0xd0, 0x18, 0xcd, 0xf9, 0xeb, 0x57, 0xa3, 0xfd, 0x79, 0x25, 0xa7, 0x9c, 0x3, 0xce, 0x26, 0xec, 0xe1}}
return a, nil
}
@ -424,7 +424,7 @@ func keysTestAccount1StatusChainPk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account1-status-chain.pk", size: 489, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "keys/test-account1-status-chain.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0xba, 0x35, 0x1, 0x2b, 0x9d, 0xad, 0xf0, 0x2d, 0x3c, 0x4d, 0x6, 0xb5, 0x22, 0x2, 0x47, 0xd4, 0x1c, 0xf4, 0x31, 0x2f, 0xb, 0x5b, 0x27, 0x5d, 0x43, 0x97, 0x58, 0x2d, 0xf0, 0xe1, 0xbe}}
return a, nil
}
@ -444,7 +444,7 @@ func keysTestAccount1Pk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account1.pk", size: 491, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "keys/test-account1.pk", size: 491, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9, 0x43, 0xc2, 0xf4, 0x8c, 0xc6, 0x64, 0x25, 0x8c, 0x7, 0x8c, 0xa8, 0x89, 0x2b, 0x7b, 0x9b, 0x4f, 0x81, 0xcb, 0xce, 0x3d, 0xef, 0x82, 0x9c, 0x27, 0x27, 0xa9, 0xc5, 0x46, 0x70, 0x30, 0x38}}
return a, nil
}
@ -464,7 +464,7 @@ func keysTestAccount2StatusChainPk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account2-status-chain.pk", size: 489, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "keys/test-account2-status-chain.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9, 0xf8, 0x5c, 0xe9, 0x92, 0x96, 0x2d, 0x88, 0x2b, 0x8e, 0x42, 0x3f, 0xa4, 0x93, 0x6c, 0xad, 0xe9, 0xc0, 0x1b, 0x8a, 0x8, 0x8c, 0x5e, 0x7a, 0x84, 0xa2, 0xf, 0x9f, 0x77, 0x58, 0x2c, 0x2c}}
return a, nil
}
@ -484,7 +484,7 @@ func keysTestAccount2Pk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account2.pk", size: 491, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "keys/test-account2.pk", size: 491, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9f, 0x72, 0xd5, 0x95, 0x5c, 0x5a, 0x99, 0x9d, 0x2f, 0x21, 0x83, 0xd7, 0x10, 0x17, 0x4a, 0x3d, 0x65, 0xc9, 0x26, 0x1a, 0x2c, 0x9d, 0x65, 0x63, 0xd2, 0xa0, 0xfc, 0x7c, 0x0, 0x87, 0x38, 0x9f}}
return a, nil
}
@ -504,7 +504,7 @@ func keysTestAccount3BeforeEip55Pk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account3-before-eip55.pk", size: 489, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)}
info := bindataFileInfo{name: "keys/test-account3-before-eip55.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x40, 0x56, 0xc1, 0x5e, 0x10, 0x6e, 0x28, 0x15, 0x3, 0x4e, 0xc4, 0xc4, 0x71, 0x4d, 0x16, 0x99, 0xcc, 0x1b, 0x63, 0xee, 0x10, 0x20, 0xe4, 0x59, 0x52, 0x3f, 0xc0, 0xad, 0x15, 0x13, 0x72}}
return a, nil
}

View File

@ -86,7 +86,7 @@ func configPublicChainAccountsJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "config/public-chain-accounts.json", size: 307, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "config/public-chain-accounts.json", size: 307, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x76, 0x5d, 0xc0, 0xfe, 0x57, 0x50, 0x18, 0xec, 0x2d, 0x61, 0x1b, 0xa9, 0x81, 0x11, 0x5f, 0x77, 0xf7, 0xb6, 0x67, 0x82, 0x1, 0x40, 0x68, 0x9d, 0xc5, 0x41, 0xaf, 0xce, 0x43, 0x81, 0x92, 0x96}}
return a, nil
}
@ -106,7 +106,7 @@ func configStatusChainAccountsJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "config/status-chain-accounts.json", size: 543, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "config/status-chain-accounts.json", size: 543, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8e, 0xb3, 0x61, 0x51, 0x70, 0x3c, 0x12, 0x3e, 0xf1, 0x1c, 0x81, 0xfb, 0x9a, 0x7c, 0xe3, 0x63, 0xd0, 0x8f, 0x12, 0xc5, 0x2d, 0xf4, 0xea, 0x27, 0x33, 0xef, 0xca, 0xf9, 0x3f, 0x72, 0x44, 0xbf}}
return a, nil
}
@ -126,7 +126,7 @@ func configTestDataJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "config/test-data.json", size: 84, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)}
info := bindataFileInfo{name: "config/test-data.json", size: 84, mode: os.FileMode(0644), modTime: time.Unix(1697059193, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xce, 0x9d, 0x80, 0xf5, 0x87, 0xfa, 0x57, 0x1d, 0xa1, 0xd5, 0x7a, 0x10, 0x3, 0xac, 0xd7, 0xf4, 0x64, 0x32, 0x96, 0x2b, 0xb7, 0x21, 0xb7, 0xa6, 0x80, 0x40, 0xe9, 0x65, 0xe3, 0xd6, 0xbd, 0x40}}
return a, nil
}

File diff suppressed because one or more lines are too long