Files
wechat_ipad_pro/db/cache.go
2026-02-17 13:06:23 +08:00

121 lines
3.2 KiB
Go
Raw Permalink 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 db
import (
"time"
"xiawan/wx/clientsdk/baseinfo"
"github.com/gogf/gf/os/gcache"
)
var cache *gcache.Cache
// 添加一个持久缓存,用于保存最后的登录状态
var lastLoginStatusCache *gcache.Cache
// 添加短连接状态缓存
var shortLinkStatusCache *gcache.Cache
// ShortLinkStatus 短连接状态结构
type ShortLinkStatus struct {
IsEnabled bool
}
func init() {
cache = gcache.New()
lastLoginStatusCache = gcache.New()
shortLinkStatusCache = gcache.New()
}
// AddCheckStatusCache 添加扫码状态
func AddCheckStatusCache(queryKey string, val *baseinfo.CheckLoginQrCodeResult) {
_ = PublishSyncMsgCheckLogin(queryKey, val)
isContains := cache.Contains(queryKey)
if !isContains {
cache.Set(queryKey, val, time.Second*200)
// 当扫码状态为2扫码成功持久化保存状态
if val.GetState() == 2 {
SaveLastLoginStatus(queryKey, val)
}
return
} else {
// 不要先删除再添加,这可能导致竞态条件
// 先设置新的,再删除旧的(如果需要)
tempVal := cache.Get(queryKey)
cache.Set(queryKey, val, time.Second*200)
// 当扫码状态为2扫码成功持久化保存状态
if val.GetState() == 2 {
SaveLastLoginStatus(queryKey, val)
}
// 如果旧值和新值相同,不需要进一步处理
if tempVal == val {
return
}
}
if val.Ret == -3003 {
cache.Set(queryKey, val, time.Second*1000)
return
}
//扫码时间到
if val.GetEffectiveTime() == 0 {
//checkStatusCache.Remove(queryKey)
return
}
cache.Set(queryKey, val, time.Second*time.Duration(val.GetEffectiveTime()))
}
// GetCheckStatusCache 获取扫码状态
func GetCheckStatusCache(queryKey string) *baseinfo.CheckLoginQrCodeResult {
isContains := cache.Contains(queryKey)
if !isContains {
return nil
}
return cache.Get(queryKey).(*baseinfo.CheckLoginQrCodeResult)
}
// ClearCheckStatusCache 清除指定queryKey的状态缓存
func ClearCheckStatusCache(queryKey string) {
cache.Remove(queryKey)
}
// 获取
func GetCaChe() *gcache.Cache {
return cache
}
// SaveLastLoginStatus 持久化保存最后的登录状态
func SaveLastLoginStatus(queryKey string, val *baseinfo.CheckLoginQrCodeResult) {
// 使用更长的过期时间,确保在整个登录过程中状态可用
lastLoginStatusCache.Set(queryKey, val, time.Hour*24)
}
// GetLastLoginStatus 获取最后保存的登录状态
func GetLastLoginStatus(queryKey string) *baseinfo.CheckLoginQrCodeResult {
isContains := lastLoginStatusCache.Contains(queryKey)
if !isContains {
return nil
}
return lastLoginStatusCache.Get(queryKey).(*baseinfo.CheckLoginQrCodeResult)
}
// SaveShortLinkStatus 保存短链接状态
func SaveShortLinkStatus(queryKey string, isEnabled bool) {
status := &ShortLinkStatus{
IsEnabled: isEnabled,
}
// 使用长期缓存,确保在服务重启后仍能恢复短连接状态
shortLinkStatusCache.Set(queryKey, status, time.Hour*24*30) // 保存30天
}
// GetShortLinkStatus 获取短链接状态
func GetShortLinkStatus(queryKey string) *ShortLinkStatus {
isContains := shortLinkStatusCache.Contains(queryKey)
if !isContains {
return nil
}
return shortLinkStatusCache.Get(queryKey).(*ShortLinkStatus)
}