Skip to content

Commit d7ec1cc

Browse files
committed
handlewhatsapp: add support for group info changes
1 parent 38393fc commit d7ec1cc

File tree

2 files changed

+110
-1
lines changed

2 files changed

+110
-1
lines changed

pkg/connector/chatinfo.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"go.mau.fi/util/ptr"
1010
"go.mau.fi/whatsmeow"
1111
"go.mau.fi/whatsmeow/types"
12+
"go.mau.fi/whatsmeow/types/events"
1213
"maunium.net/go/mautrix/bridgev2"
1314
"maunium.net/go/mautrix/bridgev2/database"
1415
"maunium.net/go/mautrix/bridgev2/networkid"
@@ -234,6 +235,92 @@ func (wa *WhatsAppClient) wrapGroupInfo(info *types.GroupInfo) *bridgev2.ChatInf
234235
return wrapped
235236
}
236237

238+
func (wa *WhatsAppClient) wrapGroupInfoChange(evt *events.GroupInfo) *bridgev2.ChatInfoChange {
239+
var changes *bridgev2.ChatInfo
240+
if evt.Name != nil || evt.Topic != nil || evt.Ephemeral != nil || evt.Unlink != nil || evt.Link != nil {
241+
changes = &bridgev2.ChatInfo{}
242+
if evt.Name != nil {
243+
changes.Name = &evt.Name.Name
244+
}
245+
if evt.Topic != nil {
246+
changes.Topic = &evt.Topic.Topic
247+
}
248+
if evt.Ephemeral != nil {
249+
changes.Disappear = &database.DisappearingSetting{
250+
Type: database.DisappearingTypeAfterRead,
251+
Timer: time.Duration(evt.Ephemeral.DisappearingTimer) * time.Second,
252+
}
253+
if !evt.Ephemeral.IsEphemeral {
254+
changes.Disappear = &database.DisappearingSetting{}
255+
}
256+
}
257+
if evt.Unlink != nil {
258+
// TODO ensure this doesn't race with link to a new group?
259+
changes.ParentID = ptr.Ptr(networkid.PortalID(""))
260+
}
261+
if evt.Link != nil && evt.Link.Type == types.GroupLinkChangeTypeParent {
262+
changes.ParentID = ptr.Ptr(waid.MakePortalID(evt.Link.Group.JID))
263+
}
264+
}
265+
var memberChanges *bridgev2.ChatMemberList
266+
if evt.Join != nil || evt.Leave != nil || evt.Promote != nil || evt.Demote != nil {
267+
memberChanges = &bridgev2.ChatMemberList{
268+
MemberMap: make(map[networkid.UserID]bridgev2.ChatMember),
269+
}
270+
for _, userID := range evt.Join {
271+
memberChanges.MemberMap[waid.MakeUserID(userID)] = bridgev2.ChatMember{
272+
EventSender: wa.makeEventSender(userID),
273+
}
274+
}
275+
for _, userID := range evt.Promote {
276+
memberChanges.MemberMap[waid.MakeUserID(userID)] = bridgev2.ChatMember{
277+
EventSender: wa.makeEventSender(userID),
278+
PowerLevel: ptr.Ptr(adminPL),
279+
}
280+
}
281+
for _, userID := range evt.Demote {
282+
memberChanges.MemberMap[waid.MakeUserID(userID)] = bridgev2.ChatMember{
283+
EventSender: wa.makeEventSender(userID),
284+
PowerLevel: ptr.Ptr(defaultPL),
285+
}
286+
}
287+
for _, userID := range evt.Leave {
288+
memberChanges.MemberMap[waid.MakeUserID(userID)] = bridgev2.ChatMember{
289+
EventSender: wa.makeEventSender(userID),
290+
Membership: event.MembershipLeave,
291+
}
292+
}
293+
}
294+
if evt.Announce != nil || evt.Locked != nil {
295+
if memberChanges == nil {
296+
memberChanges = &bridgev2.ChatMemberList{}
297+
}
298+
memberChanges.PowerLevels = &bridgev2.PowerLevelOverrides{}
299+
if evt.Announce != nil {
300+
if evt.Announce.IsAnnounce {
301+
memberChanges.PowerLevels.EventsDefault = ptr.Ptr(adminPL)
302+
} else {
303+
memberChanges.PowerLevels.EventsDefault = ptr.Ptr(defaultPL)
304+
}
305+
}
306+
if evt.Locked != nil {
307+
metaChangePL := defaultPL
308+
if evt.Locked.IsLocked {
309+
metaChangePL = adminPL
310+
}
311+
memberChanges.PowerLevels.Events = map[event.Type]int{
312+
event.StateRoomName: metaChangePL,
313+
event.StateRoomAvatar: metaChangePL,
314+
event.StateTopic: metaChangePL,
315+
}
316+
}
317+
}
318+
return &bridgev2.ChatInfoChange{
319+
ChatInfo: changes,
320+
MemberChanges: memberChanges,
321+
}
322+
}
323+
237324
func (wa *WhatsAppClient) makePortalAvatarFetcher(avatarID string, sender types.JID, ts time.Time) func(context.Context, *bridgev2.Portal) bool {
238325
return func(ctx context.Context, portal *bridgev2.Portal) bool {
239326
jid, _ := waid.ParsePortalID(portal.ID)

pkg/connector/handlewhatsapp.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (wa *WhatsAppClient) handleWAEvent(rawEvt any) {
9696
// TODO
9797

9898
case *events.GroupInfo:
99-
// TODO
99+
wa.handleWAGroupInfoChange(evt)
100100
case *events.JoinedGroup:
101101
// TODO
102102
case *events.NewsletterJoin:
@@ -490,3 +490,25 @@ func (wa *WhatsAppClient) handleWAPictureUpdate(evt *events.Picture) {
490490
})
491491
}
492492
}
493+
494+
func (wa *WhatsAppClient) handleWAGroupInfoChange(evt *events.GroupInfo) {
495+
eventMeta := simplevent.EventMeta{
496+
Type: bridgev2.RemoteEventChatInfoChange,
497+
LogContext: nil,
498+
PortalKey: wa.makeWAPortalKey(evt.JID),
499+
CreatePortal: true,
500+
Timestamp: evt.Timestamp,
501+
}
502+
if evt.Sender != nil {
503+
eventMeta.Sender = wa.makeEventSender(*evt.Sender)
504+
}
505+
if evt.Delete != nil {
506+
eventMeta.Type = bridgev2.RemoteEventChatDelete
507+
wa.UserLogin.QueueRemoteEvent(&simplevent.ChatDelete{EventMeta: eventMeta})
508+
} else {
509+
wa.UserLogin.QueueRemoteEvent(&simplevent.ChatInfoChange{
510+
EventMeta: eventMeta,
511+
ChatInfoChange: wa.wrapGroupInfoChange(evt),
512+
})
513+
}
514+
}

0 commit comments

Comments
 (0)