bridgev2/portal: auto-accept message requests on message

This commit is contained in:
Tulir Asokan 2026-01-16 18:33:13 +02:00
commit 9a138b354b
2 changed files with 46 additions and 0 deletions

View file

@ -1223,6 +1223,12 @@ func (portal *Portal) handleMatrixMessage(ctx context.Context, sender *UserLogin
}
}
err = portal.autoAcceptMessageRequest(ctx, evt, sender, origSender, caps)
if err != nil {
log.Warn().Err(err).Msg("Failed to auto-accept message request on message")
// TODO stop processing?
}
var resp *MatrixMessageResponse
if msgContent != nil {
resp, err = sender.Client.HandleMatrixMessage(ctx, wrappedMsgEvt)
@ -1502,6 +1508,12 @@ func (portal *Portal) handleMatrixReaction(ctx context.Context, sender *UserLogi
log.Warn().Msg("Reaction target message not found in database")
return EventHandlingResultFailed.WithMSSError(fmt.Errorf("reaction %w", ErrTargetMessageNotFound))
}
caps := sender.Client.GetCapabilities(ctx, portal)
err = portal.autoAcceptMessageRequest(ctx, evt, sender, nil, caps)
if err != nil {
log.Warn().Err(err).Msg("Failed to auto-accept message request on reaction")
// TODO stop processing?
}
log.UpdateContext(func(c zerolog.Context) zerolog.Context {
return c.Str("reaction_target_remote_id", string(reactionTarget.ID))
})
@ -1801,6 +1813,38 @@ func (portal *Portal) handleMatrixAcceptMessageRequest(
return EventHandlingResultSuccess.WithMSS()
}
func (portal *Portal) autoAcceptMessageRequest(
ctx context.Context, evt *event.Event, sender *UserLogin, origSender *OrigSender, caps *event.RoomFeatures,
) error {
if !portal.MessageRequest || caps.MessageRequest == nil || caps.MessageRequest.AcceptWithMessage == event.CapLevelFullySupported {
return nil
}
mran, ok := sender.Client.(MessageRequestAcceptingNetworkAPI)
if !ok {
return nil
}
err := mran.HandleMatrixAcceptMessageRequest(ctx, &MatrixAcceptMessageRequest{
Event: evt,
Content: &event.BeeperAcceptMessageRequestEventContent{
IsImplicit: true,
},
Portal: portal,
OrigSender: origSender,
})
if err != nil {
return err
}
if portal.MessageRequest {
portal.MessageRequest = false
portal.UpdateBridgeInfo(ctx)
err = portal.Save(ctx)
if err != nil {
zerolog.Ctx(ctx).Err(err).Msg("Failed to save portal after accepting message request")
}
}
return nil
}
func (portal *Portal) handleMatrixDeleteChat(
ctx context.Context,
sender *UserLogin,

View file

@ -94,6 +94,8 @@ type BeeperChatDeleteEventContent struct {
}
type BeeperAcceptMessageRequestEventContent struct {
// Whether this was triggered by a message rather than an explicit event
IsImplicit bool `json:"-"`
}
type BeeperSendStateEventContent struct {