optimize the process that logout with double puppeting enabled

This commit is contained in:
zhaoYangguang 2021-01-19 18:22:19 +08:00
parent 2e904aa753
commit 949fbc7ba8
2 changed files with 40 additions and 2 deletions

View File

@ -251,6 +251,7 @@ func (handler *CommandHandler) CommandLogout(ce *CommandEvent) {
if ce.User.Conn == nil {
return
}
_ = ce.User.Conn.GetConversations("", ce.User.bridge.Config.Bridge.InitialChatSync)
ce.User.Conn.LoggedIn = false
username := ""
password := ""
@ -269,7 +270,22 @@ func (handler *CommandHandler) CommandLogout(ce *CommandEvent) {
Username: username,
Password: password,
}
portals := ce.User.GetPortals()
newPortals := ce.User.GetPortalsNew()
allPortals := newPortals[0:]
for _, portal := range portals {
var newPortalsHas bool
for _, newPortal := range newPortals {
if portal.Key == newPortal.Key {
newPortalsHas = true
}
}
if !newPortalsHas {
allPortals = append(allPortals, portal)
}
}
leave := func(portal *Portal) {
if len(portal.MXID) > 0 {
_, _ = portal.MainIntent().KickUser(portal.MXID, &mautrix.ReqKickUser{
@ -278,7 +294,7 @@ func (handler *CommandHandler) CommandLogout(ce *CommandEvent) {
})
}
}
for _, portal := range portals {
for _, portal := range allPortals {
leave(portal)
}
ce.Reply("Logged out successfully.")

24
user.go
View File

@ -156,6 +156,28 @@ func (user *User) GetPortals() []*Portal {
return portals
}
func (user *User) GetPortalsNew() []*Portal {
keys := make([]database.PortalKey, len(user.Conn.Store.Chats))
i := 0
for jid, _ := range user.Conn.Store.Chats {
keys[i] = database.NewPortalKey(jid, user.JID)
i++
}
portals := make([]*Portal, len(keys))
user.bridge.portalsLock.Lock()
for i, key := range keys {
portal, ok := user.bridge.portalsByJID[key]
if !ok {
portal = user.bridge.loadDBPortal(user.bridge.DB.Portal.GetByJID(key), &key)
}
portals[i] = portal
}
user.bridge.portalsLock.Unlock()
return portals
}
func (bridge *Bridge) NewUser(dbUser *database.User) *User {
user := &User{
User: dbUser,
@ -394,9 +416,9 @@ func (user *User) Login(ce *CommandEvent, name string, password string) (err err
go user.Conn.Poll()
user.ConnectionErrors = 0
user.SetSession(user.Conn.LoginInfo)
user.JID = "8:" + user.Conn.UserProfile.Username + skypeExt.NewUserSuffix
user.addToJIDMap()
user.SetSession(user.Conn.LoginInfo)
_ = ce.User.Conn.GetConversations("", user.bridge.Config.Bridge.InitialChatSync)
user.PostLogin()
return