Procházet zdrojové kódy

Only invite default puppet for backfilling when needed

Tulir Asokan před 6 roky
rodič
revize
02f78155b5
3 změnil soubory, kde provedl 28 přidání a 7 odebrání
  1. 1 1
      commands.go
  2. 20 3
      portal.go
  3. 7 3
      user.go

+ 1 - 1
commands.go

@@ -228,7 +228,7 @@ func (handler *CommandHandler) CommandReconnect(ce *CommandEvent) {
 	ce.User.Connected = true
 	ce.User.ConnectionErrors = 0
 	ce.Reply("Reconnected successfully.")
-	go ce.User.PostLogin()
+	ce.User.PostLogin()
 }
 
 func (handler *CommandHandler) CommandDeleteConnection(ce *CommandEvent) {

+ 20 - 3
portal.go

@@ -142,6 +142,8 @@ type Portal struct {
 	backfilling   bool
 	lastMessageTs uint64
 
+	privateChatBackfillInvitePuppet func()
+
 	messages chan PortalMessage
 
 	isPrivate *bool
@@ -572,16 +574,24 @@ func (portal *Portal) BackfillHistory(user *User, lastMessageTime uint64) error
 func (portal *Portal) beginBackfill() func() {
 	portal.backfillLock.Lock()
 	portal.backfilling = true
+	var privateChatPuppetInvited bool
 	var privateChatPuppet *Puppet
 	if portal.IsPrivateChat() {
 		privateChatPuppet = portal.bridge.GetPuppetByJID(portal.Key.Receiver)
-		_, _ = portal.MainIntent().InviteUser(portal.MXID, &mautrix.ReqInviteUser{UserID: privateChatPuppet.MXID})
-		_ = privateChatPuppet.DefaultIntent().EnsureJoined(portal.MXID)
+		portal.privateChatBackfillInvitePuppet = func() {
+			if privateChatPuppetInvited {
+				return
+			}
+			privateChatPuppetInvited = true
+			_, _ = portal.MainIntent().InviteUser(portal.MXID, &mautrix.ReqInviteUser{UserID: privateChatPuppet.MXID})
+			_ = privateChatPuppet.DefaultIntent().EnsureJoined(portal.MXID)
+		}
 	}
 	return func() {
 		portal.backfilling = false
+		portal.privateChatBackfillInvitePuppet = nil
 		portal.backfillLock.Unlock()
-		if privateChatPuppet != nil {
+		if privateChatPuppet != nil && privateChatPuppetInvited {
 			_, _ = privateChatPuppet.DefaultIntent().LeaveRoom(portal.MXID)
 		}
 	}
@@ -593,6 +603,9 @@ func (portal *Portal) FillInitialHistory(user *User) error {
 	}
 	endBackfill := portal.beginBackfill()
 	defer endBackfill()
+	if portal.privateChatBackfillInvitePuppet != nil {
+		portal.privateChatBackfillInvitePuppet()
+	}
 
 	n := portal.bridge.Config.Bridge.InitialHistoryFill
 	portal.log.Infoln("Filling initial history, maximum", n, "messages")
@@ -632,6 +645,7 @@ func (portal *Portal) FillInitialHistory(user *User) error {
 		}
 	}
 	portal.handleHistory(user, messages)
+	portal.log.Infoln("Initial history fill complete")
 	return nil
 }
 
@@ -644,6 +658,9 @@ func (portal *Portal) handleHistory(user *User, messages []interface{}) {
 			continue
 		}
 		data := whatsapp.ParseProtoMessage(message)
+		if portal.privateChatBackfillInvitePuppet != nil && message.GetKey().GetFromMe() && portal.IsPrivateChat() {
+			portal.privateChatBackfillInvitePuppet()
+		}
 		portal.handleMessage(PortalMessage{portal.Key.JID, user, data, message.GetMessageTimestamp()})
 	}
 }

+ 7 - 3
user.go

@@ -210,7 +210,7 @@ func (user *User) RestoreSession() bool {
 		user.ConnectionErrors = 0
 		user.SetSession(&sess)
 		user.log.Debugln("Session restored successfully")
-		go user.PostLogin()
+		user.PostLogin()
 	}
 	return true
 }
@@ -267,7 +267,7 @@ func (user *User) Login(ce *CommandEvent) {
 	user.JID = strings.Replace(user.Conn.Info.Wid, whatsappExt.OldUserSuffix, whatsappExt.NewUserSuffix, 1)
 	user.SetSession(&session)
 	ce.Reply("Successfully logged in, synchronizing chats...")
-	go user.PostLogin()
+	user.PostLogin()
 }
 
 type Chat struct {
@@ -292,6 +292,10 @@ func (cl ChatList) Swap(i, j int) {
 
 func (user *User) PostLogin() {
 	user.syncLock.Lock()
+	go user.intPostLogin()
+}
+
+func (user *User) intPostLogin() {
 	user.log.Debugln("Waiting a second for contacts to arrive")
 	// Hacky way to wait for chats and contacts to arrive automatically
 	time.Sleep(1 * time.Second)
@@ -404,7 +408,7 @@ func (user *User) tryReconnect(msg string) {
 			user.ConnectionErrors = 0
 			user.Connected = true
 			_, _ = user.bridge.Bot.SendNotice(user.ManagementRoom, "Reconnected successfully")
-			go user.PostLogin()
+			user.PostLogin()
 			return
 		}
 		user.log.Errorln("Error while trying to reconnect after disconnection:", err)