Browse Source

Use partial info from history sync if latest group info not found

Tulir Asokan 3 years ago
parent
commit
2d90295488
3 changed files with 42 additions and 30 deletions
  1. 2 2
      commands.go
  2. 24 26
      portal.go
  3. 16 2
      user.go

+ 2 - 2
commands.go

@@ -918,7 +918,7 @@ func (handler *CommandHandler) CommandOpen(ce *CommandEvent) {
 		portal.UpdateMatrixRoom(ce.User, info)
 		portal.UpdateMatrixRoom(ce.User, info)
 		ce.Reply("Portal room synced.")
 		ce.Reply("Portal room synced.")
 	} else {
 	} else {
-		err = portal.CreateMatrixRoom(ce.User, info)
+		err = portal.CreateMatrixRoom(ce.User, info, true)
 		if err != nil {
 		if err != nil {
 			ce.Reply("Failed to create room: %v", err)
 			ce.Reply("Failed to create room: %v", err)
 		} else {
 		} else {
@@ -966,7 +966,7 @@ func (handler *CommandHandler) CommandPM(ce *CommandEvent) {
 			return
 			return
 		}
 		}
 	}
 	}
-	err = portal.CreateMatrixRoom(user, nil)
+	err = portal.CreateMatrixRoom(user, nil, false)
 	if err != nil {
 	if err != nil {
 		ce.Reply("Failed to create portal room: %v", err)
 		ce.Reply("Failed to create portal room: %v", err)
 		return
 		return

+ 24 - 26
portal.go

@@ -209,7 +209,7 @@ func (portal *Portal) handleMessageLoop() {
 				continue
 				continue
 			}
 			}
 			portal.log.Debugln("Creating Matrix room from incoming message")
 			portal.log.Debugln("Creating Matrix room from incoming message")
-			err := portal.CreateMatrixRoom(msg.source, nil)
+			err := portal.CreateMatrixRoom(msg.source, nil, false)
 			if err != nil {
 			if err != nil {
 				portal.log.Errorln("Failed to create portal room:", err)
 				portal.log.Errorln("Failed to create portal room:", err)
 				continue
 				continue
@@ -699,7 +699,7 @@ func (portal *Portal) UpdateTopic(topic string, setBy types.JID, updateInfo bool
 	return false
 	return false
 }
 }
 
 
-func (portal *Portal) UpdateMetadata(user *User) bool {
+func (portal *Portal) UpdateMetadata(user *User, groupInfo *types.GroupInfo) bool {
 	if portal.IsPrivateChat() {
 	if portal.IsPrivateChat() {
 		return false
 		return false
 	} else if portal.IsStatusBroadcastList() {
 	} else if portal.IsStatusBroadcastList() {
@@ -722,19 +722,22 @@ func (portal *Portal) UpdateMetadata(user *User) bool {
 		//update = portal.UpdateTopic(BroadcastTopic, "", nil, false) || update
 		//update = portal.UpdateTopic(BroadcastTopic, "", nil, false) || update
 		return update
 		return update
 	}
 	}
-	metadata, err := user.Client.GetGroupInfo(portal.Key.JID)
-	if err != nil {
-		portal.log.Errorln("Failed to get group info:", err)
-		return false
+	if groupInfo == nil {
+		var err error
+		groupInfo, err = user.Client.GetGroupInfo(portal.Key.JID)
+		if err != nil {
+			portal.log.Errorln("Failed to get group info:", err)
+			return false
+		}
 	}
 	}
 
 
-	portal.SyncParticipants(user, metadata)
+	portal.SyncParticipants(user, groupInfo)
 	update := false
 	update := false
-	update = portal.UpdateName(metadata.Name, metadata.NameSetBy, false) || update
-	update = portal.UpdateTopic(metadata.Topic, metadata.TopicSetBy, false) || update
+	update = portal.UpdateName(groupInfo.Name, groupInfo.NameSetBy, false) || update
+	update = portal.UpdateTopic(groupInfo.Topic, groupInfo.TopicSetBy, false) || update
 
 
-	portal.RestrictMessageSending(metadata.IsAnnounce)
-	portal.RestrictMetadataChanges(metadata.IsLocked)
+	portal.RestrictMessageSending(groupInfo.IsAnnounce)
+	portal.RestrictMetadataChanges(groupInfo.IsLocked)
 
 
 	return update
 	return update
 }
 }
@@ -782,21 +785,15 @@ func (portal *Portal) ensureUserInvited(user *User) (ok bool) {
 }
 }
 
 
 func (portal *Portal) UpdateMatrixRoom(user *User, groupInfo *types.GroupInfo) bool {
 func (portal *Portal) UpdateMatrixRoom(user *User, groupInfo *types.GroupInfo) bool {
-	portal.log.Infoln("Syncing portal for", user.MXID)
-
 	if len(portal.MXID) == 0 {
 	if len(portal.MXID) == 0 {
-		err := portal.CreateMatrixRoom(user, groupInfo)
-		if err != nil {
-			portal.log.Errorln("Failed to create portal room:", err)
-			return false
-		}
-		return true
-	} else {
-		portal.ensureUserInvited(user)
+		return false
 	}
 	}
+	portal.log.Infoln("Syncing portal for", user.MXID)
+
+	portal.ensureUserInvited(user)
 
 
 	update := false
 	update := false
-	update = portal.UpdateMetadata(user) || update
+	update = portal.UpdateMetadata(user, groupInfo) || update
 	if !portal.IsPrivateChat() && !portal.IsBroadcastList() && portal.Avatar == "" {
 	if !portal.IsPrivateChat() && !portal.IsBroadcastList() && portal.Avatar == "" {
 		update = portal.UpdateAvatar(user, types.EmptyJID, false) || update
 		update = portal.UpdateAvatar(user, types.EmptyJID, false) || update
 	}
 	}
@@ -1248,7 +1245,7 @@ var BackfillDummyStateEvent = event.Type{Type: "fi.mau.dummy.blank_backfill_stat
 var BackfillEndDummyEvent = event.Type{Type: "fi.mau.dummy.backfill_end", Class: event.MessageEventType}
 var BackfillEndDummyEvent = event.Type{Type: "fi.mau.dummy.backfill_end", Class: event.MessageEventType}
 var PreBackfillDummyEvent = event.Type{Type: "fi.mau.dummy.pre_backfill", Class: event.MessageEventType}
 var PreBackfillDummyEvent = event.Type{Type: "fi.mau.dummy.pre_backfill", Class: event.MessageEventType}
 
 
-func (portal *Portal) CreateMatrixRoom(user *User, groupInfo *types.GroupInfo) error {
+func (portal *Portal) CreateMatrixRoom(user *User, groupInfo *types.GroupInfo, isFullInfo bool) error {
 	portal.roomCreateLock.Lock()
 	portal.roomCreateLock.Lock()
 	defer portal.roomCreateLock.Unlock()
 	defer portal.roomCreateLock.Unlock()
 	if len(portal.MXID) > 0 {
 	if len(portal.MXID) > 0 {
@@ -1299,11 +1296,12 @@ func (portal *Portal) CreateMatrixRoom(user *User, groupInfo *types.GroupInfo) e
 		portal.log.Debugln("Broadcast list is not yet supported, not creating room after all")
 		portal.log.Debugln("Broadcast list is not yet supported, not creating room after all")
 		return fmt.Errorf("broadcast list bridging is currently not supported")
 		return fmt.Errorf("broadcast list bridging is currently not supported")
 	} else {
 	} else {
-		if groupInfo == nil {
-			var err error
-			groupInfo, err = user.Client.GetGroupInfo(portal.Key.JID)
+		if groupInfo == nil || !isFullInfo {
+			foundInfo, err := user.Client.GetGroupInfo(portal.Key.JID)
 			if err != nil {
 			if err != nil {
 				portal.log.Warnfln("Failed to get group info through %s: %v", user.JID, err)
 				portal.log.Warnfln("Failed to get group info through %s: %v", user.JID, err)
+			} else {
+				groupInfo = foundInfo
 			}
 			}
 		}
 		}
 		if groupInfo != nil {
 		if groupInfo != nil {

+ 16 - 2
user.go

@@ -433,7 +433,21 @@ func (user *User) handleHistorySync(evt *waProto.HistorySync) {
 				continue
 				continue
 			}
 			}
 			user.log.Debugln("Creating portal for", portal.Key.JID, "as part of history sync handling")
 			user.log.Debugln("Creating portal for", portal.Key.JID, "as part of history sync handling")
-			err = portal.CreateMatrixRoom(user, nil)
+			participants := make([]types.GroupParticipant, len(conv.GetParticipant()))
+			for i, pcp := range conv.GetParticipant() {
+				participantJID, _ := types.ParseJID(pcp.GetUserJid())
+				participants[i] = types.GroupParticipant{
+					JID:          participantJID,
+					IsAdmin:      pcp.GetRank() == waProto.GroupParticipant_ADMIN,
+					IsSuperAdmin: pcp.GetRank() == waProto.GroupParticipant_SUPERADMIN,
+				}
+			}
+			partialInfo := types.GroupInfo{
+				JID:                  jid,
+				GroupName:            types.GroupName{Name: conv.GetName()},
+				Participants:         participants,
+			}
+			err = portal.CreateMatrixRoom(user, &partialInfo, false)
 			if err != nil {
 			if err != nil {
 				user.log.Warnfln("Failed to create room for %s during backfill: %v", portal.Key.JID, err)
 				user.log.Warnfln("Failed to create room for %s during backfill: %v", portal.Key.JID, err)
 				continue
 				continue
@@ -842,7 +856,7 @@ func (user *User) markSelfReadFull(portal *Portal) {
 func (user *User) handleGroupCreate(evt *events.JoinedGroup) {
 func (user *User) handleGroupCreate(evt *events.JoinedGroup) {
 	portal := user.GetPortalByJID(evt.JID)
 	portal := user.GetPortalByJID(evt.JID)
 	if len(portal.MXID) == 0 {
 	if len(portal.MXID) == 0 {
-		err := portal.CreateMatrixRoom(user, &evt.GroupInfo)
+		err := portal.CreateMatrixRoom(user, &evt.GroupInfo, true)
 		if err != nil {
 		if err != nil {
 			user.log.Errorln("Failed to create Matrix room after join notification: %v", err)
 			user.log.Errorln("Failed to create Matrix room after join notification: %v", err)
 		}
 		}