Files
bl/modules/config/service/server.go
昔念 7dfa9c297e
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
```
feat(fight): 新增疲惫状态并优化睡眠状态机制

- 实现疲惫状态(StatusTired),仅限制攻击技能,允许属性技能正常使用
- 重构睡眠状态,改为在被攻击且未miss时立即解除,而非技能使用后
- 修复寄生种子效果触发时机,改为回合开始时触发
- 调整寄生效果的目标为技能施放者而非对手

fix(fight): 修正战斗回合逻辑和技能持续时间处理

- 修复Effect2194中状态添加函数调用,使用带时间参数的版本
- 修正Effect13中技能持续时间计算,避免额外减1的问题
- 优化回合处理逻辑,当双方都未出手时跳过动作阶段

refactor(cdk): 重构CDK配置结构和服务器冠名功能

- 将CDKConfig中的CDKType字段重命名为Type以符合GORM映射
- 优化UseServerNamingCDK方法的上下文处理逻辑
- 修复服务器冠名CDK使用时的类型检查条件

feat(player): 完善宠物经验系统和CDK兑换功能

- 增强AddPetExp方法,处理宠物等级达到100级的情况
- 添加查询当前账号有效期内服务器冠名信息的API接口
- 实现服务器服务相关的数据模型和查询方法

fix(task): 任务查询支持启用和未启用状态

- 修改任务服务中的Get、GetDaily、GetWeek方法
- 当启用状态下无结果时,自动查询未启用状态的任务配置
```
2026-04-13 22:27:27 +08:00

434 lines
11 KiB
Go

