diff --git a/bot.go b/bot.go index 8c65df7..4864407 100644 --- a/bot.go +++ b/bot.go @@ -223,9 +223,9 @@ func (b *Bot) WebInit() error { return err } // 设置当前的用户 - b.self = &Self{Bot: b, User: &resp.User} + b.self = &Self{bot: b, User: &resp.User} b.self.formatEmoji() - b.self.Self = b.self + b.self.self = b.self b.Storage.Response = resp // 通知手机客户端已经登录 diff --git a/client.go b/client.go index fc464d3..702f765 100644 --- a/client.go +++ b/client.go @@ -278,7 +278,7 @@ func (c *Client) WebWxGetHeadImg(user *User) (*http.Response, error) { } else { params := url.Values{} params.Add("username", user.UserName) - params.Add("skey", user.Self.Bot.Storage.Request.Skey) + params.Add("skey", user.self.bot.Storage.Request.Skey) params.Add("type", "big") params.Add("chatroomid", user.EncryChatRoomId) params.Add("seq", "0") diff --git a/message.go b/message.go index 8194e50..6d358c3 100644 --- a/message.go +++ b/message.go @@ -71,7 +71,7 @@ func (m *Message) Sender() (*User, error) { user, exist := members.GetByUserName(m.FromUserName) if !exist { // 找不到, 从服务器获取 - user = &User{Self: m.bot.self, UserName: m.FromUserName} + user = &User{self: m.bot.self, UserName: m.FromUserName} err = user.Detail() } if m.IsSendByGroup() && len(user.MemberList) == 0 { @@ -629,13 +629,13 @@ type RevokeMsg struct { // SentMessage 已发送的信息 type SentMessage struct { *SendMessage - Self *Self + self *Self MsgId string } // Revoke 撤回该消息 func (s *SentMessage) Revoke() error { - return s.Self.RevokeMessage(s) + return s.self.RevokeMessage(s) } // CanRevoke 是否可以撤回该消息 @@ -657,7 +657,7 @@ func (s *SentMessage) ForwardToFriends(friends ...*Friend) error { // ForwardToFriendsWithDelay 转发该消息给好友,延迟指定时间 func (s *SentMessage) ForwardToFriendsWithDelay(delay time.Duration, friends ...*Friend) error { - return s.Self.ForwardMessageToFriends(s, delay, friends...) + return s.self.ForwardMessageToFriends(s, delay, friends...) } // ForwardToGroups 转发该消息给群组 @@ -669,7 +669,7 @@ func (s *SentMessage) ForwardToGroups(groups ...*Group) error { // ForwardToGroupsWithDelay 转发该消息给群组, 延迟指定时间 func (s *SentMessage) ForwardToGroupsWithDelay(delay time.Duration, groups ...*Group) error { - return s.Self.ForwardMessageToGroups(s, delay, groups...) + return s.self.ForwardMessageToGroups(s, delay, groups...) } type appmsg struct { diff --git a/relations.go b/relations.go index 1240836..c29124e 100644 --- a/relations.go +++ b/relations.go @@ -15,32 +15,32 @@ func (f Friend) String() string { // SetRemarkName 重命名当前好友 func (f *Friend) SetRemarkName(name string) error { - return f.Self.SetRemarkNameToFriend(f, name) + return f.self.SetRemarkNameToFriend(f, name) } // SendText 发送文本消息 func (f *Friend) SendText(content string) (*SentMessage, error) { - return f.Self.SendTextToFriend(f, content) + return f.self.SendTextToFriend(f, content) } // SendImage 发送图片消息 func (f *Friend) SendImage(file *os.File) (*SentMessage, error) { - return f.Self.SendImageToFriend(f, file) + return f.self.SendImageToFriend(f, file) } // SendVideo 发送视频消息 func (f *Friend) SendVideo(file *os.File) (*SentMessage, error) { - return f.Self.SendVideoToFriend(f, file) + return f.self.SendVideoToFriend(f, file) } // SendFile 发送文件消息 func (f *Friend) SendFile(file *os.File) (*SentMessage, error) { - return f.Self.SendFileToFriend(f, file) + return f.self.SendFileToFriend(f, file) } // AddIntoGroup 拉该好友入群 func (f *Friend) AddIntoGroup(groups ...*Group) error { - return f.Self.AddFriendIntoManyGroups(f, groups...) + return f.self.AddFriendIntoManyGroups(f, groups...) } type Friends []*Friend @@ -112,7 +112,7 @@ func (f Friends) SendText(text string, delays ...time.Duration) error { if len(delays) > 0 { delay = delays[0] } - self := f.First().Self + self := f.First().self return self.SendTextToFriends(text, delay, f...) } @@ -125,7 +125,7 @@ func (f Friends) SendImage(file *os.File, delays ...time.Duration) error { if len(delays) > 0 { delay = delays[0] } - self := f.First().Self + self := f.First().self return self.SendImageToFriends(file, delay, f...) } @@ -138,7 +138,7 @@ func (f Friends) SendFile(file *os.File, delay ...time.Duration) error { if len(delay) > 0 { d = delay[0] } - self := f.First().Self + self := f.First().self return self.SendFileToFriends(file, d, f...) } @@ -151,22 +151,22 @@ func (g Group) String() string { // SendText 发行文本消息给当前的群组 func (g *Group) SendText(content string) (*SentMessage, error) { - return g.Self.SendTextToGroup(g, content) + return g.self.SendTextToGroup(g, content) } // SendImage 发行图片消息给当前的群组 func (g *Group) SendImage(file *os.File) (*SentMessage, error) { - return g.Self.SendImageToGroup(g, file) + return g.self.SendImageToGroup(g, file) } // SendVideo 发行视频消息给当前的群组 func (g *Group) SendVideo(file *os.File) (*SentMessage, error) { - return g.Self.SendVideoToGroup(g, file) + return g.self.SendVideoToGroup(g, file) } // SendFile 发送文件给当前的群组 func (g *Group) SendFile(file *os.File) (*SentMessage, error) { - return g.Self.SendFileToGroup(g, file) + return g.self.SendFileToGroup(g, file) } // Members 获取所有的群成员 @@ -174,25 +174,25 @@ func (g *Group) Members() (Members, error) { if err := g.Detail(); err != nil { return nil, err } - g.MemberList.init(g.Self) + g.MemberList.init(g.self) return g.MemberList, nil } // AddFriendsIn 拉好友入群 func (g *Group) AddFriendsIn(friends ...*Friend) error { - return g.Self.AddFriendsIntoGroup(g, friends...) + return g.self.AddFriendsIntoGroup(g, friends...) } // RemoveMembers 从群聊中移除用户 // Deprecated // 无论是网页版,还是程序上都不起作用 func (g *Group) RemoveMembers(members Members) error { - return g.Self.RemoveMemberFromGroup(g, members) + return g.self.RemoveMemberFromGroup(g, members) } // Rename 群组重命名 func (g *Group) Rename(name string) error { - return g.Self.RenameGroup(g, name) + return g.self.RenameGroup(g, name) } // SearchMemberByUsername 根据用户名查找群成员 @@ -249,7 +249,7 @@ func (g Groups) SendText(text string, delay ...time.Duration) error { if len(delay) > 0 { d = delay[0] } - self := g.First().Self + self := g.First().self return self.SendTextToGroups(text, d, g...) } @@ -262,7 +262,7 @@ func (g Groups) SendImage(file *os.File, delay ...time.Duration) error { if len(delay) > 0 { d = delay[0] } - self := g.First().Self + self := g.First().self return self.SendImageToGroups(file, d, g...) } @@ -275,7 +275,7 @@ func (g Groups) SendFile(file *os.File, delay ...time.Duration) error { if len(delay) > 0 { d = delay[0] } - self := g.First().Self + self := g.First().self return self.SendFileToGroups(file, d, g...) } @@ -381,17 +381,17 @@ func (m Mps) SearchByNickName(limit int, nickName string) (results Mps) { // SendText 发送文本消息给公众号 func (m *Mp) SendText(content string) (*SentMessage, error) { - return m.Self.SendTextToMp(m, content) + return m.self.SendTextToMp(m, content) } // SendImage 发送图片消息给公众号 func (m *Mp) SendImage(file *os.File) (*SentMessage, error) { - return m.Self.SendImageToMp(m, file) + return m.self.SendImageToMp(m, file) } // SendFile 发送文件消息给公众号 func (m *Mp) SendFile(file *os.File) (*SentMessage, error) { - return m.Self.SendFileToMp(m, file) + return m.self.SendFileToMp(m, file) } // GetByUsername 根据username查询一个Friend diff --git a/user.go b/user.go index 669d953..d54d5c9 100644 --- a/user.go +++ b/user.go @@ -49,7 +49,7 @@ type User struct { MemberList Members - Self *Self `json:"-"` + self *Self } // implement fmt.Stringer @@ -60,7 +60,7 @@ func (u *User) String() string { // GetAvatarResponse 获取用户头像 func (u *User) GetAvatarResponse() (resp *http.Response, err error) { for i := 0; i < 3; i++ { - resp, err = u.Self.Bot.Caller.Client.WebWxGetHeadImg(u) + resp, err = u.self.bot.Caller.Client.WebWxGetHeadImg(u) if err != nil { return nil, err } @@ -99,19 +99,19 @@ func (u *User) SaveAvatarWithWriter(writer io.Writer) error { // Detail 获取用户的详情 func (u *User) Detail() error { - if u.UserName == u.Self.UserName { + if u.UserName == u.self.UserName { return nil } members := Members{u} - request := u.Self.Bot.Storage.Request - newMembers, err := u.Self.Bot.Caller.WebWxBatchGetContact(members, request) + request := u.self.bot.Storage.Request + newMembers, err := u.self.bot.Caller.WebWxBatchGetContact(members, request) if err != nil { return err } - newMembers.init(u.Self) + newMembers.init(u.self) user := newMembers.First() *u = *user - u.MemberList.init(u.Self) + u.MemberList.init(u.self) return nil } @@ -132,14 +132,14 @@ func (u *User) IsMP() bool { // Pin 将联系人置顶 func (u *User) Pin() error { - req := u.Self.Bot.Storage.Request - return u.Self.Bot.Caller.WebWxRelationPin(req, u, 1) + req := u.self.bot.Storage.Request + return u.self.bot.Caller.WebWxRelationPin(req, u, 1) } // UnPin 将联系人取消置顶 func (u *User) UnPin() error { - req := u.Self.Bot.Storage.Request - return u.Self.Bot.Caller.WebWxRelationPin(req, u, 0) + req := u.self.bot.Storage.Request + return u.self.bot.Caller.WebWxRelationPin(req, u, 0) } // IsPin 判断当前联系人(好友、群组、公众号)是否为置顶状态 @@ -170,6 +170,16 @@ func (u *User) ID() string { return "" } +// Self 返回当前用户 +func (u *User) Self() *Self { + return u.self +} + +// IsSelf 判断是否为当前用户 +func (u *User) IsSelf() bool { + return u.UserName == u.Self().UserName +} + // 格式化emoji表情 func (u *User) formatEmoji() { u.NickName = FormatEmoji(u.NickName) @@ -180,7 +190,7 @@ func (u *User) formatEmoji() { // Self 自己,当前登录用户对象 type Self struct { *User - Bot *Bot + bot *Bot fileHelper *Friend members Members friends Friends @@ -202,8 +212,8 @@ func (s *Self) Members(update ...bool) (Members, error) { // 更新联系人处理 func (s *Self) updateMembers() error { - info := s.Bot.Storage.LoginInfo - members, err := s.Bot.Caller.WebWxGetContact(info) + info := s.bot.Storage.LoginInfo + members, err := s.bot.Caller.WebWxGetContact(info) if err != nil { return err } @@ -269,30 +279,30 @@ func (s *Self) sendTextToUser(user *User, text string) (*SentMessage, error) { msg := NewTextSendMessage(text, s.UserName, user.UserName) msg.FromUserName = s.UserName msg.ToUserName = user.UserName - info := s.Bot.Storage.LoginInfo - request := s.Bot.Storage.Request - sentMessage, err := s.Bot.Caller.WebWxSendMsg(msg, info, request) + info := s.bot.Storage.LoginInfo + request := s.bot.Storage.Request + sentMessage, err := s.bot.Caller.WebWxSendMsg(msg, info, request) return s.sendMessageWrapper(sentMessage, err) } func (s *Self) sendImageToUser(user *User, file *os.File) (*SentMessage, error) { - req := s.Bot.Storage.Request - info := s.Bot.Storage.LoginInfo - sentMessage, err := s.Bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, user.UserName) + req := s.bot.Storage.Request + info := s.bot.Storage.LoginInfo + sentMessage, err := s.bot.Caller.WebWxSendImageMsg(file, req, info, s.UserName, user.UserName) return s.sendMessageWrapper(sentMessage, err) } func (s *Self) sendVideoToUser(user *User, file *os.File) (*SentMessage, error) { - req := s.Bot.Storage.Request - info := s.Bot.Storage.LoginInfo - sentMessage, err := s.Bot.Caller.WebWxSendVideoMsg(file, req, info, s.UserName, user.UserName) + req := s.bot.Storage.Request + info := s.bot.Storage.LoginInfo + sentMessage, err := s.bot.Caller.WebWxSendVideoMsg(file, req, info, s.UserName, user.UserName) return s.sendMessageWrapper(sentMessage, err) } func (s *Self) sendFileToUser(user *User, file *os.File) (*SentMessage, error) { - req := s.Bot.Storage.Request - info := s.Bot.Storage.LoginInfo - sentMessage, err := s.Bot.Caller.WebWxSendFile(file, req, info, s.UserName, user.UserName) + req := s.bot.Storage.Request + info := s.bot.Storage.LoginInfo + sentMessage, err := s.bot.Caller.WebWxSendFile(file, req, info, s.UserName, user.UserName) return s.sendMessageWrapper(sentMessage, err) } @@ -320,8 +330,8 @@ func (s *Self) SendFileToFriend(friend *Friend, file *os.File) (*SentMessage, er // // self.SetRemarkNameToFriend(friend, "remark") // or friend.SetRemarkName("remark") func (s *Self) SetRemarkNameToFriend(friend *Friend, remarkName string) error { - req := s.Bot.Storage.Request - return s.Bot.Caller.WebWxOplog(req, remarkName, friend.UserName) + req := s.bot.Storage.Request + return s.bot.Caller.WebWxOplog(req, remarkName, friend.UserName) } // CreateGroup 创建群聊 @@ -331,13 +341,13 @@ func (s *Self) CreateGroup(topic string, friends ...*Friend) (*Group, error) { if len(friends) < 2 { return nil, errors.New("a group must be at least 2 members") } - req := s.Bot.Storage.Request - info := s.Bot.Storage.LoginInfo - group, err := s.Bot.Caller.WebWxCreateChatRoom(req, info, topic, friends) + req := s.bot.Storage.Request + info := s.bot.Storage.LoginInfo + group, err := s.bot.Caller.WebWxCreateChatRoom(req, info, topic, friends) if err != nil { return nil, err } - group.Self = s + group.self = s err = group.Detail() return group, err } @@ -361,9 +371,9 @@ func (s *Self) AddFriendsIntoGroup(group *Group, friends ...*Friend) error { } } } - req := s.Bot.Storage.Request - info := s.Bot.Storage.LoginInfo - return s.Bot.Caller.AddFriendIntoChatRoom(req, info, group, friends...) + req := s.bot.Storage.Request + info := s.bot.Storage.LoginInfo + return s.bot.Caller.AddFriendIntoChatRoom(req, info, group, friends...) } // RemoveMemberFromGroup 从群聊中移除用户 @@ -392,9 +402,9 @@ func (s *Self) RemoveMemberFromGroup(group *Group, members Members) error { if count != len(members) { return errors.New("invalid members") } - req := s.Bot.Storage.Request - info := s.Bot.Storage.LoginInfo - return s.Bot.Caller.RemoveFriendFromChatRoom(req, info, group, members...) + req := s.bot.Storage.Request + info := s.bot.Storage.LoginInfo + return s.bot.Caller.RemoveFriendFromChatRoom(req, info, group, members...) } // AddFriendIntoManyGroups 拉好友进多个群聊 @@ -410,9 +420,9 @@ func (s *Self) AddFriendIntoManyGroups(friend *Friend, groups ...*Group) error { // RenameGroup 群组重命名 func (s *Self) RenameGroup(group *Group, newName string) error { - req := s.Bot.Storage.Request - info := s.Bot.Storage.LoginInfo - return s.Bot.Caller.WebWxRenameChatRoom(req, info, newName, group) + req := s.bot.Storage.Request + info := s.bot.Storage.LoginInfo + return s.bot.Caller.WebWxRenameChatRoom(req, info, newName, group) } // SendTextToGroup 发送文本消息给群组 @@ -442,19 +452,19 @@ func (s *Self) SendFileToGroup(group *Group, file *os.File) (*SentMessage, error // self.RevokeMessage(sentMessage) // or sentMessage.Revoke() // } func (s *Self) RevokeMessage(msg *SentMessage) error { - return s.Bot.Caller.WebWxRevokeMsg(msg, s.Bot.Storage.Request) + return s.bot.Caller.WebWxRevokeMsg(msg, s.bot.Storage.Request) } // 转发消息接口 func (s *Self) forwardMessage(msg *SentMessage, delay time.Duration, users ...*User) error { - info := s.Bot.Storage.LoginInfo - req := s.Bot.Storage.Request + 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 - if _, err := s.Self.Bot.Caller.WebWxSendMsg(msg.SendMessage, info, req); err != nil { + if _, err := s.self.bot.Caller.WebWxSendMsg(msg.SendMessage, info, req); err != nil { return err } time.Sleep(delay) @@ -463,7 +473,7 @@ func (s *Self) forwardMessage(msg *SentMessage, delay time.Duration, users ...*U for _, user := range users { msg.FromUserName = s.UserName msg.ToUserName = user.UserName - if _, err := s.Self.Bot.Caller.Client.WebWxSendMsgImg(msg.SendMessage, req, info); err != nil { + if _, err := s.self.bot.Caller.Client.WebWxSendMsgImg(msg.SendMessage, req, info); err != nil { return err } time.Sleep(delay) @@ -472,7 +482,7 @@ func (s *Self) forwardMessage(msg *SentMessage, delay time.Duration, users ...*U for _, user := range users { msg.FromUserName = s.UserName msg.ToUserName = user.UserName - if _, err := s.Self.Bot.Caller.Client.WebWxSendAppMsg(msg.SendMessage, req); err != nil { + if _, err := s.self.bot.Caller.Client.WebWxSendAppMsg(msg.SendMessage, req); err != nil { return err } time.Sleep(delay) @@ -721,7 +731,7 @@ func (m Members) detail(self *Self) error { times = count / 50 } var newMembers Members - request := self.Bot.Storage.Request + request := self.bot.Storage.Request var pMembers Members // 分情况依次更新 for i := 1; i <= times; i++ { @@ -730,7 +740,7 @@ func (m Members) detail(self *Self) error { } else { pMembers = members[(i-1)*50 : i*50] } - nMembers, err := self.Bot.Caller.WebWxBatchGetContact(pMembers, request) + nMembers, err := self.bot.Caller.WebWxBatchGetContact(pMembers, request) if err != nil { return err } @@ -742,7 +752,7 @@ func (m Members) detail(self *Self) error { // 将全部剩余的更新完毕 left := count - total pMembers = members[total : total+left] - nMembers, err := self.Bot.Caller.WebWxBatchGetContact(pMembers, request) + nMembers, err := self.bot.Caller.WebWxBatchGetContact(pMembers, request) if err != nil { return err } @@ -757,13 +767,13 @@ func (m Members) detail(self *Self) error { func (m Members) init(self *Self) { for _, member := range m { - member.Self = self + member.self = self member.formatEmoji() } } func newFriend(username string, self *Self) *Friend { - return &Friend{&User{UserName: username, Self: self}} + return &Friend{&User{UserName: username, self: self}} } // NewFriendHelper 创建一个文件传输助手 @@ -796,6 +806,11 @@ func (s *Self) sendMessageWrapper(message *SentMessage, err error) (*SentMessage if err != nil { return nil, err } - message.Self = s + message.self = s return message, nil } + +// Bot 获取当前用户的机器人 +func (s *Self) Bot() *Bot { + return s.bot +}