From 65f82b679ef04caeb02e6145fc721b6d0e1c1118 Mon Sep 17 00:00:00 2001 From: ivy1996-encode <15055461510@163.com> Date: Mon, 15 Mar 2021 23:09:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9F=A5=E8=AF=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_test.go | 5 +- global.go | 8 ++ message.go | 16 ++-- relations.go | 206 ++++++++++++--------------------------------------- user.go | 112 +++++++--------------------- 5 files changed, 91 insertions(+), 256 deletions(-) diff --git a/bot_test.go b/bot_test.go index 14752a3..c71f7fb 100644 --- a/bot_test.go +++ b/bot_test.go @@ -24,8 +24,9 @@ func TestDefaultBot(t *testing.T) { fileHelper.SendText("6666") group, _ := self.Groups() friends, _ := self.Friends() - fmt.Println(group.Search(Cond{"NickName": "厉害了"}, 1)) - fmt.Println(friends.Search(Cond{"RemarkName": "阿青", "Sex": 2}, 1)) + fmt.Println(group.Search(1, func(group *Group) bool { return group.NickName == "厉害了" })) + results := friends.Search(1, func(friend *Friend) bool { return friend.User.RemarkName == "阿青" }, func(friend *Friend) bool { return friend.Sex == 2 }) + fmt.Println(results) fmt.Println(bot.Block()) } diff --git a/global.go b/global.go index b8ededd..5f76932 100644 --- a/global.go +++ b/global.go @@ -60,3 +60,11 @@ const ( var ( noSuchUserFoundError = errors.New("no such user found") ) + +const ALL = 0 + +// sex +const ( + MALE = 1 + FEMALE = 2 +) diff --git a/message.go b/message.go index cf509d0..6f66efb 100644 --- a/message.go +++ b/message.go @@ -61,8 +61,8 @@ func (m *Message) Sender() (*User, error) { if m.FromUserName == m.Bot.self.User.UserName { return m.Bot.self.User, nil } - user, found := members.SearchByUserName(m.FromUserName, 1) - if !found { + user := members.SearchByUserName(1, m.FromUserName) + if user == nil { return nil, noSuchUserFoundError } return user.First().Detail() @@ -81,8 +81,8 @@ func (m *Message) SenderInGroup() (*User, error) { if err != nil { return nil, err } - users, found := group.MemberList.SearchByUserName(m.senderInGroupUserName, 1) - if !found { + users := group.MemberList.SearchByUserName(1, m.senderInGroupUserName) + if users == nil { return nil, noSuchUserFoundError } return users.First(), nil @@ -93,15 +93,15 @@ func (m *Message) Receiver() (*User, error) { if sender, err := m.Sender(); err != nil { return nil, err } else { - users, found := sender.MemberList.SearchByUserName(m.ToUserName, 1) - if !found { + users := sender.MemberList.SearchByUserName(1, m.ToUserName) + if users == nil { return nil, noSuchUserFoundError } return users.First(), nil } } else { - users, found := m.Bot.self.MemberList.SearchByUserName(m.ToUserName, 1) - if !found { + users := m.Bot.self.MemberList.SearchByUserName(1, m.ToUserName) + if users == nil { return nil, noSuchUserFoundError } return users.First(), nil diff --git a/relations.go b/relations.go index 5bb8b80..ef13b1c 100644 --- a/relations.go +++ b/relations.go @@ -3,7 +3,6 @@ package openwechat import ( "fmt" "os" - "reflect" "strings" ) @@ -50,93 +49,37 @@ func (f Friends) Last() *Friend { return nil } -func (f Friends) SearchByUserName(username string, limit int) (results Friends, found bool) { +func (f Friends) SearchByUserName(limit int, username string) (results Friends) { + return f.Search(limit, func(friend *Friend) bool { return friend.User.UserName == username }) +} + +func (f Friends) SearchByNickName(limit int, nickName string) (results Friends) { + return f.Search(limit, func(friend *Friend) bool { return friend.User.NickName == nickName }) +} + +func (f Friends) SearchByRemarkName(limit int, remarkName string) (results Friends) { + return f.Search(limit, func(friend *Friend) bool { return friend.User.RemarkName == remarkName }) +} + +func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (results Friends) { + if condFuncList == nil { + return f + } if limit <= 0 { limit = f.Count() } - for _, friend := range f { + for _, member := range f { if results.Count() == limit { break } - if friend.UserName == username { - found = true - results = append(results, friend) - } - } - return -} - -func (f Friends) SearchByNickName(nickName string, limit int) (results Friends, found bool) { - if limit <= 0 { - limit = f.Count() - } - for _, friend := range f { - if results.Count() == limit { - break - } - if friend.NickName == nickName { - found = true - results = append(results, friend) - } - } - return -} - -func (f Friends) SearchByRemarkName(remarkName string, limit int) (results Friends, found bool) { - if limit <= 0 { - limit = f.Count() - } - for _, friend := range f { - if results.Count() == limit { - break - } - if friend.User.RemarkName == remarkName { - found = true - results = append(results, friend) - } - } - return -} - -func (f Friends) Search(cond Cond, limit int) (results Friends, found bool) { - if len(cond) == 1 { - for k, v := range cond { - switch k { - case "UserName": - if value, ok := v.(string); ok { - return f.SearchByUserName(value, limit) - } - case "NickName": - if value, ok := v.(string); ok { - return f.SearchByNickName(value, limit) - } - case "RemarkName": - if value, ok := v.(string); ok { - return f.SearchByRemarkName(value, limit) - } + var passCount int + for _, condFunc := range condFuncList { + if condFunc(member) { + passCount++ } } - } - if limit <= 0 { - limit = f.Count() - } - for _, friend := range f { - if results.Count() == limit { - break - } - value := reflect.ValueOf(friend).Elem() - var matchCount int - for k, v := range cond { - if field := value.FieldByName(k); field.IsValid() { - if field.Interface() != v { - break - } - matchCount++ - } - } - if matchCount == len(cond) { - found = true - results = append(results, friend) + if passCount == len(condFuncList) { + results = append(results, member) } } return @@ -208,94 +151,37 @@ func (g Groups) Last() *Group { return nil } -func (g Groups) SearchByUserName(username string, limit int) (results Groups, found bool) { +func (g Groups) SearchByUserName(limit int, username string) (results Groups) { + return g.Search(limit, func(group *Group) bool { return group.UserName == username }) +} + +func (g Groups) SearchByNickName(limit int, nickName string) (results Groups) { + return g.Search(limit, func(group *Group) bool { return group.NickName == nickName }) +} + +func (g Groups) SearchByRemarkName(limit int, remarkName string) (results Groups) { + return g.Search(limit, func(group *Group) bool { return group.RemarkName == remarkName }) +} + +func (g Groups) Search(limit int, condFuncList ...func(group *Group) bool) (results Groups) { + if condFuncList == nil { + return g + } if limit <= 0 { limit = g.Count() } - for _, group := range g { + for _, member := range g { if results.Count() == limit { break } - if group.UserName == username { - found = true - results = append(results, group) - } - } - return -} - -func (g Groups) SearchByNickName(nickName string, limit int) (results Groups, found bool) { - if limit <= 0 { - limit = g.Count() - } - for _, group := range g { - if results.Count() == limit { - break - } - if group.NickName == nickName { - found = true - results = append(results, group) - } - } - return -} - -func (g Groups) SearchByRemarkName(remarkName string, limit int) (results Groups, found bool) { - if limit <= 0 { - limit = g.Count() - } - for _, group := range g { - if results.Count() == limit { - break - } - if group.User.RemarkName == remarkName { - found = true - results = append(results, group) - } - } - return -} - -func (g Groups) Search(cond Cond, limit int) (results Groups, found bool) { - - if len(cond) == 1 { - for k, v := range cond { - switch k { - case "UserName": - if value, ok := v.(string); ok { - return g.SearchByUserName(value, limit) - } - case "NickName": - if value, ok := v.(string); ok { - return g.SearchByNickName(value, limit) - } - case "RemarkName": - if value, ok := v.(string); ok { - return g.SearchByRemarkName(value, limit) - } + var passCount int + for _, condFunc := range condFuncList { + if condFunc(member) { + passCount++ } } - } - if limit <= 0 { - limit = g.Count() - } - for _, group := range g { - if g.Count() == limit { - break - } - value := reflect.ValueOf(group).Elem() - var matchCount int - for k, v := range cond { - if field := value.FieldByName(k); field.IsValid() { - if field.Interface() != v { - break - } - matchCount++ - } - } - if matchCount == len(cond) { - found = true - results = append(results, group) + if passCount == len(condFuncList) { + results = append(results, member) } } return diff --git a/user.go b/user.go index d038339..5430227 100644 --- a/user.go +++ b/user.go @@ -5,7 +5,6 @@ import ( "io/ioutil" "net/http" "os" - "reflect" ) type User struct { @@ -161,8 +160,8 @@ func (s *Self) FileHelper() (*Friend, error) { if err != nil { return nil, err } - users, found := members.SearchByUserName("filehelper", 1) - if !found { + users := members.SearchByUserName(1, "filehelper") + if users == nil { return nil, noSuchUserFoundError } s.fileHelper = &Friend{users.First()} @@ -311,99 +310,40 @@ func (m Members) SetOwner(s *Self) { } } -func (m Members) SearchByUserName(username string, limit int) (results Members, found bool) { +func (m Members) SearchByUserName(limit int, username string) (results Members) { + return m.Search(limit, func(user *User) bool { return user.UserName == username }) +} + +func (m Members) SearchByNickName(limit int, nickName string) (results Members) { + return m.Search(limit, func(user *User) bool { return user.NickName == nickName }) +} + +func (m Members) SearchByRemarkName(limit int, remarkName string) (results Members) { + return m.Search(limit, func(user *User) bool { return user.RemarkName == remarkName }) +} + +func (m Members) Search(limit int, condFuncList ...func(user *User) bool) (results Members) { + if condFuncList == nil { + return m + } if limit <= 0 { - limit = len(m) + limit = m.Count() } for _, member := range m { if results.Count() == limit { break } - if member.UserName == username { - found = true - results = append(results, member) - } - } - return -} - -func (m Members) SearchByNickName(nickName string, limit int) (results Members, found bool) { - if limit <= 0 { - limit = len(m) - } - for _, member := range m { - if results.Count() == limit { - break - } - if member.NickName == nickName { - found = true - results = append(results, member) - } - } - return -} - -func (m Members) SearchByRemarkName(remarkName string, limit int) (results Members, found bool) { - if limit <= 0 { - limit = len(m) - } - for _, member := range m { - if results.Count() == limit { - break - } - if member.RemarkName == remarkName { - found = true - results = append(results, member) - } - } - return -} - -func (m Members) Search(cond Cond, limit int) (results Members, found bool) { - - if len(cond) == 1 { - for k, v := range cond { - switch k { - case "UserName": - if value, ok := v.(string); ok { - return m.SearchByUserName(value, limit) - } - case "NickName": - if value, ok := v.(string); ok { - return m.SearchByNickName(value, limit) - } - case "RemarkName": - if value, ok := v.(string); ok { - return m.SearchByUserName(value, limit) - } + var passCount int + for _, condFunc := range condFuncList { + if condFunc(member) { + passCount++ + } else { + break } } - } - - if limit <= 0 { - limit = len(m) - } - - for _, member := range m { - if results.Count() == limit { - break - } - value := reflect.ValueOf(member).Elem() - var matchCount int - for k, v := range cond { - if field := value.FieldByName(k); field.IsValid() { - if field.Interface() != v { - break - } - matchCount++ - } - } - if matchCount == len(cond) { - found = true + if passCount == len(condFuncList) { results = append(results, member) } } return } - -type Cond map[string]interface{}