diff --git a/commands.go b/commands.go index ad74dc7..7921082 100644 --- a/commands.go +++ b/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) { diff --git a/portal.go b/portal.go index 05df63c..191a544 100644 --- a/portal.go +++ b/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()}) } } diff --git a/user.go b/user.go index ed2940d..e3f988c 100644 --- a/user.go +++ b/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)