优化查询逻辑,支持自定义查询
This commit is contained in:
parent
739ecc3f65
commit
65f82b679e
@ -24,8 +24,9 @@ func TestDefaultBot(t *testing.T) {
|
|||||||
fileHelper.SendText("6666")
|
fileHelper.SendText("6666")
|
||||||
group, _ := self.Groups()
|
group, _ := self.Groups()
|
||||||
friends, _ := self.Friends()
|
friends, _ := self.Friends()
|
||||||
fmt.Println(group.Search(Cond{"NickName": "厉害了"}, 1))
|
fmt.Println(group.Search(1, func(group *Group) bool { return group.NickName == "厉害了" }))
|
||||||
fmt.Println(friends.Search(Cond{"RemarkName": "阿青", "Sex": 2}, 1))
|
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())
|
fmt.Println(bot.Block())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,3 +60,11 @@ const (
|
|||||||
var (
|
var (
|
||||||
noSuchUserFoundError = errors.New("no such user found")
|
noSuchUserFoundError = errors.New("no such user found")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const ALL = 0
|
||||||
|
|
||||||
|
// sex
|
||||||
|
const (
|
||||||
|
MALE = 1
|
||||||
|
FEMALE = 2
|
||||||
|
)
|
||||||
|
16
message.go
16
message.go
@ -61,8 +61,8 @@ 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, found := members.SearchByUserName(m.FromUserName, 1)
|
user := members.SearchByUserName(1, m.FromUserName)
|
||||||
if !found {
|
if user == nil {
|
||||||
return nil, noSuchUserFoundError
|
return nil, noSuchUserFoundError
|
||||||
}
|
}
|
||||||
return user.First().Detail()
|
return user.First().Detail()
|
||||||
@ -81,8 +81,8 @@ func (m *Message) SenderInGroup() (*User, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
users, found := group.MemberList.SearchByUserName(m.senderInGroupUserName, 1)
|
users := group.MemberList.SearchByUserName(1, m.senderInGroupUserName)
|
||||||
if !found {
|
if users == nil {
|
||||||
return nil, noSuchUserFoundError
|
return nil, noSuchUserFoundError
|
||||||
}
|
}
|
||||||
return users.First(), nil
|
return users.First(), nil
|
||||||
@ -93,15 +93,15 @@ 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 {
|
||||||
users, found := sender.MemberList.SearchByUserName(m.ToUserName, 1)
|
users := sender.MemberList.SearchByUserName(1, m.ToUserName)
|
||||||
if !found {
|
if users == nil {
|
||||||
return nil, noSuchUserFoundError
|
return nil, noSuchUserFoundError
|
||||||
}
|
}
|
||||||
return users.First(), nil
|
return users.First(), nil
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
users, found := m.Bot.self.MemberList.SearchByUserName(m.ToUserName, 1)
|
users := m.Bot.self.MemberList.SearchByUserName(1, m.ToUserName)
|
||||||
if !found {
|
if users == nil {
|
||||||
return nil, noSuchUserFoundError
|
return nil, noSuchUserFoundError
|
||||||
}
|
}
|
||||||
return users.First(), nil
|
return users.First(), nil
|
||||||
|
192
relations.go
192
relations.go
@ -3,7 +3,6 @@ package openwechat
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -50,93 +49,37 @@ func (f Friends) Last() *Friend {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f Friends) SearchByUserName(username string, limit int) (results Friends, found bool) {
|
func (f Friends) SearchByUserName(limit int, username string) (results Friends) {
|
||||||
if limit <= 0 {
|
return f.Search(limit, func(friend *Friend) bool { return friend.User.UserName == username })
|
||||||
limit = f.Count()
|
|
||||||
}
|
|
||||||
for _, friend := 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) {
|
func (f Friends) SearchByNickName(limit int, nickName string) (results Friends) {
|
||||||
if limit <= 0 {
|
return f.Search(limit, func(friend *Friend) bool { return friend.User.NickName == nickName })
|
||||||
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) {
|
func (f Friends) SearchByRemarkName(limit int, remarkName string) (results Friends) {
|
||||||
if limit <= 0 {
|
return f.Search(limit, func(friend *Friend) bool { return friend.User.RemarkName == remarkName })
|
||||||
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) {
|
func (f Friends) Search(limit int, condFuncList ...func(friend *Friend) bool) (results Friends) {
|
||||||
if len(cond) == 1 {
|
if condFuncList == nil {
|
||||||
for k, v := range cond {
|
return f
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if limit <= 0 {
|
if limit <= 0 {
|
||||||
limit = f.Count()
|
limit = f.Count()
|
||||||
}
|
}
|
||||||
for _, friend := range f {
|
for _, member := range f {
|
||||||
if results.Count() == limit {
|
if results.Count() == limit {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
value := reflect.ValueOf(friend).Elem()
|
var passCount int
|
||||||
var matchCount int
|
for _, condFunc := range condFuncList {
|
||||||
for k, v := range cond {
|
if condFunc(member) {
|
||||||
if field := value.FieldByName(k); field.IsValid() {
|
passCount++
|
||||||
if field.Interface() != v {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
matchCount++
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if matchCount == len(cond) {
|
if passCount == len(condFuncList) {
|
||||||
found = true
|
results = append(results, member)
|
||||||
results = append(results, friend)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@ -208,94 +151,37 @@ func (g Groups) Last() *Group {
|
|||||||
return nil
|
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 {
|
if limit <= 0 {
|
||||||
limit = g.Count()
|
limit = g.Count()
|
||||||
}
|
}
|
||||||
for _, group := range g {
|
for _, member := range g {
|
||||||
if results.Count() == limit {
|
if results.Count() == limit {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if group.UserName == username {
|
var passCount int
|
||||||
found = true
|
for _, condFunc := range condFuncList {
|
||||||
results = append(results, group)
|
if condFunc(member) {
|
||||||
|
passCount++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
if passCount == len(condFuncList) {
|
||||||
}
|
results = append(results, member)
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
116
user.go
116
user.go
@ -5,7 +5,6 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
@ -161,8 +160,8 @@ func (s *Self) FileHelper() (*Friend, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
users, found := members.SearchByUserName("filehelper", 1)
|
users := members.SearchByUserName(1, "filehelper")
|
||||||
if !found {
|
if users == nil {
|
||||||
return nil, noSuchUserFoundError
|
return nil, noSuchUserFoundError
|
||||||
}
|
}
|
||||||
s.fileHelper = &Friend{users.First()}
|
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 {
|
if limit <= 0 {
|
||||||
limit = len(m)
|
limit = m.Count()
|
||||||
}
|
}
|
||||||
for _, member := range m {
|
for _, member := range m {
|
||||||
if results.Count() == limit {
|
if results.Count() == limit {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if member.UserName == username {
|
var passCount int
|
||||||
found = true
|
for _, condFunc := range condFuncList {
|
||||||
|
if condFunc(member) {
|
||||||
|
passCount++
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if passCount == len(condFuncList) {
|
||||||
results = append(results, member)
|
results = append(results, member)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
results = append(results, member)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
type Cond map[string]interface{}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user