Add message and status fields to status events

This commit is contained in:
Tulir Asokan 2022-07-12 13:14:17 +03:00
parent 7ccc0d005e
commit 6f5070b243
3 changed files with 23 additions and 26 deletions

2
go.mod
View file

@ -15,7 +15,7 @@ require (
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e
google.golang.org/protobuf v1.28.0 google.golang.org/protobuf v1.28.0
maunium.net/go/maulogger/v2 v2.3.2 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 ( require (

4
go.sum
View file

@ -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/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 h1:1XmIYmMd3PoQfp9J+PaHhpt80zpfmMqaShzUTC7FwY0=
maunium.net/go/maulogger/v2 v2.3.2/go.mod h1:TYWy7wKwz/tIXTpsx8G3mZseIRiC5DoMxSZazOHy68A= 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.20220712101332-3467963a8fe8 h1:/i2u7iVWhfRcHieby7+uhog6k9yzIauYqVCESpCfw4s=
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/go.mod h1:85mjebfgKX7jjca7XNKTt7lHueX3YQsFUU+5o/FxpTw=

View file

@ -61,7 +61,7 @@ var (
errTimeoutBeforeHandling = errors.New("message timed out before handling was started") 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 { switch {
case errors.Is(err, whatsmeow.ErrBroadcastListUnsupported), case errors.Is(err, whatsmeow.ErrBroadcastListUnsupported),
errors.Is(err, errUnexpectedParsedContentType), errors.Is(err, errUnexpectedParsedContentType),
@ -71,28 +71,30 @@ func errorToStatusReason(err error) (reason event.MessageStatusReason, isCertain
errors.Is(err, whatsmeow.ErrRecipientADJID), errors.Is(err, whatsmeow.ErrRecipientADJID),
errors.Is(err, errBroadcastReactionNotSupported), errors.Is(err, errBroadcastReactionNotSupported),
errors.Is(err, errBroadcastSendDisabled): errors.Is(err, errBroadcastSendDisabled):
return event.MessageStatusUnsupported, true, false, true return event.MessageStatusUnsupported, event.MessageStatusFail, true, true, ""
case errors.Is(err, errTimeoutBeforeHandling): case errors.Is(err, errTimeoutBeforeHandling):
return event.MessageStatusTooOld, true, 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), errors.Is(err, errMessageTakingLong): case errors.Is(err, context.DeadlineExceeded):
return event.MessageStatusTooOld, false, true, true 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), case errors.Is(err, errTargetNotFound),
errors.Is(err, errTargetIsFake), errors.Is(err, errTargetIsFake),
errors.Is(err, errReactionDatabaseNotFound), errors.Is(err, errReactionDatabaseNotFound),
errors.Is(err, errReactionTargetNotFound), errors.Is(err, errReactionTargetNotFound),
errors.Is(err, errTargetSentBySomeoneElse): errors.Is(err, errTargetSentBySomeoneElse):
return event.MessageStatusGenericError, true, false, false return event.MessageStatusGenericError, event.MessageStatusFail, true, false, ""
case errors.Is(err, whatsmeow.ErrNotConnected), case errors.Is(err, whatsmeow.ErrNotConnected),
errors.Is(err, errUserNotConnected): errors.Is(err, errUserNotConnected):
return event.MessageStatusGenericError, true, true, true return event.MessageStatusGenericError, event.MessageStatusRetriable, true, true, ""
case errors.Is(err, errUserNotLoggedIn), case errors.Is(err, errUserNotLoggedIn),
errors.Is(err, errDifferentUser): errors.Is(err, errDifferentUser):
return event.MessageStatusGenericError, true, true, false return event.MessageStatusGenericError, event.MessageStatusRetriable, true, false, ""
case errors.Is(err, errMessageDisconnected), case errors.Is(err, errMessageDisconnected),
errors.Is(err, errMessageRetryDisconnected): errors.Is(err, errMessageRetryDisconnected):
return event.MessageStatusGenericError, false, true, true return event.MessageStatusGenericError, event.MessageStatusRetriable, false, true, ""
default: 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, Type: event.RelReference,
EventID: evtID, EventID: evtID,
}, },
Success: err == nil,
LastRetry: lastRetry, LastRetry: lastRetry,
} }
if !content.Success { if err == nil {
reason, isCertain, canRetry, _ := errorToStatusReason(err) content.Status = event.MessageStatusSuccess
content.Reason = reason } else {
content.IsCertain = &isCertain content.Reason, content.Status, _, _, content.Message = errorToStatusReason(err)
content.CanRetry = &canRetry
content.StillWorking = errors.Is(err, errMessageTakingLong)
content.Error = err.Error() content.Error = err.Error()
} }
content.FillLegacyBooleans()
_, err = intent.SendMessageEvent(portal.MXID, event.BeeperMessageStatus, &content) _, err = intent.SendMessageEvent(portal.MXID, event.BeeperMessageStatus, &content)
if err != nil { if err != nil {
portal.log.Warnln("Failed to send message status event:", err) 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 level = log.LevelDebug
} }
portal.log.Logfln(level, "%s %s %s from %s: %v", part, msgType, evtDescription, evt.Sender, err) portal.log.Logfln(level, "%s %s %s from %s: %v", part, msgType, evtDescription, evt.Sender, err)
reason, isCertain, _, sendNotice := errorToStatusReason(err) reason, status, isCertain, sendNotice, _ := errorToStatusReason(err)
status := bridge.ReasonToCheckpointStatus(reason) checkpointStatus := bridge.ReasonToCheckpointStatus(reason, status)
if errors.Is(err, errMessageTakingLong) { portal.bridge.SendMessageCheckpoint(evt, bridge.MsgStepRemote, err, checkpointStatus, ms.getRetryNum())
status = bridge.MsgStatusWillRetry
}
portal.bridge.SendMessageCheckpoint(evt, bridge.MsgStepRemote, err, status, ms.getRetryNum())
if sendNotice { if sendNotice {
ms.setNoticeID(portal.sendErrorMessage(evt, err, isCertain, ms.getNoticeID())) ms.setNoticeID(portal.sendErrorMessage(evt, err, isCertain, ms.getNoticeID()))
} }