Watch
1
0
Fork
You've already forked mautrix-whatsapp
0
mirror of https://github.com/mautrix/whatsapp.git synced 2026-11-12 00:59:17 -05:00

Compare commits

...
Author SHA1 Message Date
Gerardo Rodriguez
b744b1f7e3 chatinfo: share always-allowed group power level overrides 2026-11-10 19:07:47 +00:00
Gerardo Rodriguez
63b2466b24 chatinfo: keep reactions and poll votes allowed when a group becomes announcement-only 2026-11-10 06:48:48 +00:00

View file

@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"maps"
"time"
"github.com/rs/zerolog"
@ -244,6 +245,13 @@ const (
defaultPL = 0
)
var alwaysAllowedGroupEvents = map[event.Type]int{
event.EventEncrypted: defaultPL, // Need to always allow encrypted events for poll responses
event.EventReaction: defaultPL,
event.EventRedaction: defaultPL,
event.EventUnstablePollResponse: defaultPL,
}
func setDefaultSubGroupFlag(isCommunityAnnouncementGroup bool) bridgev2.ExtraUpdater[*bridgev2.Portal] {
return func(_ context.Context, portal *bridgev2.Portal) bool {
meta := portal.Metadata.(*waid.PortalMetadata)
@ -311,10 +319,6 @@ func (wa *WhatsAppClient) wrapGroupInfo(ctx context.Context, info *types.GroupIn
event.StateRoomName: metaChangePL,
event.StateRoomAvatar: metaChangePL,
event.StateTopic: metaChangePL,
event.EventEncrypted: defaultPL, // Need to always allow encrypted events for poll responses
event.EventReaction: defaultPL,
event.EventRedaction: defaultPL,
event.EventUnstablePollResponse: defaultPL,
event.StateBeeperDisappearingTimer: metaChangePL,
},
},
@ -326,6 +330,7 @@ func (wa *WhatsAppClient) wrapGroupInfo(ctx context.Context, info *types.GroupIn
},
ExtraUpdates: extraUpdater,
}
maps.Copy(wrapped.Members.PowerLevels.Events, alwaysAllowedGroupEvents)
var hasSelf bool
for _, pcp := range info.Participants {
member := bridgev2.ChatMember{
@ -436,24 +441,25 @@ func (wa *WhatsAppClient) wrapGroupInfoChange(ctx context.Context, evt *events.G
if memberChanges == nil {
memberChanges = &bridgev2.ChatMemberList{}
}
memberChanges.PowerLevels = &bridgev2.PowerLevelOverrides{}
memberChanges.PowerLevels = &bridgev2.PowerLevelOverrides{
Events: make(map[event.Type]int),
}
if evt.Announce != nil {
if evt.Announce.IsAnnounce {
memberChanges.PowerLevels.EventsDefault = ptr.Ptr(adminPL)
} else {
memberChanges.PowerLevels.EventsDefault = ptr.Ptr(defaultPL)
}
maps.Copy(memberChanges.PowerLevels.Events, alwaysAllowedGroupEvents)
}
if evt.Locked != nil {
metaChangePL := defaultPL
if evt.Locked.IsLocked {
metaChangePL = adminPL
}
memberChanges.PowerLevels.Events = map[event.Type]int{
event.StateRoomName: metaChangePL,
event.StateRoomAvatar: metaChangePL,
event.StateTopic: metaChangePL,
}
memberChanges.PowerLevels.Events[event.StateRoomName] = metaChangePL
memberChanges.PowerLevels.Events[event.StateRoomAvatar] = metaChangePL
memberChanges.PowerLevels.Events[event.StateTopic] = metaChangePL
}
}
return &bridgev2.ChatInfoChange{