Optimize the synchronization of skype group names without topics

This commit is contained in:
zhaoYangguang 2020-11-06 19:42:34 +08:00
parent f0c76006f2
commit 0b18b231bb
2 changed files with 103 additions and 25 deletions

View File

@ -533,19 +533,37 @@ func (portal *Portal) UpdateMetadata(user *User) bool {
} }
portalName := "" portalName := ""
noRoomTopic := false
names := strings.Split(metadata.Name, ", ") names := strings.Split(metadata.Name, ", ")
for _, name := range names { for _, name := range names {
if strings.Index(name, ":") > 0 {
key := "8:" + name + skypeExt.NewUserSuffix key := "8:" + name + skypeExt.NewUserSuffix
if key == user.JID { if key == user.JID {
noRoomTopic = true
}
}
if noRoomTopic {
for index, participant := range metadata.Participants {
fmt.Println()
fmt.Printf("metadata.Participants1: %+v", participant)
fmt.Println()
if participant.JID == user.JID {
continue continue
} }
if contact, ok := user.Conn.Store.Contacts[key]; ok { if contact, ok := user.Conn.Store.Contacts[participant.JID]; ok {
portalName += contact.DisplayName if len(portalName) == 0 {
portalName = contact.DisplayName
} else {
if index > 5 {
portalName = portalName + ", ..."
break
} else {
portalName = portalName + ", " + contact.DisplayName
} }
} }
} }
if len(portalName) < 1 { }
} else {
portalName = metadata.Name portalName = metadata.Name
} }
// portal.Topic = "" // portal.Topic = ""
@ -1085,25 +1103,36 @@ func (portal *Portal) CreateMatrixRoom(user *User) error {
metadata, err = user.Conn.GetGroupMetaData(portal.Key.JID) metadata, err = user.Conn.GetGroupMetaData(portal.Key.JID)
if err == nil { if err == nil {
portalName := "" portalName := ""
noRoomTopic := false
names := strings.Split(metadata.Name, ", ") names := strings.Split(metadata.Name, ", ")
for _, name := range names { for _, name := range names {
if strings.Index(name, ":") > 0 {
key := "8:" + name + skypeExt.NewUserSuffix key := "8:" + name + skypeExt.NewUserSuffix
if key == user.JID { if key == user.JID {
noRoomTopic = true
}
}
if noRoomTopic {
for index, participant := range metadata.Participants {
fmt.Println()
fmt.Printf("metadata.Participants2: %+v", participant)
fmt.Println()
if participant.JID == user.JID {
continue continue
} }
if contact, ok := user.Conn.Store.Contacts[key]; ok { if contact, ok := user.Conn.Store.Contacts[participant.JID]; ok {
if len(portalName) > 0 { if len(portalName) == 0 {
portalName = portalName + ", " + contact.DisplayName
} else {
portalName = contact.DisplayName portalName = contact.DisplayName
} } else {
} if index > 5 {
} else if name == "..." {
portalName = portalName + ", ..." portalName = portalName + ", ..."
break
} else {
portalName = portalName + ", " + contact.DisplayName
}
}
} }
} }
if len(portalName) > 0 {
portal.Name = portalName portal.Name = portalName
} else { } else {
portal.Name = metadata.Name portal.Name = metadata.Name
@ -2391,6 +2420,27 @@ func (portal *Portal) GetMatrixUsers() ([]id.UserID, error) {
return users, nil return users, nil
} }
func (portal *Portal) GetPuppets() ([]struct {
DisplayName *string `json:"display_name"`
AvatarURL *string `json:"avatar_url"`
}, error) {
members, err := portal.MainIntent().JoinedMembers(portal.MXID)
if err != nil {
return nil, errors.Wrap(err, "failed to get member list")
}
var puppets []struct {
DisplayName *string `json:"display_name"`
AvatarURL *string `json:"avatar_url"`
}
for userID := range members.Joined {
_, isPuppet := portal.bridge.ParsePuppetMXID(userID)
if isPuppet && userID != portal.bridge.Bot.UserID {
puppets = append(puppets, members.Joined[userID])
}
}
return puppets, nil
}
func (portal *Portal) CleanupIfEmpty() { func (portal *Portal) CleanupIfEmpty() {
users, err := portal.GetMatrixUsers() users, err := portal.GetMatrixUsers()
if err != nil { if err != nil {

30
user.go
View File

@ -1007,8 +1007,36 @@ func (user *User) HandleChatUpdate(cmd skype.Resource) {
topicContent := skype.ChatTopicContent{} topicContent := skype.ChatTopicContent{}
//把xml数据解析成bs对象 //把xml数据解析成bs对象
xml.Unmarshal([]byte(cmd.Content), &topicContent) xml.Unmarshal([]byte(cmd.Content), &topicContent)
portalName := ""
noRoomTopic := false
names := strings.Split(cmd.ThreadTopic, ", ")
for _, name := range names {
key := "8:" + name + skypeExt.NewUserSuffix
if key == user.JID {
noRoomTopic = true
}
}
if noRoomTopic {
participants, _ := portal.GetPuppets()
for index, participant := range participants {
if *participant.DisplayName != user.Conn.LoginInfo.Username {
if len(portalName) == 0 {
portalName = *participant.DisplayName
} else {
if index > 5 {
portalName = portalName + ", ..."
break
} else {
portalName = *participant.DisplayName + ", " + portalName
}
}
}
}
} else {
portalName = cmd.ThreadTopic
}
cmd.SendId = topicContent.Initiator + skypeExt.NewUserSuffix cmd.SendId = topicContent.Initiator + skypeExt.NewUserSuffix
go portal.UpdateName(cmd.ThreadTopic, cmd.SendId) go portal.UpdateName(portalName, cmd.SendId)
case skypeExt.ChatPictureUpdate: case skypeExt.ChatPictureUpdate:
topicContent := skype.ChatPictureContent{} topicContent := skype.ChatPictureContent{}
//把xml数据解析成bs对象 //把xml数据解析成bs对象