Merge pull request #121 from eatmoreapple/update-search

更新用户查找逻辑
This commit is contained in:
多吃点苹果 2022-11-12 21:51:15 +08:00 committed by GitHub
commit 4feda379ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 80 additions and 85 deletions

View File

@ -82,28 +82,25 @@ func (f Friends) SearchByRemarkName(limit int, remarkName string) (results Frien
} }
// Search 根据自定义条件查找好友 // Search 根据自定义条件查找好友
func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (results Friends) { func (f Friends) Search(limit int, searchFuncList ...func(friend *Friend) bool) (results Friends) {
if condFuncList == nil { return f.AsMembers().Search(limit, func(user *User) bool {
return f var friend = &Friend{user}
} for _, searchFunc := range searchFuncList {
if limit <= 0 { if !searchFunc(friend) {
limit = f.Count() return false
}
for _, member := range f {
if results.Count() == limit {
break
}
var passCount int
for _, condFunc := range condFuncList {
if condFunc(member) {
passCount++
} }
} }
if passCount == len(condFuncList) { return true
results = append(results, member) }).Friends()
} }
// AsMembers 将群组转换为用户列表
func (f Friends) AsMembers() Members {
var members = make(Members, 0, f.Count())
for _, friend := range f {
members = append(members, friend.User)
} }
return return members
} }
// SendText 向slice的好友依次发送文本消息 // SendText 向slice的好友依次发送文本消息
@ -308,28 +305,25 @@ func (g Groups) SearchByRemarkName(limit int, remarkName string) (results Groups
} }
// Search 根据自定义条件查找群组 // Search 根据自定义条件查找群组
func (g Groups) Search(limit int, condFuncList ...func(group *Group) bool) (results Groups) { func (g Groups) Search(limit int, searchFuncList ...func(group *Group) bool) (results Groups) {
if condFuncList == nil { return g.AsMembers().Search(limit, func(user *User) bool {
return g var group = &Group{user}
} for _, searchFunc := range searchFuncList {
if limit <= 0 { if !searchFunc(group) {
limit = g.Count() return false
}
for _, member := range g {
if results.Count() == limit {
break
}
var passCount int
for _, condFunc := range condFuncList {
if condFunc(member) {
passCount++
} }
} }
if passCount == len(condFuncList) { return true
results = append(results, member) }).Groups()
} }
// AsMembers 将群组列表转换为用户列表
func (g Groups) AsMembers() Members {
var members = make(Members, 0, g.Count())
for _, group := range g {
members = append(members, group.User)
} }
return return members
} }
// Mp 公众号对象 // Mp 公众号对象
@ -364,28 +358,25 @@ func (m Mps) Last() *Mp {
} }
// Search 根据自定义条件查找 // Search 根据自定义条件查找
func (m Mps) Search(limit int, condFuncList ...func(group *Mp) bool) (results Mps) { func (m Mps) Search(limit int, searchFuncList ...func(group *Mp) bool) (results Mps) {
if condFuncList == nil { return m.AsMembers().Search(limit, func(user *User) bool {
return m var mp = &Mp{user}
} for _, searchFunc := range searchFuncList {
if limit <= 0 { if !searchFunc(mp) {
limit = m.Count() return false
}
for _, member := range m {
if results.Count() == limit {
break
}
var passCount int
for _, condFunc := range condFuncList {
if condFunc(member) {
passCount++
} }
} }
if passCount == len(condFuncList) { return true
results = append(results, member) }).MPs()
} }
// AsMembers 将公众号列表转换为用户列表
func (m Mps) AsMembers() Members {
var members = make(Members, 0, m.Count())
for _, mp := range m {
members = append(members, mp.User)
} }
return return members
} }
// SearchByUserName 根据用户名查找 // SearchByUserName 根据用户名查找
@ -452,3 +443,19 @@ func (m Mps) GetByNickName(nickname string) *Mp {
func (m Mps) GetByUserName(username string) *Mp { func (m Mps) GetByUserName(username string) *Mp {
return m.SearchByUserName(1, username).First() return m.SearchByUserName(1, username).First()
} }
// search 根据自定义条件查找
func search(searchList Members, limit int, searchFunc func(group *User) bool) (results Members) {
if limit <= 0 {
limit = searchList.Count()
}
for _, member := range searchList {
if results.Count() == limit {
break
}
if searchFunc(member) {
results = append(results, member)
}
}
return
}

44
user.go
View File

@ -186,7 +186,8 @@ func (s *Self) updateMembers() error {
} }
// FileHelper 获取文件传输助手对象封装成Friend返回 // FileHelper 获取文件传输助手对象封装成Friend返回
// fh, err := self.FileHelper() // or fh := openwechat.NewFriendHelper(self) //
// fh, err := self.FileHelper() // or fh := openwechat.NewFriendHelper(self)
func (s *Self) FileHelper() (*Friend, error) { func (s *Self) FileHelper() (*Friend, error) {
// 如果缓存里有,直接返回,否则去联系人里面找 // 如果缓存里有,直接返回,否则去联系人里面找
if s.fileHelper != nil { if s.fileHelper != nil {
@ -300,7 +301,8 @@ func (s *Self) SendFileToFriend(friend *Friend, file *os.File) (*SentMessage, er
} }
// SetRemarkNameToFriend 设置好友备注 // SetRemarkNameToFriend 设置好友备注
// self.SetRemarkNameToFriend(friend, "remark") // or friend.SetRemarkName("remark") //
// self.SetRemarkNameToFriend(friend, "remark") // or friend.SetRemarkName("remark")
func (s *Self) SetRemarkNameToFriend(friend *Friend, remarkName string) error { func (s *Self) SetRemarkNameToFriend(friend *Friend, remarkName string) error {
req := s.Bot.Storage.Request req := s.Bot.Storage.Request
return s.Bot.Caller.WebWxOplog(req, remarkName, friend.UserName) return s.Bot.Caller.WebWxOplog(req, remarkName, friend.UserName)
@ -418,10 +420,11 @@ func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error
} }
// RevokeMessage 撤回消息 // RevokeMessage 撤回消息
// sentMessage, err := friend.SendText("message") //
// if err == nil { // sentMessage, err := friend.SendText("message")
// self.RevokeMessage(sentMessage) // or sentMessage.Revoke() // if err == nil {
// } // self.RevokeMessage(sentMessage) // or sentMessage.Revoke()
// }
func (s *Self) RevokeMessage(msg *SentMessage) error { func (s *Self) RevokeMessage(msg *SentMessage) error {
return s.Bot.Caller.WebWxRevokeMsg(msg, s.Bot.Storage.Request) return s.Bot.Caller.WebWxRevokeMsg(msg, s.Bot.Storage.Request)
} }
@ -516,30 +519,15 @@ func (m Members) SearchByRemarkName(limit int, remarkName string) (results Membe
} }
// Search 根据自定义条件查找 // Search 根据自定义条件查找
func (m Members) Search(limit int, condFuncList ...func(user *User) bool) (results Members) { func (m Members) Search(limit int, searchFuncList ...func(user *User) bool) (results Members) {
if condFuncList == nil { return search(m, limit, func(group *User) bool {
return m for _, searchFunc := range searchFuncList {
} if !searchFunc(group) {
if limit <= 0 { return false
limit = m.Count()
}
for _, member := range m {
if count := len(results); count == limit {
break
}
var passCount int
for _, condFunc := range condFuncList {
if condFunc(member) {
passCount++
} else {
break
} }
} }
if passCount == len(condFuncList) { return true
results = append(results, member) })
}
}
return
} }
// GetByUserName 根据username查找用户 // GetByUserName 根据username查找用户