Browse Source

Send fully read marker too when bridging read receipts to Matrix

Tulir Asokan 3 years ago
parent
commit
1ebfeedcb7
3 changed files with 26 additions and 9 deletions
  1. 1 1
      go.mod
  2. 2 2
      go.sum
  3. 23 6
      user.go

+ 1 - 1
go.mod

@@ -15,7 +15,7 @@ require (
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
 	maunium.net/go/mauflag v1.0.0
 	maunium.net/go/maulogger/v2 v2.3.2
-	maunium.net/go/mautrix v0.10.11-0.20220117133225-66726fa3ee9a
+	maunium.net/go/mautrix v0.10.11-0.20220117200125-6d9d537973fa
 )
 
 require (

+ 2 - 2
go.sum

@@ -222,5 +222,5 @@ maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M=
 maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA=
 maunium.net/go/maulogger/v2 v2.3.2 h1:1XmIYmMd3PoQfp9J+PaHhpt80zpfmMqaShzUTC7FwY0=
 maunium.net/go/maulogger/v2 v2.3.2/go.mod h1:TYWy7wKwz/tIXTpsx8G3mZseIRiC5DoMxSZazOHy68A=
-maunium.net/go/mautrix v0.10.11-0.20220117133225-66726fa3ee9a h1:Ydo0Kj/mlUw/OAXzkDGMDc2kdCJ9MPj0aP15Kh8qLoE=
-maunium.net/go/mautrix v0.10.11-0.20220117133225-66726fa3ee9a/go.mod h1:4XljZZGZiIlpfbQ+Tt2ykjapskJ8a7Z2i9y/+YaceF8=
+maunium.net/go/mautrix v0.10.11-0.20220117200125-6d9d537973fa h1:PA9cvjbiV2tqd5qgrnk42G4HfSLVWWqs27dKKvG1tCQ=
+maunium.net/go/mautrix v0.10.11-0.20220117200125-6d9d537973fa/go.mod h1:4XljZZGZiIlpfbQ+Tt2ykjapskJ8a7Z2i9y/+YaceF8=

+ 23 - 6
user.go

@@ -659,6 +659,12 @@ type CustomReadReceipt struct {
 	DoublePuppetSource string `json:"fi.mau.double_puppet_source,omitempty"`
 }
 
+type CustomReadMarkers struct {
+	mautrix.ReqSetReadMarkers
+	ReadExtra      CustomReadReceipt `json:"com.beeper.read.extra"`
+	FullyReadExtra CustomReadReceipt `json:"com.beeper.fully_read.extra"`
+}
+
 func (user *User) syncChatDoublePuppetDetails(portal *Portal, justCreated bool) {
 	doublePuppet := portal.bridge.GetPuppetByCustomMXID(user.MXID)
 	if doublePuppet == nil {
@@ -871,12 +877,8 @@ func (user *User) handleReceipt(receipt *events.Receipt) {
 		}
 	}
 	intent := user.bridge.GetPuppetByJID(receipt.Sender).IntentFor(portal)
-	var rrContent CustomReadReceipt
-	if intent.IsCustomPuppet {
-		rrContent.DoublePuppetSource = doublePuppetValue
-	}
 	for _, msg := range markAsRead {
-		err := intent.MarkReadWithContent(portal.MXID, msg.MXID, &rrContent)
+		err := intent.SetReadMarkers(portal.MXID, makeReadMarkerContent(msg.MXID, intent.IsCustomPuppet))
 		if err != nil {
 			user.log.Warnfln("Failed to mark message %s as read by %s: %v", msg.MXID, intent.UserID, err)
 		} else {
@@ -885,6 +887,21 @@ func (user *User) handleReceipt(receipt *events.Receipt) {
 	}
 }
 
+func makeReadMarkerContent(eventID id.EventID, doublePuppet bool) CustomReadMarkers {
+	var extra CustomReadReceipt
+	if doublePuppet {
+		extra.DoublePuppetSource = doublePuppetValue
+	}
+	return CustomReadMarkers{
+		ReqSetReadMarkers: mautrix.ReqSetReadMarkers{
+			Read:      eventID,
+			FullyRead: eventID,
+		},
+		ReadExtra:      extra,
+		FullyReadExtra: extra,
+	}
+}
+
 func (user *User) markSelfReadFull(portal *Portal) {
 	puppet := user.bridge.GetPuppetByCustomMXID(user.MXID)
 	if puppet == nil || puppet.CustomIntent() == nil {
@@ -895,7 +912,7 @@ func (user *User) markSelfReadFull(portal *Portal) {
 		return
 	}
 	user.SetLastReadTS(portal.Key, lastMessage.Timestamp)
-	err := puppet.CustomIntent().MarkReadWithContent(portal.MXID, lastMessage.MXID, &CustomReadReceipt{DoublePuppetSource: doublePuppetValue})
+	err := puppet.CustomIntent().SetReadMarkers(portal.MXID, makeReadMarkerContent(lastMessage.MXID, true))
 	if err != nil {
 		user.log.Warnfln("Failed to mark %s (last message) in %s as read: %v", lastMessage.MXID, portal.MXID, err)
 	} else {