diff --git a/bridgev2/matrix/connector.go b/bridgev2/matrix/connector.go index b11248dc..fc0b6577 100644 --- a/bridgev2/matrix/connector.go +++ b/bridgev2/matrix/connector.go @@ -151,6 +151,7 @@ func (br *Connector) Init(bridge *bridgev2.Bridge) { br.EventProcessor.On(event.BeeperSendState, br.handleRoomEvent) br.EventProcessor.On(event.StateRoomAvatar, br.handleRoomEvent) br.EventProcessor.On(event.StateTopic, br.handleRoomEvent) + br.EventProcessor.On(event.StatePinnedEvents, br.handleRoomEvent) br.EventProcessor.On(event.StateTombstone, br.handleRoomEvent) br.EventProcessor.On(event.StateBeeperDisappearingTimer, br.handleRoomEvent) br.EventProcessor.On(event.BeeperDeleteChat, br.handleRoomEvent) diff --git a/bridgev2/networkinterface.go b/bridgev2/networkinterface.go index 3cede657..cc19b616 100644 --- a/bridgev2/networkinterface.go +++ b/bridgev2/networkinterface.go @@ -710,6 +710,15 @@ type DisappearTimerChangingNetworkAPI interface { HandleMatrixDisappearingTimer(ctx context.Context, msg *MatrixDisappearingTimer) (bool, error) } +// PinHandlingNetworkAPI is an optional interface that network connectors can implement to handle pinned events changes. +type PinHandlingNetworkAPI interface { + NetworkAPI + // HandleMatrixPinChange is called when the pinned events in a portal room are changed. + // The new pinned event IDs are in Content.Pinned, and the previous ones are in PrevContent.Pinned. + // The connector should diff them to determine which messages were pinned or unpinned. + HandleMatrixPinChange(ctx context.Context, msg *MatrixPinChange) (bool, error) +} + // DeleteChatHandlingNetworkAPI is an optional interface that network connectors // can implement to delete a chat from the remote network. type DeleteChatHandlingNetworkAPI interface { @@ -1412,6 +1421,7 @@ type MatrixRoomMeta[ContentType any] struct { type MatrixRoomName = MatrixRoomMeta[*event.RoomNameEventContent] type MatrixRoomAvatar = MatrixRoomMeta[*event.RoomAvatarEventContent] type MatrixRoomTopic = MatrixRoomMeta[*event.TopicEventContent] +type MatrixPinChange = MatrixRoomMeta[*event.PinnedEventsEventContent] type MatrixDisappearingTimer = MatrixRoomMeta[*event.BeeperDisappearingTimer] type MatrixReadReceipt struct { diff --git a/bridgev2/portal.go b/bridgev2/portal.go index 05b23005..abe00206 100644 --- a/bridgev2/portal.go +++ b/bridgev2/portal.go @@ -830,6 +830,8 @@ func (portal *Portal) handleMatrixEvent(ctx context.Context, sender *User, evt * return handleMatrixRoomMeta(portal, ctx, login, origSender, evt, isStateRequest, RoomTopicHandlingNetworkAPI.HandleMatrixRoomTopic) case event.StateRoomAvatar: return handleMatrixRoomMeta(portal, ctx, login, origSender, evt, isStateRequest, RoomAvatarHandlingNetworkAPI.HandleMatrixRoomAvatar) + case event.StatePinnedEvents: + return handleMatrixRoomMeta(portal, ctx, login, origSender, evt, isStateRequest, PinHandlingNetworkAPI.HandleMatrixPinChange) case event.StateBeeperDisappearingTimer: return handleMatrixRoomMeta(portal, ctx, login, origSender, evt, isStateRequest, DisappearTimerChangingNetworkAPI.HandleMatrixDisappearingTimer) case event.StateEncryption: