添加查询数量限制

This commit is contained in:
ivy1996-encode 2021-03-15 22:00:10 +08:00
parent 7fbb5e6db0
commit 739ecc3f65
5 changed files with 174 additions and 47 deletions

View File

@ -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())
}

View File

@ -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")
)

View File

@ -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
}
}

View File

@ -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 {

70
user.go
View File

@ -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 {