Procházet zdrojové kódy

Handle WhatsApp invites. Fixes #120

Tulir Asokan před 5 roky
rodič
revize
8cfb04a5ed
3 změnil soubory, kde provedl 24 přidání a 2 odebrání
  1. 20 1
      portal.go
  2. 2 0
      user.go
  3. 2 1
      whatsapp-ext/chat.go

+ 20 - 1
portal.go

@@ -549,7 +549,7 @@ func (portal *Portal) Sync(user *User, contact whatsapp.Contact) {
 func (portal *Portal) GetBasePowerLevels() *event.PowerLevelsEventContent {
 	anyone := 0
 	nope := 99
-	invite := 99
+	invite := 50
 	if portal.bridge.Config.Bridge.AllowUserInvite {
 		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 {
 	download func() ([]byte, error)
 	info     whatsapp.MessageInfo

+ 2 - 0
user.go

@@ -889,6 +889,8 @@ func (user *User) HandleChatUpdate(cmd whatsappExt.ChatUpdate) {
 		go portal.RestrictMetadataChanges(cmd.Data.Restrict)
 	case whatsappExt.ChatActionRemove:
 		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:
 		if cmd.Data.SenderJID != "unknown" {
 			go portal.Sync(user, whatsapp.Contact{Jid: portal.Key.JID})

+ 2 - 1
whatsapp-ext/chat.go

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