diff --git a/message.go b/message.go index fbedc72..09279f1 100644 --- a/message.go +++ b/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 { diff --git a/relations.go b/relations.go index 17a89b9..f7c2d84 100644 --- a/relations.go +++ b/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 根据用户名查找群组 diff --git a/user.go b/user.go index 691c644..e57da6c 100644 --- a/user.go +++ b/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 抽象的用户组