添加用户查找功能

This commit is contained in:
ivy1996-encode 2021-03-15 15:31:48 +08:00
parent c1c2fd9f72
commit 9d85e8f231
3 changed files with 73 additions and 63 deletions

View File

@ -11,6 +11,7 @@ func TestDefaultBot(t *testing.T) {
if message.Content == "logout" { if message.Content == "logout" {
bot.Logout() bot.Logout()
} }
fmt.Println(message.Content)
} }
bot.RegisterMessageHandler(messageHandler) bot.RegisterMessageHandler(messageHandler)
bot.UUIDCallback = PrintlnQrcodeUrl bot.UUIDCallback = PrintlnQrcodeUrl
@ -18,6 +19,11 @@ func TestDefaultBot(t *testing.T) {
fmt.Println(err) fmt.Println(err)
return return
} }
self, _ := bot.GetCurrentUser()
group, _ := self.Groups()
friends, _ := self.Friends()
fmt.Println(group.Search(Cond{"NickName": "厉害了"}))
fmt.Println(friends.Search(Cond{"RemarkName": "阿青"}))
fmt.Println(bot.Block()) fmt.Println(bot.Block())
} }
@ -77,30 +83,6 @@ func TestBotMessageSender(t *testing.T) {
bot.Block() bot.Block()
} }
func TestFriends_SearchByRemarkName(t *testing.T) {
messageHandler := func(message *Message) {
fmt.Println(message)
}
bot := DefaultBot()
bot.RegisterMessageHandler(messageHandler)
bot.UUIDCallback = PrintlnQrcodeUrl
if err := bot.Login(); err != nil {
fmt.Println(err)
return
}
self, _ := bot.GetCurrentUser()
friends, err := self.Friends()
if err != nil {
fmt.Println(err)
return
}
d, err := friends[0].Detail()
fmt.Println(d, err)
firends2, err := friends.SearchByRemarkName("66")
fmt.Println(firends2)
fmt.Println(err)
}
func TestUser_GetAvatarResponse(t *testing.T) { func TestUser_GetAvatarResponse(t *testing.T) {
messageHandler := func(message *Message) { messageHandler := func(message *Message) {
fmt.Println(message) fmt.Println(message)

View File

@ -3,6 +3,7 @@ package openwechat
import ( import (
"fmt" "fmt"
"os" "os"
"reflect"
"strings" "strings"
) )
@ -35,24 +36,40 @@ func (f Friends) Count() int {
return len(f) return len(f)
} }
func (f Friends) SearchByRemarkName(name string) (Friends, error) { func (f Friends) Search(cond Cond) (friends Friends, found bool) {
if f.Count() == 0 { for _, member := range f {
return nil, nil value := reflect.ValueOf(member).Elem()
} for k, v := range cond {
self := f[0].Self if field := value.FieldByName(k); field.IsValid() {
members, err := searchByRemarkName(name, self) if field.Interface() == v {
if err != nil { found = true
return nil, err if friends == nil {
} friends = make(Friends, 0)
var newFriends Friends }
for _, member := range members { friends = append(friends, member)
friend := &Friend{member} }
if newFriends == nil { }
newFriends = make(Friends, 0)
} }
newFriends = append(newFriends, friend)
} }
return newFriends, nil return
}
func (f Friends) SendMsg(msg *SendMessage) error {
for _, friend := range f {
if err := friend.SendMsg(msg); err != nil {
return err
}
}
return nil
}
func (f Friends) SendText(text string) error {
for _, friend := range f {
if err := friend.SendText(text); err != nil {
return err
}
}
return nil
} }
type Group struct{ *User } type Group struct{ *User }
@ -89,6 +106,24 @@ func (g Groups) Count() int {
return len(g) return len(g)
} }
func (g Groups) Search(cond Cond) (groups Groups, found bool) {
for _, member := range g {
value := reflect.ValueOf(member).Elem()
for k, v := range cond {
if field := value.FieldByName(k); field.IsValid() {
if field.Interface() == v {
found = true
if groups == nil {
groups = make(Groups, 0)
}
groups = append(groups, member)
}
}
}
}
return
}
func isFriend(user User) bool { func isFriend(user User) bool {
return !isGroup(user) && strings.HasPrefix(user.UserName, "@") && user.VerifyFlag == 0 return !isGroup(user) && strings.HasPrefix(user.UserName, "@") && user.VerifyFlag == 0
} }

39
user.go
View File

@ -6,6 +6,7 @@ import (
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"os" "os"
"reflect"
) )
type User struct { type User struct {
@ -306,30 +307,22 @@ func (m Members) SearchByUserName(username string) (*User, error) {
return nil, errors.New("no such user found") return nil, errors.New("no such user found")
} }
func (m Members) SearchByRemarkName(name string) (Members, error) { func (m Members) Search(cond Cond) (results Members, found bool) {
if m.Count() == 0 { for _, member := range m {
return nil, nil value := reflect.ValueOf(member).Elem()
} for k, v := range cond {
self := m[0].Self if field := value.FieldByName(k); field.IsValid() {
return searchByRemarkName(name, self) if field.Interface() == v {
} found = true
if results == nil {
func searchByRemarkName(name string, self *Self) (Members, error) { results = make(Members, 0)
if err := self.UpdateMembersDetail(); err != nil { }
return nil, err results = append(results, member)
} }
members, err := self.Members()
if err != nil {
return nil, err
}
var newMembers Members
for _, member := range members {
if member.RemarkName == name {
if newMembers == nil {
newMembers = make(Members, 0)
} }
newMembers = append(newMembers, member)
} }
} }
return newMembers, nil return
} }
type Cond map[string]interface{}