优化消息群发逻辑 ⚡
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 转发该消息给好友
|
||||
// 该方法会阻塞直到所有好友都接收到消息
|
||||
// 这里为了兼容以前的版本,默认休眠0.5秒,如果需要更快的速度,可以使用 SentMessage.ForwardToFriendsWithDelay
|
||||
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 转发该消息给群组
|
||||
// 该方法会阻塞直到所有群组都接收到消息
|
||||
// 这里为了兼容以前的版本,默认休眠0.5秒,如果需要更快的速度,可以使用 SentMessage.ForwardToGroupsDelay
|
||||
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 {
|
||||
|
142
relations.go
142
relations.go
@ -104,69 +104,42 @@ func (f Friends) AsMembers() Members {
|
||||
}
|
||||
|
||||
// SendText 向slice的好友依次发送文本消息
|
||||
func (f Friends) SendText(text string, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
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
|
||||
}
|
||||
func (f Friends) SendText(text string, delays ...time.Duration) error {
|
||||
if f.Count() == 0 {
|
||||
return nil
|
||||
}
|
||||
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的好友依次发送图片消息
|
||||
func (f Friends) SendImage(file *os.File, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
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
|
||||
}
|
||||
func (f Friends) SendImage(file *os.File, delays ...time.Duration) error {
|
||||
if f.Count() == 0 {
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
var delay time.Duration
|
||||
if len(delays) > 0 {
|
||||
delay = delays[0]
|
||||
}
|
||||
self := f.First().Self
|
||||
return self.SendImageToFriends(file, delay, f...)
|
||||
}
|
||||
|
||||
// SendFile 群发文件
|
||||
func (f Friends) SendFile(file *os.File, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
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
|
||||
}
|
||||
if f.Count() == 0 {
|
||||
return nil
|
||||
}
|
||||
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 }
|
||||
@ -247,46 +220,41 @@ func (g Groups) Last() *Group {
|
||||
|
||||
// SendText 向群组依次发送文本消息, 支持发送延迟
|
||||
func (g Groups) SendText(text string, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
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
|
||||
}
|
||||
if g.Count() == 0 {
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
var d time.Duration
|
||||
if len(delay) > 0 {
|
||||
d = delay[0]
|
||||
}
|
||||
self := g.First().Self
|
||||
return self.SendTextToGroups(text, d, g...)
|
||||
}
|
||||
|
||||
// SendImage 向群组依次发送图片消息, 支持发送延迟
|
||||
func (g Groups) SendImage(file *os.File, delay ...time.Duration) error {
|
||||
total := getTotalDuration(delay...)
|
||||
var (
|
||||
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
|
||||
}
|
||||
if g.Count() == 0 {
|
||||
return nil
|
||||
}
|
||||
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 根据用户名查找群组
|
||||
|
144
user.go
144
user.go
@ -7,6 +7,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 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
|
||||
req := s.Bot.Storage.Request
|
||||
switch msg.Type {
|
||||
@ -438,43 +439,148 @@ func (s *Self) forwardMessage(msg *SentMessage, users ...*User) error {
|
||||
for _, user := range users {
|
||||
msg.FromUserName = s.UserName
|
||||
msg.ToUserName = user.UserName
|
||||
_, err := s.Self.Bot.Caller.WebWxSendMsg(msg.SendMessage, info, req)
|
||||
return err
|
||||
if _, err := s.Self.Bot.Caller.WebWxSendMsg(msg.SendMessage, info, req); err != nil {
|
||||
return err
|
||||
}
|
||||
time.Sleep(delay)
|
||||
}
|
||||
case MsgTypeImage:
|
||||
for _, user := range users {
|
||||
msg.FromUserName = s.UserName
|
||||
msg.ToUserName = user.UserName
|
||||
_, err := s.Self.Bot.Caller.Client.WebWxSendMsgImg(msg.SendMessage, req, info)
|
||||
return err
|
||||
if _, err := s.Self.Bot.Caller.Client.WebWxSendMsgImg(msg.SendMessage, req, info); err != nil {
|
||||
return err
|
||||
}
|
||||
time.Sleep(delay)
|
||||
}
|
||||
case AppMessage:
|
||||
for _, user := range users {
|
||||
msg.FromUserName = s.UserName
|
||||
msg.ToUserName = user.UserName
|
||||
_, err := s.Self.Bot.Caller.Client.WebWxSendAppMsg(msg.SendMessage, req)
|
||||
return err
|
||||
if _, err := s.Self.Bot.Caller.Client.WebWxSendAppMsg(msg.SendMessage, req); err != nil {
|
||||
return err
|
||||
}
|
||||
time.Sleep(delay)
|
||||
}
|
||||
default:
|
||||
return fmt.Errorf("unsupported message type: %s", msg.Type)
|
||||
}
|
||||
return errors.New("unsupport message")
|
||||
return nil
|
||||
}
|
||||
|
||||
// ForwardMessageToFriends 转发给好友
|
||||
func (s *Self) ForwardMessageToFriends(msg *SentMessage, friends ...*Friend) error {
|
||||
var users = make([]*User, len(friends))
|
||||
for index, friend := range friends {
|
||||
users[index] = friend.User
|
||||
}
|
||||
return s.forwardMessage(msg, users...)
|
||||
func (s *Self) ForwardMessageToFriends(msg *SentMessage, delay time.Duration, friends ...*Friend) error {
|
||||
members := Friends(friends).AsMembers()
|
||||
return s.forwardMessage(msg, delay, members...)
|
||||
}
|
||||
|
||||
// ForwardMessageToGroups 转发给群组
|
||||
func (s *Self) ForwardMessageToGroups(msg *SentMessage, groups ...*Group) error {
|
||||
var users = make([]*User, len(groups))
|
||||
for index, group := range groups {
|
||||
users[index] = group.User
|
||||
func (s *Self) ForwardMessageToGroups(msg *SentMessage, delay time.Duration, groups ...*Group) error {
|
||||
members := Groups(groups).AsMembers()
|
||||
return s.forwardMessage(msg, delay, members...)
|
||||
}
|
||||
|
||||
// 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 抽象的用户组
|
||||
|
Loading…
x
Reference in New Issue
Block a user