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