From 9d85e8f23135476a4699c12e27bb24af3f26aae1 Mon Sep 17 00:00:00 2001 From: ivy1996-encode <15055461510@163.com> Date: Mon, 15 Mar 2021 15:31:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_test.go | 30 +++++------------------ relations.go | 67 +++++++++++++++++++++++++++++++++++++++------------- user.go | 39 +++++++++++++----------------- 3 files changed, 73 insertions(+), 63 deletions(-) diff --git a/bot_test.go b/bot_test.go index c4cbc47..dc85854 100644 --- a/bot_test.go +++ b/bot_test.go @@ -11,6 +11,7 @@ func TestDefaultBot(t *testing.T) { if message.Content == "logout" { bot.Logout() } + fmt.Println(message.Content) } bot.RegisterMessageHandler(messageHandler) bot.UUIDCallback = PrintlnQrcodeUrl @@ -18,6 +19,11 @@ func TestDefaultBot(t *testing.T) { fmt.Println(err) 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()) } @@ -77,30 +83,6 @@ func TestBotMessageSender(t *testing.T) { 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) { messageHandler := func(message *Message) { fmt.Println(message) diff --git a/relations.go b/relations.go index eb86564..bed5618 100644 --- a/relations.go +++ b/relations.go @@ -3,6 +3,7 @@ package openwechat import ( "fmt" "os" + "reflect" "strings" ) @@ -35,24 +36,40 @@ func (f Friends) Count() int { return len(f) } -func (f Friends) SearchByRemarkName(name string) (Friends, error) { - if f.Count() == 0 { - return nil, nil - } - self := f[0].Self - members, err := searchByRemarkName(name, self) - if err != nil { - return nil, err - } - var newFriends Friends - for _, member := range members { - friend := &Friend{member} - if newFriends == nil { - newFriends = make(Friends, 0) +func (f Friends) Search(cond Cond) (friends Friends, found bool) { + for _, member := range f { + value := reflect.ValueOf(member).Elem() + for k, v := range cond { + if field := value.FieldByName(k); field.IsValid() { + if field.Interface() == v { + found = true + if friends == nil { + friends = make(Friends, 0) + } + friends = append(friends, member) + } + } } - 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 } @@ -89,6 +106,24 @@ func (g Groups) Count() int { 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 { return !isGroup(user) && strings.HasPrefix(user.UserName, "@") && user.VerifyFlag == 0 } diff --git a/user.go b/user.go index cd9fdcf..0569eb6 100644 --- a/user.go +++ b/user.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "net/http" "os" + "reflect" ) type User struct { @@ -306,30 +307,22 @@ func (m Members) SearchByUserName(username string) (*User, error) { return nil, errors.New("no such user found") } -func (m Members) SearchByRemarkName(name string) (Members, error) { - if m.Count() == 0 { - return nil, nil - } - self := m[0].Self - return searchByRemarkName(name, self) -} - -func searchByRemarkName(name string, self *Self) (Members, error) { - if err := self.UpdateMembersDetail(); err != nil { - return nil, err - } - 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) +func (m Members) Search(cond Cond) (results Members, found bool) { + for _, member := range m { + value := reflect.ValueOf(member).Elem() + for k, v := range cond { + if field := value.FieldByName(k); field.IsValid() { + if field.Interface() == v { + found = true + if results == nil { + results = make(Members, 0) + } + results = append(results, member) + } } - newMembers = append(newMembers, member) } } - return newMembers, nil + return } + +type Cond map[string]interface{}