Skip to content

Commit

Permalink
Merge pull request #123 from eatmoreapple/update-forward-message
Browse files Browse the repository at this point in the history
优化消息群发逻辑 ⚡
eatmoreapple authored Nov 12, 2022

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
2 parents 5a8e061 + 91f26a5 commit decdc4a
Showing 3 changed files with 196 additions and 108 deletions.
18 changes: 16 additions & 2 deletions message.go
Original file line number Diff line number Diff line change
@@ -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 changes: 55 additions & 87 deletions relations.go
Original file line number Diff line number Diff line change
@@ -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 changes: 125 additions & 19 deletions user.go
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import (
"net/http"
"os"
"strings"
"time"
)

// User 抽象的用户结构: 好友 群组 公众号
@@ -430,51 +431,156 @@ 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 {
case MsgTypeText:
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
}
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
}
return s.forwardMessage(msg, users...)
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 抽象的用户组

0 comments on commit decdc4a

Please sign in to comment.