Handle WhatsApp invites. Fixes #120

This commit is contained in:
Tulir Asokan 2020-06-26 00:05:51 +03:00
parent 326293303d
commit 8cfb04a5ed
3 changed files with 24 additions and 2 deletions

View file

@ -549,7 +549,7 @@ func (portal *Portal) Sync(user *User, contact whatsapp.Contact) {
func (portal *Portal) GetBasePowerLevels() *event.PowerLevelsEventContent { func (portal *Portal) GetBasePowerLevels() *event.PowerLevelsEventContent {
anyone := 0 anyone := 0
nope := 99 nope := 99
invite := 99 invite := 50
if portal.bridge.Config.Bridge.AllowUserInvite { if portal.bridge.Config.Bridge.AllowUserInvite {
invite = 0 invite = 0
} }
@ -1328,6 +1328,25 @@ func (portal *Portal) HandleWhatsAppKick(senderJID string, jids []string) {
} }
} }
func (portal *Portal) HandleWhatsAppInvite(senderJID string, jids []string) {
senderIntent := portal.MainIntent()
if senderJID != "unknown" {
sender := portal.bridge.GetPuppetByJID(senderJID)
senderIntent = sender.IntentFor(portal)
}
for _, jid := range jids {
puppet := portal.bridge.GetPuppetByJID(jid)
_, err := senderIntent.InviteUser(portal.MXID, &mautrix.ReqInviteUser{UserID: puppet.MXID})
if err != nil {
portal.log.Warnfln("Failed to invite %s as %s: %v", puppet.MXID, senderIntent.UserID, err)
}
err = puppet.DefaultIntent().EnsureJoined(portal.MXID)
if err != nil {
portal.log.Errorfln("Failed to ensure %s is joined: %v", puppet.MXID, err)
}
}
}
type base struct { type base struct {
download func() ([]byte, error) download func() ([]byte, error)
info whatsapp.MessageInfo info whatsapp.MessageInfo

View file

@ -889,6 +889,8 @@ func (user *User) HandleChatUpdate(cmd whatsappExt.ChatUpdate) {
go portal.RestrictMetadataChanges(cmd.Data.Restrict) go portal.RestrictMetadataChanges(cmd.Data.Restrict)
case whatsappExt.ChatActionRemove: case whatsappExt.ChatActionRemove:
go portal.HandleWhatsAppKick(cmd.Data.SenderJID, cmd.Data.UserChange.JIDs) go portal.HandleWhatsAppKick(cmd.Data.SenderJID, cmd.Data.UserChange.JIDs)
case whatsappExt.ChatActionAdd:
go portal.HandleWhatsAppInvite(cmd.Data.SenderJID, cmd.Data.UserChange.JIDs)
case whatsappExt.ChatActionIntroduce: case whatsappExt.ChatActionIntroduce:
if cmd.Data.SenderJID != "unknown" { if cmd.Data.SenderJID != "unknown" {
go portal.Sync(user, whatsapp.Contact{Jid: portal.Key.JID}) go portal.Sync(user, whatsapp.Contact{Jid: portal.Key.JID})

View file

@ -47,6 +47,7 @@ const (
ChatActionDemote ChatActionType = "demote" ChatActionDemote ChatActionType = "demote"
ChatActionIntroduce ChatActionType = "introduce" ChatActionIntroduce ChatActionType = "introduce"
ChatActionRemove ChatActionType = "remove" ChatActionRemove ChatActionType = "remove"
ChatActionAdd ChatActionType = "add"
) )
type ChatUpdateData struct { type ChatUpdateData struct {
@ -128,7 +129,7 @@ func (cud *ChatUpdateData) UnmarshalJSON(data []byte) error {
unmarshalTo = &cud.Restrict unmarshalTo = &cud.Restrict
case ChatActionAnnounce: case ChatActionAnnounce:
unmarshalTo = &cud.Announce unmarshalTo = &cud.Announce
case ChatActionPromote, ChatActionDemote, ChatActionRemove: case ChatActionPromote, ChatActionDemote, ChatActionRemove, ChatActionAdd:
unmarshalTo = &cud.UserChange unmarshalTo = &cud.UserChange
default: default:
return nil return nil