优化消息群发逻辑 ⚡
This commit is contained in:
parent
5a8e0611dd
commit
91f26a5f64
18
message.go
18
message.go
@ -601,13 +601,27 @@ func (s *SentMessage) CanRevoke() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ForwardToFriends 转发该消息给好友
|
// ForwardToFriends 转发该消息给好友
|
||||||
|
// 该方法会阻塞直到所有好友都接收到消息
|
||||||
|
// 这里为了兼容以前的版本,默认休眠0.5秒,如果需要更快的速度,可以使用 SentMessage.ForwardToFriendsWithDelay
|
||||||
func (s *SentMessage) ForwardToFriends(friends ...*Friend) error {
|
func (s *SentMessage) ForwardToFriends(friends ...*Friend) error {
|
||||||
return s.Self.ForwardMessageToFriends(s, friends...)
|
return s.ForwardToFriendsWithDelay(time.Second/2, friends...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ForwardToFriendsWithDelay 转发该消息给好友,延迟指定时间
|
||||||
|
func (s *SentMessage) ForwardToFriendsWithDelay(delay time.Duration, friends ...*Friend) error {
|
||||||
|
return s.Self.ForwardMessageToFriends(s, delay, friends...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForwardToGroups 转发该消息给群组
|
// ForwardToGroups 转发该消息给群组
|
||||||
|
// 该方法会阻塞直到所有群组都接收到消息
|
||||||
|
// 这里为了兼容以前的版本,默认休眠0.5秒,如果需要更快的速度,可以使用 SentMessage.ForwardToGroupsDelay
|
||||||
func (s *SentMessage) ForwardToGroups(groups ...*Group) error {
|
func (s *SentMessage) ForwardToGroups(groups ...*Group) error {
|
||||||
return s.Self.ForwardMessageToGroups(s, groups...)
|
return s.ForwardToGroupsWithDelay(time.Second/2, groups...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ForwardToGroupsWithDelay 转发该消息给群组, 延迟指定时间
|
||||||
|
func (s *SentMessage) ForwardToGroupsWithDelay(delay time.Duration, groups ...*Group) error {
|
||||||
|
return s.Self.ForwardMessageToGroups(s, delay, groups...)
|
||||||
}
|
}
|
||||||
|
|
||||||
type appmsg struct {
|
type appmsg struct {
|
||||||
|
142
relations.go
142
relations.go
@ -104,69 +104,42 @@ func (f Friends) AsMembers() Members {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendText 向slice的好友依次发送文本消息
|
// SendText 向slice的好友依次发送文本消息
|
||||||
func (f Friends) SendText(text string, delay ...time.Duration) error {
|
func (f Friends) SendText(text string, delays ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
if f.Count() == 0 {
|
||||||
var (
|
return nil
|
||||||
sentMessage *SentMessage
|
|
||||||
err error
|
|
||||||
self *Self
|
|
||||||
)
|
|
||||||
for _, friend := range f {
|
|
||||||
self = friend.Self
|
|
||||||
time.Sleep(total)
|
|
||||||
if sentMessage != nil {
|
|
||||||
err = self.ForwardMessageToFriends(sentMessage, f...)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if sentMessage, err = friend.SendText(text); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
var delay time.Duration
|
||||||
|
if len(delays) > 0 {
|
||||||
|
delay = delays[0]
|
||||||
|
}
|
||||||
|
self := f.First().Self
|
||||||
|
return self.SendTextToFriends(text, delay, f...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendImage 向slice的好友依次发送图片消息
|
// SendImage 向slice的好友依次发送图片消息
|
||||||
func (f Friends) SendImage(file *os.File, delay ...time.Duration) error {
|
func (f Friends) SendImage(file *os.File, delays ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
if f.Count() == 0 {
|
||||||
var (
|
return nil
|
||||||
sentMessage *SentMessage
|
|
||||||
err error
|
|
||||||
self *Self
|
|
||||||
)
|
|
||||||
for _, friend := range f {
|
|
||||||
self = friend.Self
|
|
||||||
time.Sleep(total)
|
|
||||||
if sentMessage != nil {
|
|
||||||
err = self.ForwardMessageToFriends(sentMessage, f...)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if sentMessage, err = friend.SendImage(file); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
var delay time.Duration
|
||||||
|
if len(delays) > 0 {
|
||||||
|
delay = delays[0]
|
||||||
|
}
|
||||||
|
self := f.First().Self
|
||||||
|
return self.SendImageToFriends(file, delay, f...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendFile 群发文件
|
// SendFile 群发文件
|
||||||
func (f Friends) SendFile(file *os.File, delay ...time.Duration) error {
|
func (f Friends) SendFile(file *os.File, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
if f.Count() == 0 {
|
||||||
var (
|
return nil
|
||||||
sentMessage *SentMessage
|
|
||||||
err error
|
|
||||||
self *Self
|
|
||||||
)
|
|
||||||
for _, friend := range f {
|
|
||||||
self = friend.Self
|
|
||||||
time.Sleep(total)
|
|
||||||
if sentMessage != nil {
|
|
||||||
err = self.ForwardMessageToFriends(sentMessage, f...)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if sentMessage, err = friend.SendFile(file); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
var d time.Duration
|
||||||
|
if len(delay) > 0 {
|
||||||
|
d = delay[0]
|
||||||
|
}
|
||||||
|
self := f.First().Self
|
||||||
|
return self.SendFileToFriends(file, d, f...)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Group struct{ *User }
|
type Group struct{ *User }
|
||||||
@ -247,46 +220,41 @@ func (g Groups) Last() *Group {
|
|||||||
|
|
||||||
// SendText 向群组依次发送文本消息, 支持发送延迟
|
// SendText 向群组依次发送文本消息, 支持发送延迟
|
||||||
func (g Groups) SendText(text string, delay ...time.Duration) error {
|
func (g Groups) SendText(text string, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
if g.Count() == 0 {
|
||||||
var (
|
return nil
|
||||||
sentMessage *SentMessage
|
|
||||||
err error
|
|
||||||
self *Self
|
|
||||||
)
|
|
||||||
for _, group := range g {
|
|
||||||
self = group.Self
|
|
||||||
time.Sleep(total)
|
|
||||||
if sentMessage != nil {
|
|
||||||
err = self.ForwardMessageToGroups(sentMessage, g...)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if sentMessage, err = group.SendText(text); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
var d time.Duration
|
||||||
|
if len(delay) > 0 {
|
||||||
|
d = delay[0]
|
||||||
|
}
|
||||||
|
self := g.First().Self
|
||||||
|
return self.SendTextToGroups(text, d, g...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendImage 向群组依次发送图片消息, 支持发送延迟
|
// SendImage 向群组依次发送图片消息, 支持发送延迟
|
||||||
func (g Groups) SendImage(file *os.File, delay ...time.Duration) error {
|
func (g Groups) SendImage(file *os.File, delay ...time.Duration) error {
|
||||||
total := getTotalDuration(delay...)
|
if g.Count() == 0 {
|
||||||
var (
|
return nil
|
||||||
sentMessage *SentMessage
|
|
||||||
err error
|
|
||||||
self *Self
|
|
||||||
)
|
|
||||||
for _, group := range g {
|
|
||||||
self = group.Self
|
|
||||||
time.Sleep(total)
|
|
||||||
if sentMessage != nil {
|
|
||||||
err = self.ForwardMessageToGroups(sentMessage, g...)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if sentMessage, err = group.SendImage(file); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
var d time.Duration
|
||||||
|
if len(delay) > 0 {
|
||||||
|
d = delay[0]
|
||||||
|
}
|
||||||
|
self := g.First().Self
|
||||||
|
return self.SendImageToGroups(file, d, g...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendFile 向群组依次发送文件消息, 支持发送延迟
|
||||||
|
func (g Groups) SendFile(file *os.File, delay ...time.Duration) error {
|
||||||
|
if g.Count() == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var d time.Duration
|
||||||
|
if len(delay) > 0 {
|
||||||
|
d = delay[0]
|
||||||
|
}
|
||||||
|
self := g.First().Self
|
||||||
|
return self.SendFileToGroups(file, d, g...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchByUserName 根据用户名查找群组
|
// SearchByUserName 根据用户名查找群组
|
||||||
|
144
user.go
144
user.go
@ -7,6 +7,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// User 抽象的用户结构: 好友 群组 公众号
|
// User 抽象的用户结构: 好友 群组 公众号
|
||||||
@ -430,7 +431,7 @@ func (s *Self) RevokeMessage(msg *SentMessage) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 转发消息接口
|
// 转发消息接口
|
||||||
func (s *Self) forwardMessage(msg *SentMessage, users ...*User) error {
|
func (s *Self) forwardMessage(msg *SentMessage, delay time.Duration, users ...*User) error {
|
||||||
info := s.Bot.Storage.LoginInfo
|
info := s.Bot.Storage.LoginInfo
|
||||||
req := s.Bot.Storage.Request
|
req := s.Bot.Storage.Request
|
||||||
switch msg.Type {
|
switch msg.Type {
|
||||||
@ -438,43 +439,148 @@ func (s *Self) forwardMessage(msg *SentMessage, users ...*User) error {
|
|||||||
for _, user := range users {
|
for _, user := range users {
|
||||||
msg.FromUserName = s.UserName
|
msg.FromUserName = s.UserName
|
||||||
msg.ToUserName = user.UserName
|
msg.ToUserName = user.UserName
|
||||||
_, err := s.Self.Bot.Caller.WebWxSendMsg(msg.SendMessage, info, req)
|
if _, err := s.Self.Bot.Caller.WebWxSendMsg(msg.SendMessage, info, req); err != nil {
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(delay)
|
||||||
}
|
}
|
||||||
case MsgTypeImage:
|
case MsgTypeImage:
|
||||||
for _, user := range users {
|
for _, user := range users {
|
||||||
msg.FromUserName = s.UserName
|
msg.FromUserName = s.UserName
|
||||||
msg.ToUserName = user.UserName
|
msg.ToUserName = user.UserName
|
||||||
_, err := s.Self.Bot.Caller.Client.WebWxSendMsgImg(msg.SendMessage, req, info)
|
if _, err := s.Self.Bot.Caller.Client.WebWxSendMsgImg(msg.SendMessage, req, info); err != nil {
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(delay)
|
||||||
}
|
}
|
||||||
case AppMessage:
|
case AppMessage:
|
||||||
for _, user := range users {
|
for _, user := range users {
|
||||||
msg.FromUserName = s.UserName
|
msg.FromUserName = s.UserName
|
||||||
msg.ToUserName = user.UserName
|
msg.ToUserName = user.UserName
|
||||||
_, err := s.Self.Bot.Caller.Client.WebWxSendAppMsg(msg.SendMessage, req)
|
if _, err := s.Self.Bot.Caller.Client.WebWxSendAppMsg(msg.SendMessage, req); err != nil {
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(delay)
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported message type: %s", msg.Type)
|
||||||
}
|
}
|
||||||
return errors.New("unsupport message")
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForwardMessageToFriends 转发给好友
|
// ForwardMessageToFriends 转发给好友
|
||||||
func (s *Self) ForwardMessageToFriends(msg *SentMessage, friends ...*Friend) error {
|
func (s *Self) ForwardMessageToFriends(msg *SentMessage, delay time.Duration, friends ...*Friend) error {
|
||||||
var users = make([]*User, len(friends))
|
members := Friends(friends).AsMembers()
|
||||||
for index, friend := range friends {
|
return s.forwardMessage(msg, delay, members...)
|
||||||
users[index] = friend.User
|
|
||||||
}
|
|
||||||
return s.forwardMessage(msg, users...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForwardMessageToGroups 转发给群组
|
// ForwardMessageToGroups 转发给群组
|
||||||
func (s *Self) ForwardMessageToGroups(msg *SentMessage, groups ...*Group) error {
|
func (s *Self) ForwardMessageToGroups(msg *SentMessage, delay time.Duration, groups ...*Group) error {
|
||||||
var users = make([]*User, len(groups))
|
members := Groups(groups).AsMembers()
|
||||||
for index, group := range groups {
|
return s.forwardMessage(msg, delay, members...)
|
||||||
users[index] = group.User
|
}
|
||||||
|
|
||||||
|
// sendTextToMembers 发送文本消息给群组或者好友
|
||||||
|
func (s *Self) sendTextToMembers(text string, delay time.Duration, members ...*User) error {
|
||||||
|
if len(members) == 0 {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
return s.forwardMessage(msg, users...)
|
user := members[0]
|
||||||
|
msg, err := s.sendTextToUser(user, text)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(delay)
|
||||||
|
return s.forwardMessage(msg, delay, members[1:]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sendImageToMembers 发送图片消息给群组或者好友
|
||||||
|
func (s *Self) sendImageToMembers(img *os.File, delay time.Duration, members ...*User) error {
|
||||||
|
if len(members) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
user := members[0]
|
||||||
|
msg, err := s.sendImageToUser(user, img)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(delay)
|
||||||
|
return s.forwardMessage(msg, delay, members[1:]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sendVideoToMembers 发送视频消息给群组或者好友
|
||||||
|
func (s *Self) sendVideoToMembers(video *os.File, delay time.Duration, members ...*User) error {
|
||||||
|
if len(members) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
user := members[0]
|
||||||
|
msg, err := s.sendVideoToUser(user, video)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(delay)
|
||||||
|
return s.forwardMessage(msg, delay, members[1:]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Self) sendFileToMembers(file *os.File, delay time.Duration, members ...*User) error {
|
||||||
|
if len(members) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
user := members[0]
|
||||||
|
msg, err := s.sendFileToUser(user, file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(delay)
|
||||||
|
return s.forwardMessage(msg, delay, members[1:]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendTextToFriends 发送文本消息给好友
|
||||||
|
func (s *Self) SendTextToFriends(text string, delay time.Duration, friends ...*Friend) error {
|
||||||
|
members := Friends(friends).AsMembers()
|
||||||
|
return s.sendTextToMembers(text, delay, members...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendImageToFriends 发送图片消息给好友
|
||||||
|
func (s *Self) SendImageToFriends(img *os.File, delay time.Duration, friends ...*Friend) error {
|
||||||
|
members := Friends(friends).AsMembers()
|
||||||
|
return s.sendImageToMembers(img, delay, members...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendFileToFriends 发送文件给好友
|
||||||
|
func (s *Self) SendFileToFriends(file *os.File, delay time.Duration, friends ...*Friend) error {
|
||||||
|
members := Friends(friends).AsMembers()
|
||||||
|
return s.sendFileToMembers(file, delay, members...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendVideoToFriends 发送视频给好友
|
||||||
|
func (s *Self) SendVideoToFriends(video *os.File, delay time.Duration, friends ...*Friend) error {
|
||||||
|
members := Friends(friends).AsMembers()
|
||||||
|
return s.sendVideoToMembers(video, delay, members...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendTextToGroups 发送文本消息给群组
|
||||||
|
func (s *Self) SendTextToGroups(text string, delay time.Duration, groups ...*Group) error {
|
||||||
|
members := Groups(groups).AsMembers()
|
||||||
|
return s.sendTextToMembers(text, delay, members...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendImageToGroups 发送图片消息给群组
|
||||||
|
func (s *Self) SendImageToGroups(img *os.File, delay time.Duration, groups ...*Group) error {
|
||||||
|
members := Groups(groups).AsMembers()
|
||||||
|
return s.sendImageToMembers(img, delay, members...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendFileToGroups 发送文件给群组
|
||||||
|
func (s *Self) SendFileToGroups(file *os.File, delay time.Duration, groups ...*Group) error {
|
||||||
|
members := Groups(groups).AsMembers()
|
||||||
|
return s.sendFileToMembers(file, delay, members...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendVideoToGroups 发送视频给群组
|
||||||
|
func (s *Self) SendVideoToGroups(video *os.File, delay time.Duration, groups ...*Group) error {
|
||||||
|
members := Groups(groups).AsMembers()
|
||||||
|
return s.sendVideoToMembers(video, delay, members...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Members 抽象的用户组
|
// Members 抽象的用户组
|
||||||
|
Loading…
x
Reference in New Issue
Block a user