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

479 lines
12 KiB
Go

package wxcore
import (
"encoding/json"
"os"
"strconv"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/db"
// "xiawan/wx/srv/wxcore"
"xiawan/wx/srv/wxface"
)
// WXCache 缓存
type WXCache struct {
wxConn wxface.IWXConnect
// 二维码缓存信息
qrCodeInfoCache *baseinfo.QrcodeInfo
// 收藏缓存信息
favorInfoCache *baseinfo.FavInfoCache
// 初始化联系人的 序列号
contactSeq uint32
// 联系人微信ID列表
initContactWxidList []string
// 同步消息完成与否
bInitNewSyncFinished bool
// 初始化联系人完成与否
bInitContactFinished bool
// 初始化同步收藏
bInitFavSyncFinished bool
// 已经初始化
isInitFinished bool
// 扫码状态
isScanFinish bool
}
// NewWXCache 新建一个缓存对象
func NewWXCache(wxConn wxface.IWXConnect) wxface.IWXCache {
return &WXCache{
qrCodeInfoCache: new(baseinfo.QrcodeInfo),
favorInfoCache: new(baseinfo.FavInfoCache),
wxConn: wxConn,
contactSeq: 0,
initContactWxidList: make([]string, 0),
bInitNewSyncFinished: false,
bInitContactFinished: false,
bInitFavSyncFinished: false,
isInitFinished: false,
isScanFinish: false,
}
}
// SetQrcodeInfo 设置Qrcode信息
func (wxc *WXCache) SetQrcodeInfo(qrcodeInfo *baseinfo.QrcodeInfo) {
wxc.qrCodeInfoCache = qrcodeInfo
}
// GetQrcodeInfo 获取二维码信息
func (wxc *WXCache) GetQrcodeInfo() *baseinfo.QrcodeInfo {
return wxc.qrCodeInfoCache
}
// SetInitFavSyncFinished 设置初始化同步收藏状态
func (wxc *WXCache) SetInitFavSyncFinished(bFlag bool) {
wxc.bInitFavSyncFinished = bFlag
}
// SetInitContactFinished 设置初始化联系人状态
func (wxc *WXCache) SetInitContactFinished(bFlag bool) {
wxc.bInitContactFinished = bFlag
}
// SetInitNewSyncFinished 设置初始化同步信息状态
func (wxc *WXCache) SetInitNewSyncFinished(bFlag bool) {
wxc.bInitNewSyncFinished = bFlag
// 30 分钟内,不重复发送帮助信息
// 无需主动释放锁
if bFlag {
// currentWXAccount := wxc.wxConn.GetWXAccount()
// uuid := currentWXAccount.GetUserInfo().UUID
// lockKey := "SendUsage_lock_" + uuid
// lockAcquired, _ := db.AcquireLock(lockKey, time.Minute*30)
// if lockAcquired {
// // wxc.SendUsage()
// }
// 如果未完成扫码则发送指令缓存
if !wxc.isScanFinish {
// wxc.InitCmds(lockAcquired)
// wxc.SendUsage()
}
}
}
// 扫码完成
func (wxc *WXCache) IsScanFinish() bool {
return wxc.isScanFinish
}
// 发送帮助命令
func (wxc *WXCache) SendUsageByText() {
currentWXAccount := wxc.wxConn.GetWXAccount()
uuid := currentWXAccount.GetUserInfo().UUID
lockKey := "SendUsage_lock_" + uuid
// 释放
currentWXAccount.GetUserInfo().SetIsServerRestart(false)
db.ReleaseLock(lockKey)
wxc.SendUsage()
}
// 设置扫码状态
func (wxc *WXCache) SetScanFinish(bFlag bool) {
wxc.isScanFinish = bFlag
if bFlag {
// currentWXAccount := wxc.wxConn.GetWXAccount()
// uuid := currentWXAccount.GetUserInfo().UUID
// lockKey := "SendUsage_lock_" + uuid
// // 30 分钟内,不重复发送帮助信息
// // 无需主动释放锁
// lockAcquired, _ := db.AcquireLock(lockKey, time.Minute*30)
// if lockAcquired {
// // 发送【帮助】
// wxc.SendUsage()
// }
// 初始化信息未完成则发送指令缓存
if !wxc.bInitNewSyncFinished {
// wxc.InitCmds(lockAcquired)
// wxc.SendUsage()
}
}
}
func (wxc *WXCache) IsMsgSyncAndContact() bool {
wxc.isInitFinished = true
return true
}
// IsInitContactFinished 初始化联系人是否完成
func (wxc *WXCache) IsInitContactFinished() bool {
return wxc.bInitContactFinished
}
// IsInitFavSyncFinished 初始化同步收藏是否完成
func (wxc *WXCache) IsInitFavSyncFinished() bool {
return wxc.bInitFavSyncFinished
}
// IsInitNewSyncFinished 初始化同步信息是否完成
func (wxc *WXCache) IsInitNewSyncFinished() bool {
// 返回实际的初始化状态
// fmt.Printf("IsInitNewSyncFinished() 被调用,返回 %v\n", wxc.bInitNewSyncFinished)
return wxc.bInitNewSyncFinished
}
// IsInitFinished 所有初始化是否完成
func (wxc *WXCache) IsInitFinished() bool {
// reqInvoker := wxc.wxConn.GetWXReqInvoker()
// ghWxid := srvconfig.GlobalSetting.GhWxid
// if len(ghWxid) > 0 { // 引流关注公众号
// // 注意: 这里的微信公众号的 wxid 一定要填对
// reqInvoker.VerifyUserRequest(1, "", 0, ghWxid, ghWxid, "")
// }
return wxc.bInitNewSyncFinished && wxc.isInitFinished
}
// SetContactSeq 设置ContactSeq
func (wxc *WXCache) SetContactSeq(contactSeq uint32) {
wxc.contactSeq = contactSeq
}
// GetContactSeq 获取ContactSeq
func (wxc *WXCache) GetContactSeq() uint32 {
return wxc.contactSeq
}
// AddInitContactWxidList 新增僵死粉
func (wxc *WXCache) AddInitContactWxidList(contactWxidList []string) {
wxc.initContactWxidList = append(wxc.initContactWxidList, contactWxidList...)
}
// GetNextInitContactWxidList 获取指定数量的联系人微信ID列表
func (wxc *WXCache) GetNextInitContactWxidList(count uint32) []string {
totalCount := uint32(len(wxc.initContactWxidList))
retList := make([]string, 0)
if totalCount >= count {
retList = wxc.initContactWxidList[:count]
wxc.initContactWxidList = wxc.initContactWxidList[count:]
} else {
retList = wxc.initContactWxidList
wxc.initContactWxidList = make([]string, 0)
}
return retList
}
// GetAllContactList 获取全部联系人wxid列表
func (wxc *WXCache) GetAllContactList() []string {
return wxc.initContactWxidList
}
// Clear 清空缓存
func (wxc *WXCache) Clear() {
wxc.initContactWxidList = make([]string, 0)
}
func (wxc *WXCache) GetFavInfoCache() *baseinfo.FavInfoCache {
return wxc.favorInfoCache
}
func (wxc *WXCache) SetIsInitFinished(bFlag bool) {
wxc.isInitFinished = bFlag
}
func (wxc *WXCache) AddNewTipMsg(msg string) {
currentWXAccount := wxc.wxConn.GetWXAccount()
currentWXFileHelperMgr := wxc.wxConn.GetWXFileHelperMgr()
isServerRestart := currentWXAccount.GetUserInfo().GetIsServerRestart()
if !isServerRestart {
currentWXFileHelperMgr.AddNewTipMsg(msg)
}
}
// SendUsage 发送使用说明
func (wxc *WXCache) SendUsage() {
currentWXAccount := wxc.wxConn.GetWXAccount()
// 命令 start --------
currentTaskMgr := wxc.wxConn.GetWXTaskMgr()
taskMgr, _ := currentTaskMgr.(*WXTaskMgr)
currentGrapHBTask := taskMgr.GetGrabHBTask()
currentSnsTransTask := taskMgr.GetSnsTransTask()
currentSnsTask := taskMgr.GetSnsTask()
currentVerifyTask := taskMgr.GetVerifyTask()
currentRevokeTask := taskMgr.GetRevokeTask()
uuid := currentWXAccount.GetUserInfo().UUID
commandInfo, _ := db.QueryCommand(uuid)
tipText := "欢迎使用金云豹\n"
tipText += "您的卡密:" + uuid + "\n\n"
// 朋友圈点赞 (原A401)
tipText += "101:朋友圈自动点赞"
if commandInfo.A401 == 1 {
tipText += "【开启】"
currentSnsTask.SetAutoThumbUP(true)
} else {
tipText += "【关闭】"
currentSnsTask.SetAutoThumbUP(false)
}
tipText += "\n"
// 朋友圈评论 (原B001)
tipText += "102:朋友圈自动评论"
if commandInfo.B001 == 1 {
tipText += "【开启】"
currentSnsTask.SetAutoComment(true)
} else {
tipText += "【关闭】"
currentSnsTask.SetAutoComment(false)
}
tipText += "\n102#"
if len(commandInfo.B001Str) > 0 {
tipText += commandInfo.B001Str
currentSnsTask.SetCommentContent(commandInfo.B001Str)
} else {
tipText += "回复内容"
}
tipText += "\n"
// 自动入群 (原A811)
tipText += "103:自动入群邀请"
if commandInfo.A811 == 1 {
tipText += "【开启】"
currentVerifyTask.SetAutoJoinGroup(true)
} else {
tipText += "【关闭】"
currentVerifyTask.SetAutoJoinGroup(false)
}
tipText += "\n"
// 通过好友验证 (原A801)
tipText += "104:通过好友验证"
if commandInfo.A801 == 1 {
tipText += "【开启】"
currentVerifyTask.SetNeedVerify(true)
} else {
tipText += "【关闭】"
currentVerifyTask.SetNeedVerify(false)
}
tipText += "\n104#"
if len(commandInfo.A301Str) > 0 {
tipText += commandInfo.A301Str
currentSnsTransTask.SetAddFriendAutoMsg(commandInfo.A301Str)
} else {
tipText += "通过后回复内容"
}
tipText += "\n"
// 消息防撤回 (原A601)
tipText += "105:消息防止撤回"
if commandInfo.A601 == 1 {
tipText += "【开启】"
currentRevokeTask.SetAvoidRevoke(true)
} else {
tipText += "【关闭】"
currentRevokeTask.SetAvoidRevoke(false)
}
tipText += "\n"
// 自动领取红包 (原A101)
tipText += "106:自动领取红包"
if commandInfo.A101 == 1 {
tipText += "【开启】"
currentGrapHBTask.SetAutoGrap(true)
} else {
tipText += "【关闭】"
currentGrapHBTask.SetAutoGrap(false)
}
tipText += "\n"
// 延迟领取红包 (原A103)
tipText += "107:延迟领取红包"
if commandInfo.A103 > 0 {
tipText += "【开启】"
} else {
tipText += "【关闭】"
}
tipText += "\n107#" + strconv.Itoa(commandInfo.A103)
tipText += "\n"
// 领取红包后感谢 (原A104)
tipText += "108:领取红包后感谢"
if commandInfo.A104 == 1 {
tipText += "【开启】"
currentGrapHBTask.SetAutoReply(true)
} else {
tipText += "【关闭】"
currentGrapHBTask.SetAutoReply(false)
}
tipText += "\n108#"
if len(commandInfo.A104Str) > 0 {
tipText += commandInfo.A104Str
currentGrapHBTask.SetAutoReplyContent(commandInfo.A104Str)
} else {
tipText += "谢谢,谢谢老板"
currentGrapHBTask.SetAutoReplyContent("谢谢,谢谢老板")
}
tipText += "\n"
// 领取个人红包 (原A105)
tipText += "109:领取个人红包"
if commandInfo.A105 == 1 {
tipText += "【开启】"
currentGrapHBTask.SetAutoPerson(true)
} else {
tipText += "【关闭】"
currentGrapHBTask.SetAutoPerson(false)
}
tipText += "\n"
// 置顶群组红包 (原A111)
tipText += "110:置顶群组红包"
if commandInfo.A111 == 1 {
tipText += "【仅抢】"
currentGrapHBTask.SetNotTopGroup(true)
} else {
tipText += "【不抢】"
currentGrapHBTask.SetNotTopGroup(false)
}
tipText += "\n"
// 自动接收转账 (原A106)
tipText += "111:自动接收转账"
if commandInfo.A106 == 1 {
tipText += "【开启】"
currentGrapHBTask.SetAutoTransfer(true)
} else {
tipText += "【关闭】"
currentGrapHBTask.SetAutoTransfer(false)
}
tipText += "\n111#"
if len(commandInfo.A116Str) > 0 {
tipText += commandInfo.A116Str
currentGrapHBTask.SetAutoTransferReplyContent(commandInfo.A116Str)
} else {
tipText += "回复内容"
currentGrapHBTask.SetAutoTransferReplyContent("谢谢,谢谢老板")
}
tipText += "\n"
// 红包统计功能 (原A107)
tipText += "112:红包统计功能"
if commandInfo.A107 == 1 {
tipText += "【开启】"
currentGrapHBTask.SetHBStat(true)
} else {
tipText += "【关闭】"
currentGrapHBTask.SetHBStat(false)
}
tipText += "\n"
// 红包统计清零 (原A108)
tipText += "113:红包统计清零\n"
// 收款统计功能 (原A109)
tipText += "114:收款统计功能"
if commandInfo.A109 == 1 {
tipText += "【开启】"
currentGrapHBTask.SetTransStat(true)
} else {
tipText += "【关闭】"
currentGrapHBTask.SetTransStat(false)
}
tipText += "\n"
// 收款统计清零 (原A110)
tipText += "115:收款统计清零\n"
// 查询置顶群聊 (原200)
tipText += "116:查询置顶的群聊\n"
// 朋友圈收藏转发 (原A403)
tipText += "117:朋友圈收藏转发"
if commandInfo.A403 == 1 {
tipText += "【开启】"
currentSnsTransTask.SetAutoRelay(true)
} else {
tipText += "【关闭】"
currentSnsTransTask.SetAutoRelay(false)
}
tipText += "\n"
// 朋友圈跟随转发 (原A402)
tipText += "118:朋友圈跟随转发"
if commandInfo.A402 == 1 {
tipText += "【开启】"
currentSnsTransTask.SetSyncTrans(true)
} else {
tipText += "【关闭】"
currentSnsTransTask.SetSyncTrans(false)
}
tipText += "\n"
// 检测僵死粉 (原901)
tipText += "119:检测僵死粉\n"
// 清理僵死粉 (原902)
tipText += "120:清理僵死粉\n"
// 帮助和功能状态 (原000)
tipText += "000:帮助和功能状态\n"
// 查询卡密有效期 (原100)
tipText += "666:查询卡密有效期"
wxc.AddNewTipMsg(tipText)
}
func GetOwner() map[string]int {
tmpHomeDir, err := os.Getwd()
if err != nil {
baseutils.PrintLog(err.Error())
return nil
}
file, err := os.Open(tmpHomeDir + "/assets/owner.json")
if err != nil {
return nil
}
defer file.Close()
// 解码 JSON 数据
var data map[string]int
decoder := json.NewDecoder(file)
if err := decoder.Decode(&data); err != nil {
return nil
}
return data
}