From 635745132e8109f3a20beb5ec4323469d1d4fa31 Mon Sep 17 00:00:00 2001 From: Malte E Date: Mon, 19 Aug 2024 20:45:08 +0200 Subject: [PATCH 1/3] Add support for join rule handling --- bridgev2/errors.go | 1 + bridgev2/networkinterface.go | 11 ++++++++++ bridgev2/portal.go | 41 ++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/bridgev2/errors.go b/bridgev2/errors.go index 2834b298..1b168e8e 100644 --- a/bridgev2/errors.go +++ b/bridgev2/errors.go @@ -58,6 +58,7 @@ var ( ErrMediaConvertFailed error = WrapErrorInStatus(errors.New("failed to convert media")).WithMessage("failed to convert media").WithIsCertain(true).WithSendNotice(true) ErrMembershipNotSupported error = WrapErrorInStatus(errors.New("this bridge does not support changing group membership")).WithIsCertain(true).WithErrorAsMessage().WithSendNotice(false) ErrPowerLevelsNotSupported error = WrapErrorInStatus(errors.New("this bridge does not support changing group power levels")).WithIsCertain(true).WithErrorAsMessage().WithSendNotice(false) + ErrJoinRuleNotSupported error = WrapErrorInStatus(errors.New("this bridge does not support changing group join rule")).WithIsCertain(true).WithErrorAsMessage().WithSendNotice(false) ) // RespError is a class of error that certain network interface methods can return to ensure that the error diff --git a/bridgev2/networkinterface.go b/bridgev2/networkinterface.go index b68ad0c9..839de166 100644 --- a/bridgev2/networkinterface.go +++ b/bridgev2/networkinterface.go @@ -688,6 +688,17 @@ type PowerLevelHandlingNetworkAPI interface { HandleMatrixPowerLevels(ctx context.Context, msg *MatrixPowerLevelChange) (bool, error) } +type MatrixJoinRulesChange struct { + MatrixRoomMeta[*event.JoinRulesEventContent] + OrigJoinRule event.JoinRule + NewJoinRule event.JoinRule +} + +type JoinRuleHandlingNetworkAPI interface { + NetworkAPI + HandleMatrixJoinRules(ctx context.Context, msg *MatrixJoinRulesChange) (bool, error) +} + type PushType int func (pt PushType) String() string { diff --git a/bridgev2/portal.go b/bridgev2/portal.go index fc047beb..874d59bd 100644 --- a/bridgev2/portal.go +++ b/bridgev2/portal.go @@ -496,6 +496,8 @@ func (portal *Portal) handleMatrixEvent(sender *User, evt *event.Event) { portal.handleMatrixMembership(ctx, login, origSender, evt) case event.StatePowerLevels: portal.handleMatrixPowerLevels(ctx, login, origSender, evt) + case event.StateJoinRules: + portal.HandleMatrixJoinRules(ctx, login, origSender, evt) } } @@ -1333,6 +1335,45 @@ func (portal *Portal) handleMatrixPowerLevels( } } +func (portal *Portal) HandleMatrixJoinRules(ctx context.Context, sender *UserLogin, origSender *OrigSender, evt *event.Event) { + log := zerolog.Ctx(ctx) + content, ok := evt.Content.Parsed.(*event.JoinRulesEventContent) + if !ok { + log.Error().Type("content_type", evt.Content.Parsed).Msg("Unexpected parsed content type") + portal.sendErrorStatus(ctx, evt, fmt.Errorf("%w: %T", ErrUnexpectedParsedContentType, evt.Content.Parsed)) + return + } + api, ok := sender.Client.(JoinRuleHandlingNetworkAPI) + if !ok { + portal.sendErrorStatus(ctx, evt, ErrJoinRuleNotSupported) + return + } + prevContent := &event.JoinRulesEventContent{} + if evt.Unsigned.PrevContent != nil { + _ = evt.Unsigned.PrevContent.ParseRaw(evt.Type) + prevContent, _ = evt.Unsigned.PrevContent.Parsed.(*event.JoinRulesEventContent) + } + joinRuleChange := &MatrixJoinRulesChange{ + MatrixRoomMeta: MatrixRoomMeta[*event.JoinRulesEventContent]{ + MatrixEventBase: MatrixEventBase[*event.JoinRulesEventContent]{ + Event: evt, + Content: content, + Portal: portal, + OrigSender: origSender, + }, + PrevContent: prevContent, + }, + OrigJoinRule: content.JoinRule, + NewJoinRule: prevContent.JoinRule, + } + _, err := api.HandleMatrixJoinRules(ctx, joinRuleChange) + if err != nil { + log.Err(err).Msg("Failed to handle Matrix join rule change") + portal.sendErrorStatus(ctx, evt, err) + return + } +} + func (portal *Portal) handleMatrixRedaction(ctx context.Context, sender *UserLogin, origSender *OrigSender, evt *event.Event) { log := zerolog.Ctx(ctx) content, ok := evt.Content.Parsed.(*event.RedactionEventContent) From 4adde2ee337afe67d198fe55643ed874f4da563b Mon Sep 17 00:00:00 2001 From: Malte E Date: Tue, 20 Aug 2024 20:57:29 +0200 Subject: [PATCH 2/3] remove redundant type --- bridgev2/networkinterface.go | 10 +++------- bridgev2/portal.go | 24 ++++++++++-------------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/bridgev2/networkinterface.go b/bridgev2/networkinterface.go index 839de166..be65de27 100644 --- a/bridgev2/networkinterface.go +++ b/bridgev2/networkinterface.go @@ -688,15 +688,11 @@ type PowerLevelHandlingNetworkAPI interface { HandleMatrixPowerLevels(ctx context.Context, msg *MatrixPowerLevelChange) (bool, error) } -type MatrixJoinRulesChange struct { - MatrixRoomMeta[*event.JoinRulesEventContent] - OrigJoinRule event.JoinRule - NewJoinRule event.JoinRule -} +type MatrixJoinRule MatrixRoomMeta[*event.JoinRulesEventContent] -type JoinRuleHandlingNetworkAPI interface { +type JoinRulesHandlingNetworkAPI interface { NetworkAPI - HandleMatrixJoinRules(ctx context.Context, msg *MatrixJoinRulesChange) (bool, error) + HandleMatrixJoinRules(ctx context.Context, msg *MatrixJoinRule) (bool, error) } type PushType int diff --git a/bridgev2/portal.go b/bridgev2/portal.go index 874d59bd..75db6330 100644 --- a/bridgev2/portal.go +++ b/bridgev2/portal.go @@ -497,7 +497,7 @@ func (portal *Portal) handleMatrixEvent(sender *User, evt *event.Event) { case event.StatePowerLevels: portal.handleMatrixPowerLevels(ctx, login, origSender, evt) case event.StateJoinRules: - portal.HandleMatrixJoinRules(ctx, login, origSender, evt) + portal.handleMatrixJoinRules(ctx, login, origSender, evt) } } @@ -1335,7 +1335,7 @@ func (portal *Portal) handleMatrixPowerLevels( } } -func (portal *Portal) HandleMatrixJoinRules(ctx context.Context, sender *UserLogin, origSender *OrigSender, evt *event.Event) { +func (portal *Portal) handleMatrixJoinRules(ctx context.Context, sender *UserLogin, origSender *OrigSender, evt *event.Event) { log := zerolog.Ctx(ctx) content, ok := evt.Content.Parsed.(*event.JoinRulesEventContent) if !ok { @@ -1343,7 +1343,7 @@ func (portal *Portal) HandleMatrixJoinRules(ctx context.Context, sender *UserLog portal.sendErrorStatus(ctx, evt, fmt.Errorf("%w: %T", ErrUnexpectedParsedContentType, evt.Content.Parsed)) return } - api, ok := sender.Client.(JoinRuleHandlingNetworkAPI) + api, ok := sender.Client.(JoinRulesHandlingNetworkAPI) if !ok { portal.sendErrorStatus(ctx, evt, ErrJoinRuleNotSupported) return @@ -1353,18 +1353,14 @@ func (portal *Portal) HandleMatrixJoinRules(ctx context.Context, sender *UserLog _ = evt.Unsigned.PrevContent.ParseRaw(evt.Type) prevContent, _ = evt.Unsigned.PrevContent.Parsed.(*event.JoinRulesEventContent) } - joinRuleChange := &MatrixJoinRulesChange{ - MatrixRoomMeta: MatrixRoomMeta[*event.JoinRulesEventContent]{ - MatrixEventBase: MatrixEventBase[*event.JoinRulesEventContent]{ - Event: evt, - Content: content, - Portal: portal, - OrigSender: origSender, - }, - PrevContent: prevContent, + joinRuleChange := &MatrixJoinRule{ + MatrixEventBase: MatrixEventBase[*event.JoinRulesEventContent]{ + Event: evt, + Content: content, + Portal: portal, + OrigSender: origSender, }, - OrigJoinRule: content.JoinRule, - NewJoinRule: prevContent.JoinRule, + PrevContent: prevContent, } _, err := api.HandleMatrixJoinRules(ctx, joinRuleChange) if err != nil { From 5fa9ef2ab1bf8404453affa2666b2c8bc9f9982a Mon Sep 17 00:00:00 2001 From: Malte E Date: Tue, 20 Aug 2024 22:10:51 +0200 Subject: [PATCH 3/3] add event handler to matrix connector --- bridgev2/matrix/connector.go | 1 + bridgev2/portal.go | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/bridgev2/matrix/connector.go b/bridgev2/matrix/connector.go index dee28b8d..80dd06cf 100644 --- a/bridgev2/matrix/connector.go +++ b/bridgev2/matrix/connector.go @@ -142,6 +142,7 @@ func (br *Connector) Init(bridge *bridgev2.Bridge) { br.EventProcessor.On(event.StateTopic, br.handleRoomEvent) br.EventProcessor.On(event.EphemeralEventReceipt, br.handleEphemeralEvent) br.EventProcessor.On(event.EphemeralEventTyping, br.handleEphemeralEvent) + br.EventProcessor.On(event.StateJoinRules, br.handleRoomEvent) br.Bot = br.AS.BotIntent() br.Crypto = NewCryptoHelper(br) br.Bridge.Commands.(*commands.Processor).AddHandlers( diff --git a/bridgev2/portal.go b/bridgev2/portal.go index 75db6330..887598d8 100644 --- a/bridgev2/portal.go +++ b/bridgev2/portal.go @@ -1335,7 +1335,12 @@ func (portal *Portal) handleMatrixPowerLevels( } } -func (portal *Portal) handleMatrixJoinRules(ctx context.Context, sender *UserLogin, origSender *OrigSender, evt *event.Event) { +func (portal *Portal) handleMatrixJoinRules( + ctx context.Context, + sender *UserLogin, + origSender *OrigSender, + evt *event.Event, +) { log := zerolog.Ctx(ctx) content, ok := evt.Content.Parsed.(*event.JoinRulesEventContent) if !ok {