2026-02-17 13:06:23 +08:00
|
|
|
|
package wxtask
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"sync"
|
2026-02-26 10:44:13 +08:00
|
|
|
|
"time"
|
2026-02-17 13:06:23 +08:00
|
|
|
|
"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:
|
2026-02-26 10:44:13 +08:00
|
|
|
|
if ghbm.currentHBItem != nil {
|
|
|
|
|
|
ghbm.currentHBItem.DequeueAtMs = time.Now().UnixMilli()
|
|
|
|
|
|
}
|
2026-02-17 13:06:23 +08:00
|
|
|
|
// 直接发送抢红包请求,不等待响应
|
|
|
|
|
|
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)
|
2026-02-26 10:44:13 +08:00
|
|
|
|
if hbItem != nil && hbItem.EnqueueAtMs <= 0 {
|
|
|
|
|
|
hbItem.EnqueueAtMs = time.Now().UnixMilli()
|
|
|
|
|
|
}
|
2026-02-17 13:06:23 +08:00
|
|
|
|
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
|
|
|
|
|
|
}
|