From e939f164d2483f38c5cfedbdb0e64b04148bbe89 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 1 Aug 2024 15:08:31 +0300 Subject: [PATCH] bridgev2/matrix: use beeper inbox state endpoint if available --- bridgev2/matrix/intent.go | 36 ++++++++++++++++++++++-------------- client.go | 6 ++++++ requests.go | 10 ++++++++++ versions.go | 1 + 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/bridgev2/matrix/intent.go b/bridgev2/matrix/intent.go index 6807e4af..b97ea1e2 100644 --- a/bridgev2/matrix/intent.go +++ b/bridgev2/matrix/intent.go @@ -14,6 +14,7 @@ import ( "time" "github.com/rs/zerolog" + "go.mau.fi/util/ptr" "golang.org/x/exp/slices" "maunium.net/go/mautrix" @@ -118,7 +119,7 @@ func (as *ASIntent) SendState(ctx context.Context, roomID id.RoomID, eventType e } } -func (as *ASIntent) MarkRead(ctx context.Context, roomID id.RoomID, eventID id.EventID, ts time.Time) error { +func (as *ASIntent) MarkRead(ctx context.Context, roomID id.RoomID, eventID id.EventID, ts time.Time) (err error) { extraData := map[string]any{} if !ts.IsZero() { extraData["ts"] = ts.UnixMilli() @@ -132,25 +133,32 @@ func (as *ASIntent) MarkRead(ctx context.Context, roomID id.RoomID, eventID id.E req.FullyRead = eventID req.BeeperFullyReadExtra = extraData } - err := as.Matrix.SetReadMarkers(ctx, roomID, &req) - if err != nil { - return err - } - if as.Matrix.IsCustomPuppet { - err = as.Matrix.SetRoomAccountData(ctx, roomID, event.AccountDataMarkedUnread.Type, &event.MarkedUnreadEventContent{ - Unread: false, + if as.Matrix.IsCustomPuppet && as.Connector.SpecVersions.Supports(mautrix.BeeperFeatureInboxState) { + err = as.Matrix.SetBeeperInboxState(ctx, roomID, &mautrix.ReqSetBeeperInboxState{ + MarkedUnread: ptr.Ptr(false), + ReadMarkers: &req, }) - if err != nil { - return err + } else { + err = as.Matrix.SetReadMarkers(ctx, roomID, &req) + if err == nil && as.Matrix.IsCustomPuppet { + err = as.Matrix.SetRoomAccountData(ctx, roomID, event.AccountDataMarkedUnread.Type, &event.MarkedUnreadEventContent{ + Unread: false, + }) } } - return nil + return } func (as *ASIntent) MarkUnread(ctx context.Context, roomID id.RoomID, unread bool) error { - return as.Matrix.SetRoomAccountData(ctx, roomID, event.AccountDataMarkedUnread.Type, &event.MarkedUnreadEventContent{ - Unread: unread, - }) + if as.Matrix.IsCustomPuppet && as.Connector.SpecVersions.Supports(mautrix.BeeperFeatureInboxState) { + return as.Matrix.SetBeeperInboxState(ctx, roomID, &mautrix.ReqSetBeeperInboxState{ + MarkedUnread: ptr.Ptr(unread), + }) + } else { + return as.Matrix.SetRoomAccountData(ctx, roomID, event.AccountDataMarkedUnread.Type, &event.MarkedUnreadEventContent{ + Unread: unread, + }) + } } func (as *ASIntent) MarkTyping(ctx context.Context, roomID id.RoomID, typingType bridgev2.TypingType, timeout time.Duration) error { diff --git a/client.go b/client.go index 997d7363..9c5ad194 100644 --- a/client.go +++ b/client.go @@ -1932,6 +1932,12 @@ func (cli *Client) SetReadMarkers(ctx context.Context, roomID id.RoomID, content return } +func (cli *Client) SetBeeperInboxState(ctx context.Context, roomID id.RoomID, content *ReqSetBeeperInboxState) (err error) { + urlPath := cli.BuildClientURL("unstable", "com.beeper.inbox", "user", cli.UserID, "rooms", roomID, "inbox_state") + _, err = cli.MakeRequest(ctx, http.MethodPost, urlPath, content, nil) + return +} + func (cli *Client) AddTag(ctx context.Context, roomID id.RoomID, tag event.RoomTag, order float64) error { return cli.AddTagWithCustomData(ctx, roomID, tag, &event.TagMetadata{ Order: json.Number(strconv.FormatFloat(order, 'e', -1, 64)), diff --git a/requests.go b/requests.go index b6c2f895..d4b634af 100644 --- a/requests.go +++ b/requests.go @@ -365,6 +365,16 @@ type ReqSetReadMarkers struct { BeeperFullyReadExtra interface{} `json:"com.beeper.fully_read.extra,omitempty"` } +type BeeperInboxDone struct { + Delta int64 `json:"at_delta"` +} + +type ReqSetBeeperInboxState struct { + MarkedUnread *bool `json:"marked_unread,omitempty"` + Done *BeeperInboxDone `json:"done,omitempty"` + ReadMarkers *ReqSetReadMarkers `json:"read_markers,omitempty"` +} + type ReqSendReceipt struct { ThreadID string `json:"thread_id,omitempty"` } diff --git a/versions.go b/versions.go index 010d987b..60eb0f30 100644 --- a/versions.go +++ b/versions.go @@ -69,6 +69,7 @@ var ( BeeperFeatureAutojoinInvites = UnstableFeature{UnstableFlag: "com.beeper.room_create_autojoin_invites"} BeeperFeatureArbitraryProfileMeta = UnstableFeature{UnstableFlag: "com.beeper.arbitrary_profile_meta"} BeeperFeatureAccountDataMute = UnstableFeature{UnstableFlag: "com.beeper.account_data_mute"} + BeeperFeatureInboxState = UnstableFeature{UnstableFlag: "com.beeper.inbox_state"} ) func (versions *RespVersions) Supports(feature UnstableFeature) bool {