193 lines
5.4 KiB
Go
193 lines
5.4 KiB
Go
package wxtask
|
|
|
|
import (
|
|
"strconv"
|
|
"time"
|
|
"xiawan/wx/clientsdk"
|
|
"xiawan/wx/clientsdk/baseinfo"
|
|
"xiawan/wx/protobuf/wechat"
|
|
"xiawan/wx/srv/srvconfig"
|
|
"xiawan/wx/srv/wxface"
|
|
)
|
|
|
|
// WXGroupTask 群任务
|
|
type WXGroupTask struct {
|
|
wxConn wxface.IWXConnect
|
|
groupForQrcodeList []*wechat.ModContact
|
|
groupForAddressBookList []*wechat.ModContact
|
|
waitTimes uint32 // 毫秒
|
|
inQrcodeTask bool // 下载群二维码
|
|
inAddressBookTask bool // 保存群到通讯录任务状态
|
|
}
|
|
|
|
// NewWXGroupTask 新建一个群任务
|
|
func NewWXGroupTask(wxConn wxface.IWXConnect) *WXGroupTask {
|
|
return &WXGroupTask{
|
|
wxConn: wxConn,
|
|
groupForQrcodeList: make([]*wechat.ModContact, 0),
|
|
groupForAddressBookList: make([]*wechat.ModContact, 0),
|
|
inQrcodeTask: false,
|
|
inAddressBookTask: false,
|
|
waitTimes: srvconfig.TaskExecWaitTimes,
|
|
}
|
|
}
|
|
|
|
// 获取下一个待下载的获取二维码的群
|
|
func (gpt *WXGroupTask) getNextGroupForQrcodeContact() *wechat.ModContact {
|
|
if len(gpt.groupForQrcodeList) <= 0 {
|
|
return nil
|
|
}
|
|
retContact := gpt.groupForQrcodeList[0]
|
|
gpt.groupForQrcodeList = gpt.groupForQrcodeList[1:]
|
|
return retContact
|
|
}
|
|
|
|
// 获取下一个待保存到通讯录到群
|
|
func (gpt *WXGroupTask) getNextGroupListForAddressBookContact(count uint32) []*wechat.ModContact {
|
|
size := uint32(len(gpt.groupForAddressBookList))
|
|
if size <= 0 {
|
|
return nil
|
|
}
|
|
|
|
retList := make([]*wechat.ModContact, 0)
|
|
if size > count {
|
|
retList = append(retList, gpt.groupForAddressBookList[:count]...)
|
|
gpt.groupForAddressBookList = gpt.groupForAddressBookList[count:]
|
|
} else {
|
|
retList = append(retList, gpt.groupForAddressBookList[0:]...)
|
|
gpt.groupForAddressBookList = []*wechat.ModContact{}
|
|
}
|
|
return retList
|
|
}
|
|
|
|
// GetLessCount 获取剩余群聊数量
|
|
func (gpt *WXGroupTask) GetLessCount() uint32 {
|
|
return uint32(len(gpt.groupForAddressBookList))
|
|
}
|
|
|
|
// StartDownQrcode 开启下载群二维码任务
|
|
// lessMembers: 最少成员数量
|
|
func (gpt *WXGroupTask) StartDownQrcode(lessMembers uint32) {
|
|
currentWXAccount := gpt.wxConn.GetWXAccount()
|
|
currentWXReqInvoker := gpt.wxConn.GetWXReqInvoker()
|
|
// 如果正在执行下载任务,则返回
|
|
if gpt.inQrcodeTask {
|
|
return
|
|
}
|
|
// 如果上一次的还没
|
|
if len(gpt.groupForQrcodeList) <= 0 {
|
|
gpt.groupForQrcodeList = currentWXAccount.GetWXGroupList()
|
|
}
|
|
// 先构建当前目录
|
|
gpt.inQrcodeTask = true
|
|
go func() {
|
|
for {
|
|
// 先判断是否还处于链接当中
|
|
if !gpt.wxConn.IsConnected() {
|
|
gpt.inQrcodeTask = false
|
|
return
|
|
}
|
|
|
|
// 获取下一个群聊
|
|
tmpModContact := gpt.getNextGroupForQrcodeContact()
|
|
if tmpModContact == nil {
|
|
return
|
|
}
|
|
|
|
// 群成员数量要大于20, 超过200人的群聊必须要邀请才能入群
|
|
memberCount := tmpModContact.NewChatroomData.GetMemberCount()
|
|
if memberCount < lessMembers || memberCount >= 200 {
|
|
continue
|
|
}
|
|
|
|
// 进群验证
|
|
if tmpModContact.GetChatroomAccessType() != 0 {
|
|
continue
|
|
}
|
|
|
|
// 获取群二维码请求
|
|
groupUserName := tmpModContact.GetUserName().GetStr()
|
|
err := currentWXReqInvoker.SendGetQRCodeRequest(groupUserName)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
// 暂停 2000 毫秒
|
|
time.Sleep(2000 * time.Millisecond)
|
|
}
|
|
}()
|
|
}
|
|
|
|
// StartSaveToAddressBook 开启保存到通讯录
|
|
// bSave: true:保存, false:取消保存
|
|
func (gpt *WXGroupTask) StartSaveToAddressBook(bSave bool) bool {
|
|
tmpOptionName := "保存"
|
|
if !bSave {
|
|
tmpOptionName = "取消保存"
|
|
}
|
|
currentWXAccount := gpt.wxConn.GetWXAccount()
|
|
currentWXReqInvoker := gpt.wxConn.GetWXReqInvoker()
|
|
currentWXFileHelperMgr := gpt.wxConn.GetWXFileHelperMgr()
|
|
// 如果正在执行下载任务,则返回
|
|
if gpt.inAddressBookTask {
|
|
tipText := "正在" + tmpOptionName + "中请稍后, 剩余(" + strconv.Itoa(len(gpt.groupForAddressBookList)) + ")个群"
|
|
currentWXFileHelperMgr.AddNewTipMsg(tipText)
|
|
return false
|
|
}
|
|
|
|
// 如果上一次的还没
|
|
if len(gpt.groupForAddressBookList) <= 0 {
|
|
gpt.groupForAddressBookList = currentWXAccount.GetWXGroupList()
|
|
}
|
|
gpt.inAddressBookTask = true
|
|
go func() {
|
|
for {
|
|
// 先判断是否还处于链接当中
|
|
if !gpt.wxConn.IsConnected() {
|
|
gpt.inAddressBookTask = false
|
|
return
|
|
}
|
|
|
|
// 获取接下来的10个群聊
|
|
tmpModContactList := gpt.getNextGroupListForAddressBookContact(10)
|
|
count := len(tmpModContactList)
|
|
if count <= 0 {
|
|
gpt.inAddressBookTask = false
|
|
tipText := "执行 " + tmpOptionName + "群聊任务 完成"
|
|
currentWXFileHelperMgr.AddNewTipMsg(tipText)
|
|
return
|
|
}
|
|
|
|
// 创建Item列表
|
|
items := make([]*baseinfo.ModifyItem, 0)
|
|
for index := 0; index < count; index++ {
|
|
tmpModContact := tmpModContactList[index]
|
|
// 如果状态一致则不用操作
|
|
bitVal := tmpModContact.GetBitVal()
|
|
hasSaved := false
|
|
if bitVal&baseinfo.MMBitValGroupSaveInAddressBook == 1 {
|
|
hasSaved = true
|
|
}
|
|
if (bSave && hasSaved) || (!bSave && !hasSaved) {
|
|
continue
|
|
}
|
|
tmpItem := clientsdk.CreateSaveGroupToAddressBookField(tmpModContact, bSave)
|
|
items = append(items, tmpItem)
|
|
}
|
|
if len(items) <= 0 {
|
|
continue
|
|
}
|
|
err := currentWXReqInvoker.SendOplogRequest(items)
|
|
if err != nil {
|
|
gpt.inAddressBookTask = false
|
|
return
|
|
}
|
|
// 暂停 waitTimes 毫秒
|
|
time.Sleep(time.Duration(gpt.waitTimes) * time.Millisecond)
|
|
}
|
|
}()
|
|
|
|
tmpTip := "开始" + tmpOptionName + "群聊任务"
|
|
currentWXFileHelperMgr.AddNewTipMsg(tmpTip)
|
|
return true
|
|
}
|