Files
wechat_ipad_pro/srv/wxtask/wxgrouptask.go
2026-02-17 13:06:23 +08:00

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
}