diff --git a/bot_test.go b/bot_test.go index d6a543f..14752a3 100644 --- a/bot_test.go +++ b/bot_test.go @@ -20,10 +20,12 @@ func TestDefaultBot(t *testing.T) { return } self, _ := bot.GetCurrentUser() + fileHelper, _ := self.FileHelper() + fileHelper.SendText("6666") group, _ := self.Groups() friends, _ := self.Friends() - fmt.Println(group.Search(Cond{"NickName": "厉害了"})) - fmt.Println(friends.Search(Cond{"RemarkName": "阿青", "Sex": 2})) + fmt.Println(group.Search(Cond{"NickName": "厉害了"}, 1)) + fmt.Println(friends.Search(Cond{"RemarkName": "阿青", "Sex": 2}, 1)) fmt.Println(bot.Block()) } diff --git a/global.go b/global.go index a1d2305..b8ededd 100644 --- a/global.go +++ b/global.go @@ -1,6 +1,9 @@ package openwechat -import "regexp" +import ( + "errors" + "regexp" +) var ( uuidRegexp = regexp.MustCompile(`uuid = "(.*?)";`) @@ -32,7 +35,7 @@ const ( webWxGetMsgImgUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg" webWxGetVoiceUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetvoice" webWxGetVideoUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetvideo" - webWxLogoutUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxlogout" + webWxLogoutUrl = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxlogout" webWxGetMediaUrl = "https://file.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetmedia" jsonContentType = "application/json; charset=utf-8" @@ -52,3 +55,8 @@ const ( statusTimeout = "400" statusWait = "408" ) + +// errors +var ( + noSuchUserFoundError = errors.New("no such user found") +) diff --git a/message.go b/message.go index b591d9a..cf509d0 100644 --- a/message.go +++ b/message.go @@ -61,11 +61,11 @@ func (m *Message) Sender() (*User, error) { if m.FromUserName == m.Bot.self.User.UserName { return m.Bot.self.User, nil } - user, err := members.searchByUserNameLimit1(m.FromUserName) - if err != nil { - return nil, err + user, found := members.SearchByUserName(m.FromUserName, 1) + if !found { + return nil, noSuchUserFoundError } - return user.Detail() + return user.First().Detail() } // 获取消息在群里面的发送者 @@ -81,7 +81,11 @@ func (m *Message) SenderInGroup() (*User, error) { if err != nil { return nil, err } - return group.MemberList.searchByUserNameLimit1(m.senderInGroupUserName) + users, found := group.MemberList.SearchByUserName(m.senderInGroupUserName, 1) + if !found { + return nil, noSuchUserFoundError + } + return users.First(), nil } func (m *Message) Receiver() (*User, error) { @@ -89,10 +93,18 @@ func (m *Message) Receiver() (*User, error) { if sender, err := m.Sender(); err != nil { return nil, err } else { - return sender.MemberList.searchByUserNameLimit1(m.ToUserName) + users, found := sender.MemberList.SearchByUserName(m.ToUserName, 1) + if !found { + return nil, noSuchUserFoundError + } + return users.First(), nil } } else { - return m.Bot.self.MemberList.searchByUserNameLimit1(m.ToUserName) + users, found := m.Bot.self.MemberList.SearchByUserName(m.ToUserName, 1) + if !found { + return nil, noSuchUserFoundError + } + return users.First(), nil } } diff --git a/relations.go b/relations.go index ee2a016..5bb8b80 100644 --- a/relations.go +++ b/relations.go @@ -36,8 +36,28 @@ func (f Friends) Count() int { return len(f) } -func (f Friends) SearchByUserName(username string) (results Friends, found bool) { +func (f Friends) First() *Friend { + if f.Count() > 0 { + return f[0] + } + return nil +} + +func (f Friends) Last() *Friend { + if f.Count() > 0 { + return f[f.Count()-1] + } + return nil +} + +func (f Friends) SearchByUserName(username string, limit int) (results Friends, found bool) { + if limit <= 0 { + limit = f.Count() + } for _, friend := range f { + if results.Count() == limit { + break + } if friend.UserName == username { found = true results = append(results, friend) @@ -46,8 +66,14 @@ func (f Friends) SearchByUserName(username string) (results Friends, found bool) return } -func (f Friends) SearchByNickName(nickName string) (results Friends, found bool) { +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) @@ -56,8 +82,14 @@ func (f Friends) SearchByNickName(nickName string) (results Friends, found bool) return } -func (f Friends) SearchByRemarkName(remarkName string) (results Friends, found bool) { +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) @@ -66,26 +98,32 @@ func (f Friends) SearchByRemarkName(remarkName string) (results Friends, found b return } -func (f Friends) Search(cond Cond) (friends Friends, found bool) { +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) + return f.SearchByUserName(value, limit) } case "NickName": if value, ok := v.(string); ok { - return f.SearchByNickName(value) + return f.SearchByNickName(value, limit) } case "RemarkName": if value, ok := v.(string); ok { - return f.SearchByRemarkName(value) + return f.SearchByRemarkName(value, limit) } } } } + 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 { @@ -98,7 +136,7 @@ func (f Friends) Search(cond Cond) (friends Friends, found bool) { } if matchCount == len(cond) { found = true - friends = append(friends, friend) + results = append(results, friend) } } return @@ -156,8 +194,28 @@ func (g Groups) Count() int { return len(g) } -func (g Groups) SearchByUserName(username string) (results Groups, found bool) { +func (g Groups) First() *Group { + if g.Count() > 0 { + return g[0] + } + return nil +} + +func (g Groups) Last() *Group { + if g.Count() > 0 { + return g[g.Count()-1] + } + return nil +} + +func (g Groups) SearchByUserName(username string, limit int) (results Groups, found bool) { + if limit <= 0 { + limit = g.Count() + } for _, group := range g { + if results.Count() == limit { + break + } if group.UserName == username { found = true results = append(results, group) @@ -166,8 +224,14 @@ func (g Groups) SearchByUserName(username string) (results Groups, found bool) { return } -func (g Groups) SearchByNickName(nickName string) (results Groups, found bool) { +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) @@ -176,8 +240,14 @@ func (g Groups) SearchByNickName(nickName string) (results Groups, found bool) { return } -func (g Groups) SearchByRemarkName(remarkName string) (results Groups, found bool) { +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) @@ -186,28 +256,33 @@ func (g Groups) SearchByRemarkName(remarkName string) (results Groups, found boo return } -func (g Groups) Search(cond Cond) (results Groups, found bool) { +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) + return g.SearchByUserName(value, limit) } case "NickName": if value, ok := v.(string); ok { - return g.SearchByNickName(value) + return g.SearchByNickName(value, limit) } case "RemarkName": if value, ok := v.(string); ok { - return g.SearchByRemarkName(value) + return g.SearchByRemarkName(value, limit) } } } } - + 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 { diff --git a/user.go b/user.go index 1a07bb3..d038339 100644 --- a/user.go +++ b/user.go @@ -1,7 +1,6 @@ package openwechat import ( - "errors" "fmt" "io/ioutil" "net/http" @@ -162,11 +161,11 @@ func (s *Self) FileHelper() (*Friend, error) { if err != nil { return nil, err } - user, err := members.searchByUserNameLimit1("filehelper") - if err != nil { - return nil, err + users, found := members.SearchByUserName("filehelper", 1) + if !found { + return nil, noSuchUserFoundError } - s.fileHelper = &Friend{user} + s.fileHelper = &Friend{users.First()} return s.fileHelper, nil } @@ -292,23 +291,34 @@ func (m Members) Count() int { return len(m) } +func (m Members) First() *User { + if m.Count() > 0 { + return m[0] + } + return nil +} + +func (m Members) Last() *User { + if m.Count() > 0 { + return m[m.Count()-1] + } + return nil +} + func (m Members) SetOwner(s *Self) { for _, member := range m { member.Self = s } } -func (m Members) searchByUserNameLimit1(username string) (*User, error) { - for _, member := range m { - if member.UserName == username { - return member, nil - } +func (m Members) SearchByUserName(username string, limit int) (results Members, found bool) { + if limit <= 0 { + limit = len(m) } - return nil, errors.New("no such user found") -} - -func (m Members) SearchByUserName(username string) (results Members, found bool) { for _, member := range m { + if results.Count() == limit { + break + } if member.UserName == username { found = true results = append(results, member) @@ -317,8 +327,14 @@ func (m Members) SearchByUserName(username string) (results Members, found bool) return } -func (m Members) SearchByNickName(nickName string) (results Members, found bool) { +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) @@ -327,8 +343,14 @@ func (m Members) SearchByNickName(nickName string) (results Members, found bool) return } -func (m Members) SearchByRemarkName(remarkName string) (results Members, found bool) { +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) @@ -337,27 +359,35 @@ func (m Members) SearchByRemarkName(remarkName string) (results Members, found b return } -func (m Members) Search(cond Cond) (results Members, found bool) { +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) + return m.SearchByUserName(value, limit) } case "NickName": if value, ok := v.(string); ok { - return m.SearchByNickName(value) + return m.SearchByNickName(value, limit) } case "RemarkName": if value, ok := v.(string); ok { - return m.SearchByUserName(value) + return m.SearchByUserName(value, limit) } } } } + 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 {