From 6f5070b2435f03c8685291e6e92703b2a539956f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 12 Jul 2022 13:14:17 +0300 Subject: [PATCH] Add message and status fields to status events --- go.mod | 2 +- go.sum | 4 ++-- messagetracking.go | 43 ++++++++++++++++++++----------------------- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 520d64e..b163a68 100644 --- a/go.mod +++ b/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 ( diff --git a/go.sum b/go.sum index c61fc25..e5eb346 100644 --- a/go.sum +++ b/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= diff --git a/messagetracking.go b/messagetracking.go index 95c73a2..6edf17e 100644 --- a/messagetracking.go +++ b/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())) }