From d887887d8b9b7f6a8a7e6320711350d1cae3c1c5 Mon Sep 17 00:00:00 2001 From: Sumner Evans Date: Sun, 17 Nov 2024 22:36:06 -0700 Subject: [PATCH] connector/matrix: make error messages on message sends more human-readable Signed-off-by: Sumner Evans --- pkg/connector/matrix.go | 48 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/pkg/connector/matrix.go b/pkg/connector/matrix.go index 6c00eb88..7142de73 100644 --- a/pkg/connector/matrix.go +++ b/pkg/connector/matrix.go @@ -123,6 +123,52 @@ func (t *TelegramClient) transferMediaToTelegram(ctx context.Context, content *e }, nil } +func (t *TelegramClient) humanizeSendError(err error) bridgev2.MessageStatus { + status := bridgev2.WrapErrorInStatus(err). + WithErrorReason(event.MessageStatusNetworkError) + switch { + case tg.IsYouBlockedUser(err): + status = status.WithMessage("You blocked this user"). + WithErrorReason(event.MessageStatusNoPermission) + case tg.IsUserIsBlocked(err), tg.IsUserBlocked(err): + status = status.WithMessage("You were blocked by this user"). + WithErrorReason(event.MessageStatusNoPermission) + case tg.IsUserBannedInChannel(err): + status = status.WithMessage("You're banned from sending messages in supergroups/channels"). + WithErrorReason(event.MessageStatusNoPermission) + case tg.IsInputUserDeactivated(err): + status = status.WithMessage("This user was deleted") + case tg.IsChatAdminRequired(err): + status = status.WithMessage("Only admins can do that"). + WithErrorReason(event.MessageStatusNoPermission) + case tg.IsChatRestricted(err), tg.IsChatWriteForbidden(err): + status = status.WithMessage("You can't send messages in this chat"). + WithErrorReason(event.MessageStatusNoPermission) + case tg.IsSlowmodeWait(err): + // TODO tell user how long to wait (need to extract it from the error somehow) + status = status.WithMessage("Slow mode enabled, wait before sending") + case tg.IsMessageEmpty(err): + status = status.WithMessage("Message is empty"). + WithErrorReason(event.MessageStatusUnsupported) + case tg.IsMessageTooLong(err): + status = status.WithMessage("Message is too long"). + WithErrorReason(event.MessageStatusUnsupported) + case tg.IsEntitiesTooLong(err): + status = status.WithMessage("Message has too many formatting entities"). + WithErrorReason(event.MessageStatusUnsupported) + case tg.IsEntityBoundsInvalid(err): + status = status.WithMessage("Message formatting entities are malformed"). + WithErrorReason(event.MessageStatusUnsupported) + case tg.IsEntityMentionUserInvalid(err): + status = status.WithMessage("You mentioned an invalid user"). + WithErrorReason(event.MessageStatusUnsupported) + default: + return status + } + return status.WithIsCertain(true). + WithStatus(event.MessageStatusFail) +} + func (t *TelegramClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.MatrixMessage) (resp *bridgev2.MatrixMessageResponse, err error) { peer, err := t.inputPeerForPortalID(ctx, msg.Portal.ID) if err != nil { @@ -211,7 +257,7 @@ func (t *TelegramClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2. } } if err != nil { - return nil, err + return nil, t.humanizeSendError(err) } hasher := sha256.New()