Files
bl/modules/player/service/cdk_log.go

99 lines
1.7 KiB
Go
Raw Normal View History

package service
import (
"blazing/cool"
"blazing/modules/player/model"
2026-03-31 08:19:53 +08:00
"sync"
"github.com/gogf/gf/v2/frame/g"
)
type CdkService struct {
BaseService
2026-03-31 08:19:53 +08:00
mu sync.RWMutex
claimedCode map[uint32]struct{}
cacheLoaded bool
}
func (s *CdkService) CanGet(id uint32) bool {
2026-03-31 08:19:53 +08:00
if s.isClaimed(id) {
return false
}
2026-03-31 08:19:53 +08:00
if err := s.loadClaimedCodes(); err != nil {
exists, _ := s.dbm(s.Model).Where("code_id", id).Exist()
if exists {
s.markClaimed(id)
}
return !exists
}
2026-03-31 08:19:53 +08:00
return !s.isClaimed(id)
}
func (s *CdkService) Log(id uint32) {
2026-02-13 22:57:05 +08:00
m := s.dbm(s.Model)
data := g.Map{
"player_id": s.userid,
"code_id": id,
"is_vip": cool.Config.ServerInfo.IsVip,
}
2026-03-31 08:19:53 +08:00
if _, err := m.Data(data).Insert(); err == nil {
s.markClaimed(id)
}
}
func (s *CdkService) loadClaimedCodes() error {
s.mu.RLock()
if s.cacheLoaded {
s.mu.RUnlock()
return nil
}
s.mu.RUnlock()
var logs []model.CdkLog
if err := s.dbm(s.Model).Fields("code_id").Scan(&logs); err != nil {
return err
}
s.mu.Lock()
defer s.mu.Unlock()
if s.cacheLoaded {
return nil
}
s.claimedCode = make(map[uint32]struct{}, len(logs))
for _, log := range logs {
s.claimedCode[log.CodeID] = struct{}{}
}
s.cacheLoaded = true
return nil
}
func (s *CdkService) isClaimed(id uint32) bool {
s.mu.RLock()
defer s.mu.RUnlock()
_, ok := s.claimedCode[id]
return ok
}
2026-03-31 08:19:53 +08:00
func (s *CdkService) markClaimed(id uint32) {
s.mu.Lock()
defer s.mu.Unlock()
if s.claimedCode == nil {
s.claimedCode = make(map[uint32]struct{})
}
s.claimedCode[id] = struct{}{}
}
func NewCdkService(id uint32) *CdkService {
return &CdkService{
BaseService: BaseService{userid: id,
Service: &cool.Service{Model: model.NewCdkLog()},
},
2026-03-31 08:19:53 +08:00
claimedCode: make(map[uint32]struct{}),
}
}