diff --git a/puppet.go b/puppet.go index 867b6dc..db49e0b 100644 --- a/puppet.go +++ b/puppet.go @@ -245,9 +245,12 @@ func reuploadAvatar(intent *appservice.IntentAPI, url string) (id.ContentURI, er return resp.ContentURI, nil } -func (puppet *Puppet) UpdateAvatar(source *User) bool { +func (puppet *Puppet) UpdateAvatar(source *User, forcePortalSync bool) bool { changed := source.updateAvatar(puppet.JID, &puppet.Avatar, &puppet.AvatarURL, &puppet.AvatarSet, puppet.log, puppet.DefaultIntent()) if !changed || puppet.Avatar == "unauthorized" { + if forcePortalSync { + go puppet.updatePortalAvatar() + } return changed } err := puppet.DefaultIntent().SetAvatarURL(puppet.AvatarURL) @@ -260,7 +263,7 @@ func (puppet *Puppet) UpdateAvatar(source *User) bool { return true } -func (puppet *Puppet) UpdateName(contact types.ContactInfo) bool { +func (puppet *Puppet) UpdateName(contact types.ContactInfo, forcePortalSync bool) bool { newName, quality := puppet.bridge.Config.Bridge.FormatDisplayname(puppet.JID, contact) if (puppet.Displayname != newName || !puppet.NameSet) && quality >= puppet.NameQuality { puppet.Displayname = newName @@ -275,6 +278,8 @@ func (puppet *Puppet) UpdateName(contact types.ContactInfo) bool { puppet.log.Warnln("Failed to set display name:", err) } return true + } else if forcePortalSync { + go puppet.updatePortalName() } return false } @@ -329,10 +334,10 @@ func (puppet *Puppet) SyncContact(source *User, onlyIfNoName, shouldHavePushName } else if !contact.Found { puppet.log.Warnfln("No contact info found through %s in SyncContact (sync reason: %s)", source.MXID, reason) } - puppet.Sync(source, &contact, false) + puppet.Sync(source, &contact, false, false) } -func (puppet *Puppet) Sync(source *User, contact *types.ContactInfo, forceAvatarSync bool) { +func (puppet *Puppet) Sync(source *User, contact *types.ContactInfo, forceAvatarSync, forcePortalSync bool) { puppet.syncLock.Lock() defer puppet.syncLock.Unlock() err := puppet.DefaultIntent().EnsureRegistered() @@ -347,10 +352,10 @@ func (puppet *Puppet) Sync(source *User, contact *types.ContactInfo, forceAvatar if puppet.JID.User == source.JID.User { contact.PushName = source.Client.Store.PushName } - update = puppet.UpdateName(*contact) || update + update = puppet.UpdateName(*contact, forcePortalSync) || update } if len(puppet.Avatar) == 0 || forceAvatarSync || puppet.bridge.Config.Bridge.UserAvatarSync { - update = puppet.UpdateAvatar(source) || update + update = puppet.UpdateAvatar(source, forcePortalSync) || update } if update || puppet.LastSync.Add(24*time.Hour).Before(time.Now()) { puppet.LastSync = time.Now() diff --git a/user.go b/user.go index 4c0b451..09278e9 100644 --- a/user.go +++ b/user.go @@ -339,7 +339,7 @@ func (user *User) doPuppetResync() { } else if contact.Found { contactPtr = &contact } - puppet.Sync(user, contactPtr, info.PictureID != "" && info.PictureID != puppet.Avatar) + puppet.Sync(user, contactPtr, info.PictureID != "" && info.PictureID != puppet.Avatar, true) } } @@ -1143,7 +1143,7 @@ func (user *User) ResyncContacts(forceAvatarSync bool) error { for jid, contact := range contacts { puppet := user.bridge.GetPuppetByJID(jid) if puppet != nil { - puppet.Sync(user, &contact, forceAvatarSync) + puppet.Sync(user, &contact, forceAvatarSync, true) } else { user.log.Warnfln("Got a nil puppet for %s while syncing contacts", jid) } @@ -1310,7 +1310,7 @@ func (user *User) handlePictureUpdate(evt *events.Picture) { puppet := user.bridge.GetPuppetByJID(evt.JID) user.log.Debugfln("Received picture update for puppet %s (current: %s, new: %s)", evt.JID, puppet.Avatar, evt.PictureID) if puppet.Avatar != evt.PictureID { - puppet.Sync(user, nil, true) + puppet.Sync(user, nil, true, false) } } else if portal := user.GetPortalByJID(evt.JID); portal != nil { user.log.Debugfln("Received picture update for portal %s (current: %s, new: %s)", evt.JID, portal.Avatar, evt.PictureID)