Files
wechat_ipad_pro/srv/wxtask/wxgrabhbtask.go

365 lines
8.5 KiB
Go
Raw Normal View History

2026-02-17 13:06:23 +08:00
package wxtask
import (
"sync"
"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:
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)
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
}