package service
import (
"blazing/common/utils"
"blazing/cool"
"blazing/modules/config/model"
"fmt"
"sort"
"time"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
)
type ServerService struct {
*cool.Service
manager *storage.BucketManager
bucket string
}
type ServerShowInfo struct {
OnlineID uint32 `json:"online_id"`
Name string `json:"name"`
IP string `json:"ip"`
Port uint32 `json:"port"`
IsVip uint32 `json:"is_vip"`
IsDebug uint8 `json:"is_debug"`
IsOpen uint8 `json:"is_open"`
//Owner uint32 `json:"owner"`
// ExpireTime time.Time `json:"expire_time"`
// ServerShow *model.ServerShow `json:"servershow,omitempty"`
}
type DonationOwnedServerInfo struct {
ServerID uint32 `json:"server_id"`
ServerName string `json:"server_name"`
Remark string `json:"remark"`
ExpireTime time.Time `json:"expire_time"`
}
func NewServerService() *ServerService {
cf := &ServerService{
Service: &cool.Service{
Model: model.NewServerList(),
},
}
cf.PageQueryOp = &cool.QueryOp{
ModifyResult: func(ctx g.Ctx, data interface{}) interface{} {
var rr []g.MapStrAny
r, _ := gconv.Map(data)["list"].(gdb.Result)
now := time.Now()
serverIDs := make([]uint32, 0, len(r))
for i := 0; i < len(r); i++ {
serverID := gconv.Uint32(r[i].Map()["online_id"])
if serverID == 0 {
continue
}
serverIDs = append(serverIDs, serverID)
}
showMap := cf.getPrimaryActiveServerShowMap(serverIDs, now)
for i := 0; i < len(r); i++ {
t, ok := cool.GetClient(gconv.Uint32(r[i].Map()["online_id"]), gconv.Uint32(r[i].Map()["port"]))
subm := r[i].GMap()
cf.applyServerShowMap(subm, gconv.Uint32(r[i].Map()["online_id"]), showMap)
if ok {
err := t.KickPerson(0) //实现指定服务器踢人
if err == nil {
r, _ := utils.TcpPing(fmt.Sprintf("%s:%d", r[i].Map()["ip"], r[i].Map()["port"]))
subm.Set("isonline", r)
} else {
subm.Set("isonline", 0)
}
} else {
subm.Set("isonline", 0)
}
rr = append(rr, subm.MapStrAny())
}
data.(map[string]interface{})["list"] = rr
return data
},
}
cfg := storage.Config{
Zone: &storage.ZoneHuadong,
UseHTTPS: true,
UseCdnDomains: true,
}
mac := qbox.NewMac("DzMpomnPxqBHkIcvxTbC-hl_8LjVB0LXZuhCky_u", "bhoxrpG1s7MBmSS2I1k5t9zMpuiderpBDZoIPQKU")
cf.bucket = "blazingt"
cf.manager = storage.NewBucketManager(mac, &cfg)
return cf
}
func (s *ServerService) GetPort(DepartmentID uint) []ServerShowInfo {
servers := s.getRawServers()
now := time.Now()
showMap := s.getActiveServerShowListMap(s.collectServerIDs(servers), now)
items := make([]ServerShowInfo, 0, len(servers))
for _, server := range servers {
if server.IsOpen != 1 {
continue
}
if DepartmentID == 1 && server.IsDebug != 0 {
continue
}
items = append(items, ServerShowInfo{
OnlineID: server.OnlineID,
Name: server.Name,
IP: server.IP,
Port: server.Port,
IsVip: server.IsVip,
IsDebug: server.IsDebug,
IsOpen: server.IsOpen,
//Owner: 0,
// ExpireTime: time.Time{},
})
for i := range showMap[server.OnlineID] {
show := &showMap[server.OnlineID][i]
itemOnlineID := server.OnlineID
if show.ID > 0 {
itemOnlineID = uint32(show.ID)
}
item := ServerShowInfo{
OnlineID: itemOnlineID,
Name: server.Name,
IP: server.IP,
Port: server.Port,
IsVip: server.IsVip,
IsDebug: server.IsDebug,
IsOpen: server.IsOpen,
// ExpireTime: show.ExpireTime,
// ServerShow: show,
}
if show.Name != "" {
item.Name = show.Name
}
items = append(items, item)
}
}
return items
}
func (s *ServerService) GetServer() []model.ServerList {
item := s.getRawServers()
s.applyServerShowList(item, time.Now())
return item
}
func (s *ServerService) StartUPdate(OnlineID uint16, isinstall int) model.ServerList {
m := cool.DBM(s.Model).Where("online_id", OnlineID)
var tttt model.ServerList
m.Scan(&tttt)
if isinstall == 1 {
tttt.IsOpen = uint8(0)
m.Save(tttt)
}
return tttt
}
func (s *ServerService) SetServerID(OnlineID uint32, Port uint32) error {
m := cool.DBM(s.Model).Where("online_id", OnlineID)
var tttt model.ServerList
m.Scan(&tttt)
tttt.Port = Port
tttt.OnlineID = OnlineID
tttt.IsOpen = 1
m.Save(tttt)
return nil
}
func (s *ServerService) GetServerID(OnlineID uint32) model.ServerList {
var tttt model.ServerList
dbm_nocache_noenable(s.Model).Where("online_id", OnlineID).Scan(&tttt)
showMap := s.getPrimaryActiveServerShowMap([]uint32{OnlineID}, time.Now())
s.applyServerShow(&tttt, showMap[OnlineID], time.Now())
return tttt
}
// GetDonationAvailableServerIDs 返回当前可被冠名占用的服务器ID列表。
func (s *ServerService) GetDonationAvailableServerIDs() []uint32 {
servers := s.getRawServers()
ids := make([]uint32, 0, len(servers))
for _, server := range servers {
if server.OnlineID == 0 {
continue
}
ids = append(ids, server.OnlineID)
}
sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })
return ids
}
func (s *ServerService) GetOwnerActiveDonationServers(ownerID uint32) []DonationOwnedServerInfo {
if ownerID == 0 {
return []DonationOwnedServerInfo{}
}
now := time.Now()
var shows []model.ServerShow
dbm_nocache_noenable(model.NewServerShow()).Where("owner", ownerID).Scan(&shows)
if len(shows) == 0 {
return []DonationOwnedServerInfo{}
}
serverIDs := make([]uint32, 0, len(shows))
for i := range shows {
if !s.isActiveServerShow(&shows[i], now) {
continue
}
serverIDs = append(serverIDs, shows[i].ServerID)
}
if len(serverIDs) == 0 {
return []DonationOwnedServerInfo{}
}
var servers []model.ServerList
dbm_nocache_noenable(s.Model).WhereIn("online_id", serverIDs).Scan(&servers)
serverMap := make(map[uint32]model.ServerList, len(servers))
for i := range servers {
serverMap[servers[i].OnlineID] = servers[i]
}
items := make([]DonationOwnedServerInfo, 0, len(serverIDs))
for i := range shows {
show := &shows[i]
if !s.isActiveServerShow(show, now) {
continue
}
server, ok := serverMap[show.ServerID]
if !ok || show.ServerID == 0 {
continue
}
serverName := show.Name
if serverName == "" {
serverName = server.Name
}
items = append(items, DonationOwnedServerInfo{
ServerID: show.ServerID,
ServerName: serverName,
Remark: server.Desc,
ExpireTime: show.ExpireTime,
})
}
sort.Slice(items, func(i, j int) bool {
if !items[i].ExpireTime.Equal(items[j].ExpireTime) {
return items[i].ExpireTime.After(items[j].ExpireTime)
}
return items[i].ServerID < items[j].ServerID
})
return items
}
// CanUseDonationName 校验目标服务器在当前时间点是否允许被冠名。
func (s *ServerService) CanUseDonationName(server model.ServerList, ownerID uint32, now time.Time) bool {
return server.OnlineID != 0
}
func (s *ServerService) getRawServers() []model.ServerList {
var item []model.ServerList
dbm_nocache_noenable(s.Model).Scan(&item)
return item
}
func (s *ServerService) collectServerIDs(servers []model.ServerList) []uint32 {
serverIDs := make([]uint32, 0, len(servers))
for i := range servers {
if servers[i].OnlineID == 0 {
continue
}
serverIDs = append(serverIDs, servers[i].OnlineID)
}
return serverIDs
}
// 保存版本号
func (s *ServerService) SetServerScreen(id uint32, name string) {
cool.DBM(s.Model).Where("online_id", id).Data("old_screen", name).Update()
}
func (s *ServerService) GetFile() string {
var files []File
prefix := "logic"
delimiter := "" // 用于分隔目录
marker := "" // 初始标记为空
for {
entries, _, nextMarker, hasNext, err := s.manager.ListFiles(s.bucket, prefix, delimiter, marker, 100)
if err != nil {
return ""
}
for _, entry := range entries {
files = append(files, File{
Name: entry.Key,
Size: entry.Fsize,
Path: entry.Key,
Time: entry.PutTime,
})
}
if !hasNext {
break
}
marker = nextMarker
}
sort.Slice(files, func(i, j int) bool {
return files[i].Time > files[j].Time
})
if len(files) == 0 {
return ""
}
return files[0].Name
}
type File struct {
Name string `json:"name"`
Path string `json:"path"`
Url string `json:"url"`
Size int64 `json:"size"`
Modified string `json:"modified"`
Time int64 `json:"time"`
}
func (s *ServerService) isActiveServerShow(show *model.ServerShow, now time.Time) bool {
if show == nil {
return false
}
if show.ServerID == 0 || show.Owner == 0 {
return false
}
if show.ExpireTime.IsZero() {
return false
}
return show.ExpireTime.After(now)
}
func (s *ServerService) applyServerShowList(servers []model.ServerList, now time.Time) {
showMap := s.getPrimaryActiveServerShowMap(s.collectServerIDs(servers), now)
for i := range servers {
s.applyServerShow(&servers[i], showMap[servers[i].OnlineID], now)
}
}
func (s *ServerService) applyServerShow(server *model.ServerList, show *model.ServerShow, now time.Time) {
if server == nil {
return
}
server.ServerShow = nil
server.Owner = 0
server.ExpireTime = time.Time{}
if !s.isActiveServerShow(show, now) {
return
}
server.ServerShow = show
if show.Name != "" {
server.Name = show.Name
}
server.Owner = show.Owner
server.ExpireTime = show.ExpireTime
}
func (s *ServerService) getActiveServerShowListMap(serverIDs []uint32, now time.Time) map[uint32][]model.ServerShow {
showMap := make(map[uint32][]model.ServerShow, len(serverIDs))
if len(serverIDs) == 0 {
return showMap
}
var shows []model.ServerShow
dbm_nocache_noenable(model.NewServerShow()).WhereIn("server_id", serverIDs).Scan(&shows)
for i := range shows {
show := &shows[i]
if !s.isActiveServerShow(show, now) {
continue
}
showMap[show.ServerID] = append(showMap[show.ServerID], *show)
}
for serverID := range showMap {
sort.Slice(showMap[serverID], func(i, j int) bool {
left := showMap[serverID][i]
right := showMap[serverID][j]
if !left.ExpireTime.Equal(right.ExpireTime) {
return left.ExpireTime.After(right.ExpireTime)
}
return left.ID > right.ID
})
}
return showMap
}
func (s *ServerService) getPrimaryActiveServerShowMap(serverIDs []uint32, now time.Time) map[uint32]*model.ServerShow {
listMap := s.getActiveServerShowListMap(serverIDs, now)
showMap := make(map[uint32]*model.ServerShow, len(listMap))
for serverID := range listMap {
if len(listMap[serverID]) == 0 {
continue
}
show := listMap[serverID][0]
showMap[serverID] = &show
}
return showMap
}
func (s *ServerService) applyServerShowMap(serverMap *gmap.StrAnyMap, serverID uint32, showMap map[uint32]*model.ServerShow) {
if serverMap == nil {
return
}
serverMap.Set("owner", uint32(0))
serverMap.Set("expire_time", time.Time{})
show, ok := showMap[serverID]
if !ok {
return
}
if show.Name != "" {
serverMap.Set("name", show.Name)
}
serverMap.Set("owner", show.Owner)
serverMap.Set("expire_time", show.ExpireTime)
serverMap.Set("servershow", show)
return
}