瀏覽代碼

Add message and status fields to status events

Tulir Asokan 3 年之前
父節點
當前提交
6f5070b243
共有 3 個文件被更改,包括 23 次插入26 次删除
  1. 1 1
      go.mod
  2. 2 2
      go.sum
  3. 20 23
      messagetracking.go

+ 1 - 1
go.mod

@@ -15,7 +15,7 @@ require (
 	golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e
 	google.golang.org/protobuf v1.28.0
 	maunium.net/go/maulogger/v2 v2.3.2
-	maunium.net/go/mautrix v0.11.1-0.20220711120626-546455a7c0ef
+	maunium.net/go/mautrix v0.11.1-0.20220712101332-3467963a8fe8
 )
 
 require (

+ 2 - 2
go.sum

@@ -108,5 +108,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.11.1-0.20220711120626-546455a7c0ef h1:XCq8B290fN3IsoLhng/+I3puv6FoW9SanDJqvOJ0O+4=
-maunium.net/go/mautrix v0.11.1-0.20220711120626-546455a7c0ef/go.mod h1:85mjebfgKX7jjca7XNKTt7lHueX3YQsFUU+5o/FxpTw=
+maunium.net/go/mautrix v0.11.1-0.20220712101332-3467963a8fe8 h1:/i2u7iVWhfRcHieby7+uhog6k9yzIauYqVCESpCfw4s=
+maunium.net/go/mautrix v0.11.1-0.20220712101332-3467963a8fe8/go.mod h1:85mjebfgKX7jjca7XNKTt7lHueX3YQsFUU+5o/FxpTw=

+ 20 - 23
messagetracking.go

@@ -61,7 +61,7 @@ var (
 	errTimeoutBeforeHandling = errors.New("message timed out before handling was started")
 )
 
-func errorToStatusReason(err error) (reason event.MessageStatusReason, isCertain, canRetry, sendNotice bool) {
+func errorToStatusReason(err error) (reason event.MessageStatusReason, status event.MessageStatus, isCertain, sendNotice bool, humanMessage string) {
 	switch {
 	case errors.Is(err, whatsmeow.ErrBroadcastListUnsupported),
 		errors.Is(err, errUnexpectedParsedContentType),
@@ -71,28 +71,30 @@ func errorToStatusReason(err error) (reason event.MessageStatusReason, isCertain
 		errors.Is(err, whatsmeow.ErrRecipientADJID),
 		errors.Is(err, errBroadcastReactionNotSupported),
 		errors.Is(err, errBroadcastSendDisabled):
-		return event.MessageStatusUnsupported, true, false, true
+		return event.MessageStatusUnsupported, event.MessageStatusFail, true, true, ""
 	case errors.Is(err, errTimeoutBeforeHandling):
-		return event.MessageStatusTooOld, true, true, true
-	case errors.Is(err, context.DeadlineExceeded), errors.Is(err, errMessageTakingLong):
-		return event.MessageStatusTooOld, false, true, true
+		return event.MessageStatusTooOld, event.MessageStatusRetriable, true, true, "the message was too old when it reached the bridge, so it was not handled"
+	case errors.Is(err, context.DeadlineExceeded):
+		return event.MessageStatusTooOld, event.MessageStatusRetriable, false, true, "handling the message took too long and was cancelled"
+	case errors.Is(err, errMessageTakingLong):
+		return event.MessageStatusTooOld, event.MessageStatusPending, false, true, err.Error()
 	case errors.Is(err, errTargetNotFound),
 		errors.Is(err, errTargetIsFake),
 		errors.Is(err, errReactionDatabaseNotFound),
 		errors.Is(err, errReactionTargetNotFound),
 		errors.Is(err, errTargetSentBySomeoneElse):
-		return event.MessageStatusGenericError, true, false, false
+		return event.MessageStatusGenericError, event.MessageStatusFail, true, false, ""
 	case errors.Is(err, whatsmeow.ErrNotConnected),
 		errors.Is(err, errUserNotConnected):
-		return event.MessageStatusGenericError, true, true, true
+		return event.MessageStatusGenericError, event.MessageStatusRetriable, true, true, ""
 	case errors.Is(err, errUserNotLoggedIn),
 		errors.Is(err, errDifferentUser):
-		return event.MessageStatusGenericError, true, true, false
+		return event.MessageStatusGenericError, event.MessageStatusRetriable, true, false, ""
 	case errors.Is(err, errMessageDisconnected),
 		errors.Is(err, errMessageRetryDisconnected):
-		return event.MessageStatusGenericError, false, true, true
+		return event.MessageStatusGenericError, event.MessageStatusRetriable, false, true, ""
 	default:
-		return event.MessageStatusGenericError, false, true, true
+		return event.MessageStatusGenericError, event.MessageStatusRetriable, false, true, ""
 	}
 }
 
@@ -143,17 +145,15 @@ func (portal *Portal) sendStatusEvent(evtID, lastRetry id.EventID, err error) {
 			Type:    event.RelReference,
 			EventID: evtID,
 		},
-		Success:   err == nil,
 		LastRetry: lastRetry,
 	}
-	if !content.Success {
-		reason, isCertain, canRetry, _ := errorToStatusReason(err)
-		content.Reason = reason
-		content.IsCertain = &isCertain
-		content.CanRetry = &canRetry
-		content.StillWorking = errors.Is(err, errMessageTakingLong)
+	if err == nil {
+		content.Status = event.MessageStatusSuccess
+	} else {
+		content.Reason, content.Status, _, _, content.Message = errorToStatusReason(err)
 		content.Error = err.Error()
 	}
+	content.FillLegacyBooleans()
 	_, err = intent.SendMessageEvent(portal.MXID, event.BeeperMessageStatus, &content)
 	if err != nil {
 		portal.log.Warnln("Failed to send message status event:", err)
@@ -195,12 +195,9 @@ func (portal *Portal) sendMessageMetrics(evt *event.Event, err error, part strin
 			level = log.LevelDebug
 		}
 		portal.log.Logfln(level, "%s %s %s from %s: %v", part, msgType, evtDescription, evt.Sender, err)
-		reason, isCertain, _, sendNotice := errorToStatusReason(err)
-		status := bridge.ReasonToCheckpointStatus(reason)
-		if errors.Is(err, errMessageTakingLong) {
-			status = bridge.MsgStatusWillRetry
-		}
-		portal.bridge.SendMessageCheckpoint(evt, bridge.MsgStepRemote, err, status, ms.getRetryNum())
+		reason, status, isCertain, sendNotice, _ := errorToStatusReason(err)
+		checkpointStatus := bridge.ReasonToCheckpointStatus(reason, status)
+		portal.bridge.SendMessageCheckpoint(evt, bridge.MsgStepRemote, err, checkpointStatus, ms.getRetryNum())
 		if sendNotice {
 			ms.setNoticeID(portal.sendErrorMessage(evt, err, isCertain, ms.getNoticeID()))
 		}