|
9 | 9 | "go.mau.fi/util/ptr" |
10 | 10 | "go.mau.fi/whatsmeow" |
11 | 11 | "go.mau.fi/whatsmeow/types" |
| 12 | + "go.mau.fi/whatsmeow/types/events" |
12 | 13 | "maunium.net/go/mautrix/bridgev2" |
13 | 14 | "maunium.net/go/mautrix/bridgev2/database" |
14 | 15 | "maunium.net/go/mautrix/bridgev2/networkid" |
@@ -234,6 +235,92 @@ func (wa *WhatsAppClient) wrapGroupInfo(info *types.GroupInfo) *bridgev2.ChatInf |
234 | 235 | return wrapped |
235 | 236 | } |
236 | 237 |
|
| 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 | + |
237 | 324 | func (wa *WhatsAppClient) makePortalAvatarFetcher(avatarID string, sender types.JID, ts time.Time) func(context.Context, *bridgev2.Portal) bool { |
238 | 325 | return func(ctx context.Context, portal *bridgev2.Portal) bool { |
239 | 326 | jid, _ := waid.ParsePortalID(portal.ID) |
|
0 commit comments