Files
wechat_ipad_pro/srv/wxtask/wxgrabhbtask.go

365 lines
8.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}