package wxtask import ( "sync" "time" "xiawan/wx/clientsdk/baseinfo" "xiawan/wx/db" "xiawan/wx/srv/wxface" ) // WXGrabHBTask 抢红包管理器 type WXGrabHBTask struct { wxConn wxface.IWXConnect // 待领红包项列表 hongBaoItemChan chan *baseinfo.HongBaoItem // 可不可以抢红包 canDoNext chan bool // 结束标志 endChan chan bool // 是否正在运行 isRunning bool // 当前在抢的红包 currentHBItem *baseinfo.HongBaoItem // autoGrap autoGropFlag bool //延迟抢红包 delayOpen int //是否自动回复感谢 autoReply bool //感谢内容 autoReplyContent string //是否过滤测挂 filterCheats bool // 过滤测挂关键字 filterCheatsKey string //是否过滤文字/字母包 filterText bool // 接收个人红包 autoPerson bool // 接收转账 autoTransfer bool //接收转账后是否自动回复 autoTransferReply bool //接收转账后自动回复的内容 autoTransferReplyContent string //群是否置顶 topGroup map[string]string // 红包统计开关 hbStat bool // 转账统计开关 transStat bool // 是否只抢置顶群(false 不抢置顶群, true 只抢置顶群) notTopGroup bool mu sync.Mutex // 互斥锁 // 是否开启 isStart bool } // NewWXGrabHBTask 新建抢红包管理器 func NewWXGrabHBTask(wxConn wxface.IWXConnect) *WXGrabHBTask { return &WXGrabHBTask{ wxConn: wxConn, hongBaoItemChan: make(chan *baseinfo.HongBaoItem, 200), canDoNext: make(chan bool, 1), endChan: make(chan bool, 1), isRunning: false, autoGropFlag: false, delayOpen: 0, autoReply: true, autoReplyContent: "", filterCheats: false, filterText: false, autoPerson: false, autoTransfer: false, filterCheatsKey: "测,挂,cg,死,罚,踢,专", autoTransferReply: true, autoTransferReplyContent: "", topGroup: make(map[string]string), hbStat: false, transStat: false, notTopGroup: false, mu: sync.Mutex{}, isStart: false, } } func (ghbm *WXGrabHBTask) grapHB() { for { select { case ghbm.currentHBItem = <-ghbm.hongBaoItemChan: if ghbm.currentHBItem != nil { ghbm.currentHBItem.DequeueAtMs = time.Now().UnixMilli() } // 直接发送抢红包请求,不等待响应 go ghbm.wxConn.GetWXReqInvoker().SendOpenRedEnvelopesRequest(ghbm.currentHBItem) // 立即准备抢下一个红包,不等待当前红包处理完成 ghbm.GrapNext() return case <-ghbm.endChan: //ghbm.endChan <- true //close(ghbm.endChan) return } } } // startGrap 开始抢红包 func (ghbm *WXGrabHBTask) startGrap() { for { select { case <-ghbm.canDoNext: ghbm.grapHB() case <-ghbm.endChan: return } } } // Start 开始抢红包协程 func (ghbm *WXGrabHBTask) Start() { ghbm.mu.Lock() defer ghbm.mu.Unlock() if ghbm.isStart { return } ghbm.isStart = true go ghbm.startGrap() ghbm.canDoNext <- true } // Stop 结束抢红包协程 func (ghbm *WXGrabHBTask) Stop() { ghbm.mu.Lock() defer ghbm.mu.Unlock() if !ghbm.isStart { return } ghbm.isStart = false ghbm.endChan <- true //close(ghbm.endChan) } // GrapNext 抢下一个红包 func (ghbm *WXGrabHBTask) GrapNext() { ghbm.canDoNext <- true } // AddHBItem 添加红包项 func (ghbm *WXGrabHBTask) AddHBItem(hbItem *baseinfo.HongBaoItem) { // 抢红包操作 // ghbm.wxConn.GetWXReqInvoker().SendOpenRedEnvelopesRequest(hbItem) if hbItem != nil && hbItem.EnqueueAtMs <= 0 { hbItem.EnqueueAtMs = time.Now().UnixMilli() } ghbm.hongBaoItemChan <- hbItem if !ghbm.isStart { ghbm.Start() } } // 直接接收转账 func (ghbm *WXGrabHBTask) DirectTransfer(transferItem *baseinfo.TenPayReqItem, wcPayInfo *baseinfo.WCPayInfo2) { ghbm.wxConn.GetWXReqInvoker().SendReceiveZZ(transferItem, wcPayInfo) } // GetCurrentHBItem 获取当前正在抢的红包项 func (ghbm *WXGrabHBTask) GetCurrentHBItem() *baseinfo.HongBaoItem { return ghbm.currentHBItem } // IsAutoGrap 是否开启了自动抢红包功能 func (ghbm *WXGrabHBTask) IsAutoGrap() bool { return ghbm.autoGropFlag } func (ghbm *WXGrabHBTask) IsFilterCheats() bool { return ghbm.filterCheats } func (ghbm *WXGrabHBTask) IsFilterText() bool { return ghbm.filterText } // 是否自动接收个人红包 func (ghbm *WXGrabHBTask) IsAutoPerson() bool { return ghbm.autoPerson } // 是否自动接收转账 func (ghbm *WXGrabHBTask) IsAutoTransfer() bool { return ghbm.autoTransfer } // 设置是否自动接收个人红包 func (ghbm *WXGrabHBTask) SetAutoPerson(bFlag bool) { ghbm.autoPerson = bFlag } // 设置是否自动接收转账 func (ghbm *WXGrabHBTask) SetAutoTransfer(bFlag bool) { ghbm.autoTransfer = bFlag } // SetFilterCheats 过滤测挂开关 func (ghbm *WXGrabHBTask) SetFilterCheats(bFlag bool) { ghbm.filterCheats = bFlag } // SetFilterCheatsKey 设置过滤测挂关键字 func (ghbm *WXGrabHBTask) SetFilterCheatsKey(key string) { ghbm.filterCheatsKey = key } // 获取过滤测挂关键字 func (ghbm *WXGrabHBTask) GetFilterCheatsKey() string { return ghbm.filterCheatsKey } // SetFilterText 过滤文字/字母包开关 func (ghbm *WXGrabHBTask) SetFilterText(bFlag bool) { ghbm.filterText = bFlag } // 红包统计开关 func (ghbm *WXGrabHBTask) SetHBStat(bFlag bool) { ghbm.hbStat = bFlag } // 获取红包统计开关 func (ghbm *WXGrabHBTask) IsHBStat() bool { return ghbm.hbStat } // 转账统计开关 func (ghbm *WXGrabHBTask) SetTransStat(bFlag bool) { ghbm.transStat = bFlag } // 获取转账统计开关 func (ghbm *WXGrabHBTask) IsTransStat() bool { return ghbm.transStat } // SetAutoGrap 设置自动抢开关 func (ghbm *WXGrabHBTask) SetAutoGrap(bFlag bool) { ghbm.autoGropFlag = bFlag } // 设置抢红包自动回复 func (ghbm *WXGrabHBTask) SetAutoReply(bFlag bool) { ghbm.autoReply = bFlag } // notTopGroup func (ghbm *WXGrabHBTask) SetNotTopGroup(bFlag bool) { ghbm.notTopGroup = bFlag } // is func (ghbm *WXGrabHBTask) IsNotTopGroup() bool { return ghbm.notTopGroup } // 感谢内容 func (ghbm *WXGrabHBTask) SetAutoReplyContent(content string) { ghbm.autoReplyContent = content } // 接收转账后自动回复 func (ghbm *WXGrabHBTask) SetAutoTransferReply(bFlag bool) { ghbm.autoTransferReply = bFlag } // 接收转账后自动回复的内容 func (ghbm *WXGrabHBTask) SetAutoTransferReplyContent(content string) { ghbm.autoTransferReplyContent = content } // 获取 func (ghbm *WXGrabHBTask) GetAutoReplyContent() string { return ghbm.autoReplyContent } // 接收转账后自动回复的内容 func (ghbm *WXGrabHBTask) GetAutoTransferReplyContent() string { return ghbm.autoTransferReplyContent } // // 是否开启 接收转账后自动回复 func (ghbm *WXGrabHBTask) IsAutoTransferReply() bool { return ghbm.autoTransferReply } // IsAutoReply 是否开启了自动感谢红包功能 func (ghbm *WXGrabHBTask) IsAutoReply() bool { return ghbm.autoReply } // 设置延迟抢红包时间 func (ghbm *WXGrabHBTask) SetDelayOpen(bFlag int) { ghbm.delayOpen = bFlag } // 获取延迟时间 func (ghbm *WXGrabHBTask) GetDelayOpen() int { return ghbm.delayOpen } // 判断群是否置顶 func (ghbm *WXGrabHBTask) IsTopGroup(grouid string) bool { ghbm.mu.Lock() defer ghbm.mu.Unlock() _, exists := ghbm.topGroup[grouid] return exists } func (ghbm *WXGrabHBTask) InitTopGroup(uuid string) { ghbm.mu.Lock() defer ghbm.mu.Unlock() topGroup := make(map[string]string) ghbm.topGroup = topGroup error := db.GETObj(uuid+"_topGroup", &ghbm.topGroup) if error != nil { } } // 记录置顶的群 func (ghbm *WXGrabHBTask) RecordTopGroup(grouid string, grouName string) { ghbm.mu.Lock() defer ghbm.mu.Unlock() if ghbm.topGroup == nil { ghbm.topGroup = make(map[string]string) } ghbm.topGroup[grouid] = grouName // 存 redis db.SETExpirationObj(ghbm.wxConn.GetWXAccount().GetUserInfo().UUID+"_topGroup", ghbm.topGroup, -1) } // 删除置顶的群 func (ghbm *WXGrabHBTask) DelTopGroup(grouid string) { ghbm.mu.Lock() defer ghbm.mu.Unlock() // 如果 topGroup 为 nil,不进行操作 if ghbm.topGroup == nil { return } // 删除指定键 delete(ghbm.topGroup, grouid) // 存 redis db.SETExpirationObj(ghbm.wxConn.GetWXAccount().GetUserInfo().UUID+"_topGroup", ghbm.topGroup, -1) } // 获取全部群名称 func (ghbm *WXGrabHBTask) GetTopGroup() string { ghbm.mu.Lock() defer ghbm.mu.Unlock() group := ghbm.topGroup var groupNames string for _, name := range group { groupNames += name + "\n" } return groupNames }