添加emoji格式化
This commit is contained in:
parent
258ac4f236
commit
7a46544dc1
67
bot_test.go
67
bot_test.go
@ -1,70 +1,15 @@
|
||||
package openwechat
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
import "testing"
|
||||
|
||||
func TestDefaultBot(t *testing.T) {
|
||||
bot := DefaultBot()
|
||||
bot.MessageHandler = func(message *Message) {
|
||||
if message.Content == "logout" {
|
||||
bot.Logout()
|
||||
}
|
||||
fmt.Println(message.Content)
|
||||
}
|
||||
bot.UUIDCallback = PrintlnQrcodeUrl
|
||||
if err := bot.Login(); err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
self, _ := bot.GetCurrentUser()
|
||||
self.SaveAvatar("2.png")
|
||||
fileHelper, _ := self.FileHelper()
|
||||
fileHelper.SendText("6666")
|
||||
group, _ := self.Groups()
|
||||
friends, _ := self.Friends()
|
||||
fmt.Println(group.Search(1, func(group *Group) bool { return group.NickName == "厉害了" }))
|
||||
results := friends.Search(1, func(friend *Friend) bool { return friend.RemarkName == "阿青" }, func(friend *Friend) bool { return friend.Sex == 2 })
|
||||
fmt.Println(results)
|
||||
fmt.Println(bot.Block())
|
||||
}
|
||||
|
||||
func TestUser_GetAvatarResponse(t *testing.T) {
|
||||
|
||||
bot := DefaultBot()
|
||||
bot.UUIDCallback = PrintlnQrcodeUrl
|
||||
if err := bot.Login(); err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
self, _ := bot.GetCurrentUser()
|
||||
self.SaveAvatar("2.png")
|
||||
friend, err := self.Friends()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
friend[0].SaveAvatar(friend[0].NickName + ".png")
|
||||
}
|
||||
|
||||
func getDefaultLoginBot() *Bot {
|
||||
func defaultBot() *Bot {
|
||||
bot := DefaultBot()
|
||||
bot.UUIDCallback = PrintlnQrcodeUrl
|
||||
return bot
|
||||
}
|
||||
|
||||
func TestSendFile(t *testing.T) {
|
||||
bot := getDefaultLoginBot()
|
||||
bot.MessageHandler = func(msg *Message) {
|
||||
user, err := msg.Sender()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
fmt.Println(msg.Content)
|
||||
fmt.Println(user.NickName)
|
||||
}
|
||||
func TestBotLogin(t *testing.T) {
|
||||
bot := defaultBot()
|
||||
if err := bot.Login(); err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
@ -74,7 +19,5 @@ func TestSendFile(t *testing.T) {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
fileHelper, _ := self.FileHelper()
|
||||
fileHelper.sendText("666")
|
||||
bot.Block()
|
||||
t.Log(self.NickName)
|
||||
}
|
||||
|
8
emoji.go
8
emoji.go
@ -1,7 +1,6 @@
|
||||
package openwechat
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
@ -10,7 +9,7 @@ var (
|
||||
emojiRegexp = regexp.MustCompile(`<span class="emoji emoji(.*?)"></span>`)
|
||||
)
|
||||
|
||||
var emojiDict = map[string]string{
|
||||
var EmojiDict = map[string]string{
|
||||
"U+00A9": "©", "U+00AE": "®", "U+1F004": "🀄", "U+1F0CF": "🃏", "U+1F170": "🅰", "U+1F171": "🅱", "U+1F17E": "🅾",
|
||||
"U+1F17F": "🅿", "U+1F18E": "🆎", "U+1F191": "🆑", "U+1F192": "🆒", "U+1F193": "🆓", "U+1F194": "🆔", "U+1F195": "🆕",
|
||||
"U+1F196": "🆖", "U+1F197": "🆗", "U+1F198": "🆘", "U+1F199": "🆙", "U+1F19A": "🆚", "U+1F201": "🈁", "U+1F202": "🈂",
|
||||
@ -112,13 +111,12 @@ var emojiDict = map[string]string{
|
||||
"U+2935": "⤵", "U+2B05": "⬅", "U+2B06": "⬆", "U+2B07": "⬇", "U+2B1B": "⬛", "U+2B1C": "⬜", "U+2B50": "⭐",
|
||||
"U+2B55": "⭕", "U+3030": "〰", "U+303D": "〽", "U+3297": "㊗", "U+3299": "㊙"}
|
||||
|
||||
func formatEmoji(text string) string {
|
||||
func FormatEmoji(text string) string {
|
||||
if result := emojiRegexp.FindAllStringSubmatch(text, -1); len(result) != 0 {
|
||||
for _, item := range result {
|
||||
value := item[0]
|
||||
key := "U+" + strings.ToUpper(item[1])
|
||||
fmt.Println(key)
|
||||
text = strings.ReplaceAll(text, value, emojiDict[key])
|
||||
text = strings.ReplaceAll(text, value, EmojiDict[key])
|
||||
}
|
||||
}
|
||||
return text
|
||||
|
7
emoji_test.go
Normal file
7
emoji_test.go
Normal file
@ -0,0 +1,7 @@
|
||||
package openwechat
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestFormatEmoji(t *testing.T) {
|
||||
t.Log(FormatEmoji(`多吃点苹果<span class="emoji emoji1f34f"></span>`))
|
||||
}
|
518
user.go
518
user.go
@ -1,355 +1,359 @@
|
||||
package openwechat
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
Uin int
|
||||
HideInputBarFlag int
|
||||
StarFriend int
|
||||
Sex int
|
||||
AppAccountFlag int
|
||||
VerifyFlag int
|
||||
ContactFlag int
|
||||
WebWxPluginSwitch int
|
||||
HeadImgFlag int
|
||||
SnsFlag int
|
||||
UserName string
|
||||
NickName string
|
||||
HeadImgUrl string
|
||||
RemarkName string
|
||||
PYInitial string
|
||||
PYQuanPin string
|
||||
RemarkPYInitial string
|
||||
RemarkPYQuanPin string
|
||||
Signature string
|
||||
MemberCount int
|
||||
MemberList Members
|
||||
OwnerUin int
|
||||
Statues int
|
||||
AttrStatus int
|
||||
Province string
|
||||
City string
|
||||
Alias string
|
||||
UniFriend int
|
||||
DisplayName string
|
||||
ChatRoomId int
|
||||
KeyWord string
|
||||
EncryChatRoomId string
|
||||
IsOwner int
|
||||
Uin int
|
||||
HideInputBarFlag int
|
||||
StarFriend int
|
||||
Sex int
|
||||
AppAccountFlag int
|
||||
VerifyFlag int
|
||||
ContactFlag int
|
||||
WebWxPluginSwitch int
|
||||
HeadImgFlag int
|
||||
SnsFlag int
|
||||
UserName string
|
||||
NickName string
|
||||
HeadImgUrl string
|
||||
RemarkName string
|
||||
PYInitial string
|
||||
PYQuanPin string
|
||||
RemarkPYInitial string
|
||||
RemarkPYQuanPin string
|
||||
Signature string
|
||||
MemberCount int
|
||||
MemberList Members
|
||||
OwnerUin int
|
||||
Statues int
|
||||
AttrStatus int
|
||||
Province string
|
||||
City string
|
||||
Alias string
|
||||
UniFriend int
|
||||
DisplayName string
|
||||
ChatRoomId int
|
||||
KeyWord string
|
||||
EncryChatRoomId string
|
||||
IsOwner int
|
||||
|
||||
Self *Self
|
||||
Self *Self
|
||||
}
|
||||
|
||||
// implement fmt.Stringer
|
||||
func (u *User) String() string {
|
||||
return fmt.Sprintf("<User:%s>", u.NickName)
|
||||
return fmt.Sprintf("<User:%s>", u.NickName)
|
||||
}
|
||||
|
||||
// 获取用户头像
|
||||
func (u *User) GetAvatarResponse() (*http.Response, error) {
|
||||
return u.Self.Bot.Caller.Client.WebWxGetHeadImg(u.HeadImgUrl)
|
||||
return u.Self.Bot.Caller.Client.WebWxGetHeadImg(u.HeadImgUrl)
|
||||
}
|
||||
|
||||
// 下载用户头像
|
||||
func (u *User) SaveAvatar(filename string) error {
|
||||
resp, err := u.GetAvatarResponse()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
buffer := bytes.Buffer{}
|
||||
if _, err := buffer.ReadFrom(resp.Body); err != nil {
|
||||
return err
|
||||
}
|
||||
file, err := os.Create(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
_, err = file.Write(buffer.Bytes())
|
||||
return err
|
||||
resp, err := u.GetAvatarResponse()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
buffer := bytes.Buffer{}
|
||||
if _, err := buffer.ReadFrom(resp.Body); err != nil {
|
||||
return err
|
||||
}
|
||||
file, err := os.Create(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
_, err = file.Write(buffer.Bytes())
|
||||
return err
|
||||
}
|
||||
|
||||
func (u *User) sendMsg(msg *SendMessage) error {
|
||||
msg.FromUserName = u.Self.UserName
|
||||
msg.ToUserName = u.UserName
|
||||
info := u.Self.Bot.storage.LoginInfo
|
||||
request := u.Self.Bot.storage.Request
|
||||
return u.Self.Bot.Caller.WebWxSendMsg(msg, info, request)
|
||||
msg.FromUserName = u.Self.UserName
|
||||
msg.ToUserName = u.UserName
|
||||
info := u.Self.Bot.storage.LoginInfo
|
||||
request := u.Self.Bot.storage.Request
|
||||
return u.Self.Bot.Caller.WebWxSendMsg(msg, info, request)
|
||||
}
|
||||
|
||||
func (u *User) sendText(content string) error {
|
||||
msg := NewTextSendMessage(content, u.Self.UserName, u.UserName)
|
||||
return u.sendMsg(msg)
|
||||
msg := NewTextSendMessage(content, u.Self.UserName, u.UserName)
|
||||
return u.sendMsg(msg)
|
||||
}
|
||||
|
||||
func (u *User) sendImage(file *os.File) error {
|
||||
request := u.Self.Bot.storage.Request
|
||||
info := u.Self.Bot.storage.LoginInfo
|
||||
return u.Self.Bot.Caller.WebWxSendImageMsg(file, request, info, u.Self.UserName, u.UserName)
|
||||
request := u.Self.Bot.storage.Request
|
||||
info := u.Self.Bot.storage.LoginInfo
|
||||
return u.Self.Bot.Caller.WebWxSendImageMsg(file, request, info, u.Self.UserName, u.UserName)
|
||||
}
|
||||
|
||||
func (u *User) setRemarkName(remarkName string) error {
|
||||
request := u.Self.Bot.storage.Request
|
||||
return u.Self.Bot.Caller.WebWxOplog(request, remarkName, u.UserName)
|
||||
request := u.Self.Bot.storage.Request
|
||||
return u.Self.Bot.Caller.WebWxOplog(request, remarkName, u.UserName)
|
||||
}
|
||||
|
||||
// 获取用户的详情
|
||||
func (u *User) Detail() (*User, error) {
|
||||
members := Members{u}
|
||||
request := u.Self.Bot.storage.Request
|
||||
newMembers, err := u.Self.Bot.Caller.WebWxBatchGetContact(members, request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user := newMembers.First()
|
||||
user.Self = u.Self
|
||||
return user, nil
|
||||
members := Members{u}
|
||||
request := u.Self.Bot.storage.Request
|
||||
newMembers, err := u.Self.Bot.Caller.WebWxBatchGetContact(members, request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user := newMembers.First()
|
||||
user.Self = u.Self
|
||||
return user, nil
|
||||
}
|
||||
|
||||
type Self struct {
|
||||
*User
|
||||
Bot *Bot
|
||||
fileHelper *Friend
|
||||
members Members
|
||||
friends Friends
|
||||
groups Groups
|
||||
*User
|
||||
Bot *Bot
|
||||
fileHelper *Friend
|
||||
members Members
|
||||
friends Friends
|
||||
groups Groups
|
||||
}
|
||||
|
||||
// 获取所有的好友、群组、公众号信息
|
||||
func (s *Self) Members(update ...bool) (Members, error) {
|
||||
// 首先判断缓存里有没有,如果没有则去更新缓存
|
||||
if s.members == nil {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return s.members, nil
|
||||
}
|
||||
// 判断是否需要更新,如果传入的参数不为nil,则取最后一个
|
||||
var isUpdate bool
|
||||
if len(update) > 0 {
|
||||
isUpdate = update[len(update)-1]
|
||||
}
|
||||
// 如果需要更新,则直接更新缓存
|
||||
if isUpdate {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return s.members, nil
|
||||
// 首先判断缓存里有没有,如果没有则去更新缓存
|
||||
if s.members == nil {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return s.members, nil
|
||||
}
|
||||
// 判断是否需要更新,如果传入的参数不为nil,则取最后一个
|
||||
var isUpdate bool
|
||||
if len(update) > 0 {
|
||||
isUpdate = update[len(update)-1]
|
||||
}
|
||||
// 如果需要更新,则直接更新缓存
|
||||
if isUpdate {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return s.members, nil
|
||||
}
|
||||
|
||||
// 更新联系人处理
|
||||
func (s *Self) updateMembers() error {
|
||||
info := s.Bot.storage.LoginInfo
|
||||
members, err := s.Bot.Caller.WebWxGetContact(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
members.SetOwner(s)
|
||||
s.members = members
|
||||
return nil
|
||||
info := s.Bot.storage.LoginInfo
|
||||
members, err := s.Bot.Caller.WebWxGetContact(info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
members.SetOwner(s)
|
||||
s.members = members
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取文件传输助手对象,封装成Friend返回
|
||||
func (s *Self) FileHelper() (*Friend, error) {
|
||||
// 如果缓存里有,直接返回,否则去联系人里面找
|
||||
if s.fileHelper != nil {
|
||||
return s.fileHelper, nil
|
||||
}
|
||||
members, err := s.Members()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
users := members.SearchByUserName(1, "filehelper")
|
||||
if users == nil {
|
||||
return nil, noSuchUserFoundError
|
||||
}
|
||||
s.fileHelper = &Friend{users.First()}
|
||||
return s.fileHelper, nil
|
||||
// 如果缓存里有,直接返回,否则去联系人里面找
|
||||
if s.fileHelper != nil {
|
||||
return s.fileHelper, nil
|
||||
}
|
||||
members, err := s.Members()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
users := members.SearchByUserName(1, "filehelper")
|
||||
if users == nil {
|
||||
return nil, noSuchUserFoundError
|
||||
}
|
||||
s.fileHelper = &Friend{users.First()}
|
||||
return s.fileHelper, nil
|
||||
}
|
||||
|
||||
// 获取所有的好友
|
||||
func (s *Self) Friends(update ...bool) (Friends, error) {
|
||||
if s.friends == nil {
|
||||
if err := s.updateFriends(true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return s.friends, nil
|
||||
if s.friends == nil {
|
||||
if err := s.updateFriends(true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return s.friends, nil
|
||||
}
|
||||
|
||||
// 获取所有的群组
|
||||
func (s *Self) Groups(update ...bool) (Groups, error) {
|
||||
if s.groups == nil {
|
||||
if err := s.updateGroups(update...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return s.groups, nil
|
||||
if s.groups == nil {
|
||||
if err := s.updateGroups(update...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return s.groups, nil
|
||||
}
|
||||
|
||||
// 更新好友处理
|
||||
func (s *Self) updateFriends(update ...bool) error {
|
||||
var isUpdate bool
|
||||
if len(update) > 0 {
|
||||
isUpdate = update[len(update)-1]
|
||||
}
|
||||
if isUpdate || s.members == nil {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
var friends Friends
|
||||
for _, member := range s.members {
|
||||
if isFriend(*member) {
|
||||
friend := &Friend{member}
|
||||
friend.Self = s
|
||||
friends = append(friends, friend)
|
||||
}
|
||||
}
|
||||
s.friends = friends
|
||||
return nil
|
||||
var isUpdate bool
|
||||
if len(update) > 0 {
|
||||
isUpdate = update[len(update)-1]
|
||||
}
|
||||
if isUpdate || s.members == nil {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
var friends Friends
|
||||
for _, member := range s.members {
|
||||
if isFriend(*member) {
|
||||
friend := &Friend{member}
|
||||
friend.Self = s
|
||||
friends = append(friends, friend)
|
||||
}
|
||||
}
|
||||
s.friends = friends
|
||||
return nil
|
||||
}
|
||||
|
||||
// 更新群组处理
|
||||
func (s *Self) updateGroups(update ...bool) error {
|
||||
var isUpdate bool
|
||||
if len(update) > 0 {
|
||||
isUpdate = update[len(update)-1]
|
||||
}
|
||||
if isUpdate || s.members == nil {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
var groups Groups
|
||||
for _, member := range s.members {
|
||||
if isGroup(*member) {
|
||||
group := &Group{member}
|
||||
groups = append(groups, group)
|
||||
}
|
||||
}
|
||||
s.groups = groups
|
||||
return nil
|
||||
var isUpdate bool
|
||||
if len(update) > 0 {
|
||||
isUpdate = update[len(update)-1]
|
||||
}
|
||||
if isUpdate || s.members == nil {
|
||||
if err := s.updateMembers(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
var groups Groups
|
||||
for _, member := range s.members {
|
||||
if isGroup(*member) {
|
||||
group := &Group{member}
|
||||
groups = append(groups, group)
|
||||
}
|
||||
}
|
||||
s.groups = groups
|
||||
return nil
|
||||
}
|
||||
|
||||
// 更新所有的联系人信息
|
||||
func (s *Self) UpdateMembersDetail() error {
|
||||
// 先获取所有的联系人
|
||||
members, err := s.Members()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 获取他们的数量
|
||||
count := members.Count()
|
||||
// 一次更新50个,分情况讨论
|
||||
// 先获取所有的联系人
|
||||
members, err := s.Members()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 获取他们的数量
|
||||
count := members.Count()
|
||||
// 一次更新50个,分情况讨论
|
||||
|
||||
// 获取总的需要更新的次数
|
||||
var times int
|
||||
if count < 50 {
|
||||
times = 1
|
||||
} else {
|
||||
times = count / 50
|
||||
}
|
||||
var newMembers Members
|
||||
request := s.Bot.storage.Request
|
||||
var pMembers Members
|
||||
// 分情况依次更新
|
||||
for i := 1; i <= times; i++ {
|
||||
if times == 1 {
|
||||
pMembers = members
|
||||
} else {
|
||||
pMembers = members[(i-1)*50 : i*50]
|
||||
}
|
||||
nMembers, err := s.Bot.Caller.WebWxBatchGetContact(pMembers, request)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newMembers = append(newMembers, nMembers...)
|
||||
}
|
||||
// 最后判断是否全部更新完毕
|
||||
total := times * 50
|
||||
if total < count {
|
||||
// 将全部剩余的更新完毕
|
||||
left := count - total
|
||||
pMembers = members[total : total+left]
|
||||
nMembers, err := s.Bot.Caller.WebWxBatchGetContact(pMembers, request)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newMembers = append(newMembers, nMembers...)
|
||||
}
|
||||
newMembers.SetOwner(s)
|
||||
s.members = newMembers
|
||||
return nil
|
||||
// 获取总的需要更新的次数
|
||||
var times int
|
||||
if count < 50 {
|
||||
times = 1
|
||||
} else {
|
||||
times = count / 50
|
||||
}
|
||||
var newMembers Members
|
||||
request := s.Bot.storage.Request
|
||||
var pMembers Members
|
||||
// 分情况依次更新
|
||||
for i := 1; i <= times; i++ {
|
||||
if times == 1 {
|
||||
pMembers = members
|
||||
} else {
|
||||
pMembers = members[(i-1)*50 : i*50]
|
||||
}
|
||||
nMembers, err := s.Bot.Caller.WebWxBatchGetContact(pMembers, request)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newMembers = append(newMembers, nMembers...)
|
||||
}
|
||||
// 最后判断是否全部更新完毕
|
||||
total := times * 50
|
||||
if total < count {
|
||||
// 将全部剩余的更新完毕
|
||||
left := count - total
|
||||
pMembers = members[total : total+left]
|
||||
nMembers, err := s.Bot.Caller.WebWxBatchGetContact(pMembers, request)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newMembers = append(newMembers, nMembers...)
|
||||
}
|
||||
if len(newMembers) != 0 {
|
||||
newMembers.SetOwner(s)
|
||||
s.members = newMembers
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Members []*User
|
||||
|
||||
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
|
||||
if m.Count() > 0 {
|
||||
u := m[0]
|
||||
return u
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m Members) Last() *User {
|
||||
if m.Count() > 0 {
|
||||
return m[m.Count()-1]
|
||||
}
|
||||
return nil
|
||||
if m.Count() > 0 {
|
||||
u := m[m.Count()-1]
|
||||
return u
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m Members) SetOwner(s *Self) {
|
||||
for _, member := range m {
|
||||
member.Self = s
|
||||
}
|
||||
for _, member := range m {
|
||||
member.Self = s
|
||||
}
|
||||
}
|
||||
|
||||
func (m Members) SearchByUserName(limit int, username string) (results Members) {
|
||||
return m.Search(limit, func(user *User) bool { return user.UserName == username })
|
||||
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 })
|
||||
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 })
|
||||
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 = m.Count()
|
||||
}
|
||||
for _, member := range m {
|
||||
if results.Count() == limit {
|
||||
break
|
||||
}
|
||||
var passCount int
|
||||
for _, condFunc := range condFuncList {
|
||||
if condFunc(member) {
|
||||
passCount++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
if passCount == len(condFuncList) {
|
||||
results = append(results, member)
|
||||
}
|
||||
}
|
||||
return
|
||||
if condFuncList == nil {
|
||||
return m
|
||||
}
|
||||
if limit <= 0 {
|
||||
limit = m.Count()
|
||||
}
|
||||
for _, member := range m {
|
||||
if count := len(results); count == limit {
|
||||
break
|
||||
}
|
||||
var passCount int
|
||||
for _, condFunc := range condFuncList {
|
||||
if condFunc(member) {
|
||||
passCount++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
if passCount == len(condFuncList) {
|
||||
results = append(results, member)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user