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

113 lines
2.4 KiB
Go

package websrv
import (
"errors"
"sync"
"xiawan/wx/clientsdk/baseinfo"
)
// WebTaskMgr web任务管理器
type WebTaskMgr struct {
// wxConn wxface.IWXConnect
taskChan chan *WebTask
endChan chan bool
isStart bool
}
// 全局只能定义一个
var WebTaskMgrInit *WebTaskMgr = &WebTaskMgr{
taskChan: make(chan *WebTask, 100),
endChan: make(chan bool, 1),
isStart: false,
}
var globalLock sync.Mutex = sync.Mutex{}
// NewWebTaskMgr 新建web任务管理器
func NewWebTaskMgr() *WebTaskMgr {
globalLock.Lock()
defer globalLock.Unlock()
return WebTaskMgrInit
}
// Start 开启
func (wtm *WebTaskMgr) Start() {
globalLock.Lock()
defer globalLock.Unlock()
if wtm.isStart {
return
}
wtm.isStart = true
go wtm.queryAndExecuteTask()
}
// Stop 关闭
func (wtm *WebTaskMgr) Stop() {
wtm.isStart = false
wtm.endChan <- true
}
// AddWebTask 新增Web任务
func (wtm *WebTaskMgr) retSetWebTask(webTask *WebTask) {
// 最多三次
if webTask.Count >= 2 {
return
}
webTask.Count++
wtm.taskChan <- webTask
}
// AddWebTask 新增Web任务
func (wtm *WebTaskMgr) AddWebTask(userInfo *baseinfo.UserInfo, taskInfo *TaskInfo, status string, tmpType uint32, connectInfo map[string]interface{}) {
if !wtm.isStart {
return
}
globalLock.Lock()
defer globalLock.Unlock()
newWebTask := &WebTask{}
newWebTask.ConnectInfo = connectInfo
newWebTask.TaskInfo = taskInfo
newWebTask.UserInfo = userInfo
newWebTask.Status = status
newWebTask.Type = tmpType
newWebTask.Count = 0
wtm.taskChan <- newWebTask
}
func (wtm *WebTaskMgr) queryAndExecuteTask() {
for {
select {
case webTask := <-wtm.taskChan:
if webTask.Type == TaskTypeUploadStatus {
err := errors.New("")
// err := UploadTaskStatus(webTask)
// if err != nil && webTask.Status != TaskStateCheckLoginQrcodeSuccess {
// wtm.retSetWebTask(webTask)
// continue
// }
// 登陆成功上报
if webTask.Status == TaskStateLoginSuccess {
err = ReportWechatStatus(webTask, "1")
if err != nil {
wtm.retSetWebTask(webTask)
continue
}
}
// 退出登陆上报
if webTask.Status == TaskStateLogout {
err = ReportWechatStatus(webTask, "0")
if err != nil {
wtm.retSetWebTask(webTask)
continue
}
}
} else if webTask.Type == TaskTypeReportHeart {
// 上报心跳包
}
continue
case <-wtm.endChan:
return
}
}
}