2026-01-01 19:57:39 +08:00
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
import (
|
2026-01-23 13:44:31 +08:00
|
|
|
"blazing/common/utils"
|
2026-01-01 19:57:39 +08:00
|
|
|
"blazing/cool"
|
|
|
|
|
"blazing/modules/config/model"
|
2026-01-23 13:44:31 +08:00
|
|
|
"fmt"
|
2026-01-06 23:25:49 +08:00
|
|
|
"sort"
|
2026-04-08 15:49:03 +08:00
|
|
|
"time"
|
2026-01-03 10:20:36 +00:00
|
|
|
|
2026-04-10 19:36:59 +08:00
|
|
|
"github.com/gogf/gf/v2/container/gmap"
|
2026-01-08 03:30:18 +08:00
|
|
|
"github.com/gogf/gf/v2/database/gdb"
|
2026-01-08 03:55:24 +08:00
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
|
|
|
"github.com/gogf/gf/v2/util/gconv"
|
2026-01-06 23:25:49 +08:00
|
|
|
"github.com/qiniu/go-sdk/v7/auth/qbox"
|
|
|
|
|
"github.com/qiniu/go-sdk/v7/storage"
|
2026-01-01 19:57:39 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type ServerService struct {
|
|
|
|
|
*cool.Service
|
2026-01-06 23:25:49 +08:00
|
|
|
manager *storage.BucketManager
|
|
|
|
|
bucket string
|
2026-01-01 19:57:39 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-10 19:36:59 +08:00
|
|
|
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"`
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-01 19:57:39 +08:00
|
|
|
func NewServerService() *ServerService {
|
2026-01-06 23:25:49 +08:00
|
|
|
cf := &ServerService{
|
|
|
|
|
Service: &cool.Service{
|
2026-01-01 19:57:39 +08:00
|
|
|
Model: model.NewServerList(),
|
2026-04-10 19:36:59 +08:00
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
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)
|
|
|
|
|
}
|
2026-04-13 10:21:13 +08:00
|
|
|
showMap := cf.getPrimaryActiveServerShowMap(serverIDs, now)
|
2026-04-10 19:36:59 +08:00
|
|
|
|
|
|
|
|
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)
|
2026-01-08 03:55:24 +08:00
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
} else {
|
|
|
|
|
subm.Set("isonline", 0)
|
|
|
|
|
}
|
|
|
|
|
rr = append(rr, subm.MapStrAny())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
data.(map[string]interface{})["list"] = rr
|
|
|
|
|
return data
|
2026-01-01 19:57:39 +08:00
|
|
|
},
|
|
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
|
2026-01-06 23:25:49 +08:00
|
|
|
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
|
2026-01-01 19:57:39 +08:00
|
|
|
}
|
2026-01-25 23:17:46 +08:00
|
|
|
|
2026-04-10 19:36:59 +08:00
|
|
|
func (s *ServerService) GetPort(DepartmentID uint) []ServerShowInfo {
|
2026-04-13 10:21:13 +08:00
|
|
|
servers := s.getRawServers()
|
|
|
|
|
now := time.Now()
|
|
|
|
|
showMap := s.getActiveServerShowListMap(s.collectServerIDs(servers), now)
|
2026-04-10 19:36:59 +08:00
|
|
|
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,
|
2026-04-13 10:21:13 +08:00
|
|
|
Owner: 0,
|
|
|
|
|
ExpireTime: time.Time{},
|
2026-04-10 19:36:59 +08:00
|
|
|
})
|
2026-04-13 10:21:13 +08:00
|
|
|
for i := range showMap[server.OnlineID] {
|
|
|
|
|
show := &showMap[server.OnlineID][i]
|
|
|
|
|
item := ServerShowInfo{
|
|
|
|
|
OnlineID: server.OnlineID,
|
|
|
|
|
Name: server.Name,
|
|
|
|
|
IP: server.IP,
|
|
|
|
|
Port: server.Port,
|
|
|
|
|
IsVip: server.IsVip,
|
|
|
|
|
IsDebug: server.IsDebug,
|
|
|
|
|
IsOpen: server.IsOpen,
|
|
|
|
|
Owner: show.Owner,
|
|
|
|
|
ExpireTime: show.ExpireTime,
|
|
|
|
|
ServerShow: show,
|
|
|
|
|
}
|
|
|
|
|
if show.Name != "" {
|
|
|
|
|
item.Name = show.Name
|
|
|
|
|
}
|
|
|
|
|
items = append(items, item)
|
|
|
|
|
}
|
2026-01-25 23:17:46 +08:00
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
return items
|
2026-01-04 00:16:49 +08:00
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
|
2026-01-08 03:30:18 +08:00
|
|
|
func (s *ServerService) GetServer() []model.ServerList {
|
2026-04-13 10:21:13 +08:00
|
|
|
item := s.getRawServers()
|
2026-04-10 19:36:59 +08:00
|
|
|
s.applyServerShowList(item, time.Now())
|
2026-01-08 03:30:18 +08:00
|
|
|
return item
|
|
|
|
|
}
|
2026-01-09 08:31:30 +08:00
|
|
|
|
2026-04-10 19:36:59 +08:00
|
|
|
func (s *ServerService) StartUPdate(OnlineID uint16, isinstall int) model.ServerList {
|
2026-01-23 20:34:52 +00:00
|
|
|
m := cool.DBM(s.Model).Where("online_id", OnlineID)
|
|
|
|
|
var tttt model.ServerList
|
|
|
|
|
m.Scan(&tttt)
|
2026-01-25 23:17:46 +08:00
|
|
|
if isinstall == 1 {
|
|
|
|
|
tttt.IsOpen = uint8(0)
|
|
|
|
|
m.Save(tttt)
|
|
|
|
|
}
|
2026-01-23 20:34:52 +00:00
|
|
|
return tttt
|
|
|
|
|
}
|
2026-01-09 19:58:12 +08:00
|
|
|
|
2026-04-10 19:36:59 +08:00
|
|
|
func (s *ServerService) SetServerID(OnlineID uint32, Port uint32) error {
|
2026-01-09 19:58:12 +08:00
|
|
|
m := cool.DBM(s.Model).Where("online_id", OnlineID)
|
|
|
|
|
var tttt model.ServerList
|
|
|
|
|
m.Scan(&tttt)
|
|
|
|
|
tttt.Port = Port
|
|
|
|
|
tttt.OnlineID = OnlineID
|
2026-01-23 20:34:52 +00:00
|
|
|
tttt.IsOpen = 1
|
2026-01-09 19:58:12 +08:00
|
|
|
m.Save(tttt)
|
|
|
|
|
return nil
|
2026-01-09 08:31:30 +08:00
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
|
2026-03-02 18:34:20 +08:00
|
|
|
func (s *ServerService) GetServerID(OnlineID uint32) model.ServerList {
|
2026-01-09 19:58:12 +08:00
|
|
|
var tttt model.ServerList
|
2026-04-13 10:21:13 +08:00
|
|
|
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())
|
2026-01-09 19:58:12 +08:00
|
|
|
return tttt
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-08 19:31:44 +08:00
|
|
|
// GetDonationAvailableServerIDs 返回当前可被冠名占用的服务器ID列表。
|
2026-04-08 15:49:03 +08:00
|
|
|
func (s *ServerService) GetDonationAvailableServerIDs() []uint32 {
|
2026-04-13 10:21:13 +08:00
|
|
|
servers := s.getRawServers()
|
2026-04-10 19:36:59 +08:00
|
|
|
ids := make([]uint32, 0, len(servers))
|
|
|
|
|
for _, server := range servers {
|
|
|
|
|
if server.OnlineID == 0 {
|
2026-04-08 15:49:03 +08:00
|
|
|
continue
|
|
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
ids = append(ids, server.OnlineID)
|
2026-04-08 15:49:03 +08:00
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })
|
2026-04-08 15:49:03 +08:00
|
|
|
return ids
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-08 19:31:44 +08:00
|
|
|
// CanUseDonationName 校验目标服务器在当前时间点是否允许被冠名。
|
2026-04-10 19:36:59 +08:00
|
|
|
func (s *ServerService) CanUseDonationName(server model.ServerList, ownerID uint32, now time.Time) bool {
|
2026-04-13 10:21:13 +08:00
|
|
|
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)
|
2026-04-08 15:49:03 +08:00
|
|
|
}
|
2026-04-13 10:21:13 +08:00
|
|
|
return serverIDs
|
2026-04-08 15:49:03 +08:00
|
|
|
}
|
|
|
|
|
|
2026-01-23 20:34:52 +00:00
|
|
|
// 保存版本号
|
2026-03-02 18:34:20 +08:00
|
|
|
func (s *ServerService) SetServerScreen(id uint32, name string) {
|
2026-02-14 13:15:10 +08:00
|
|
|
cool.DBM(s.Model).Where("online_id", id).Data("old_screen", name).Update()
|
2026-01-09 08:31:30 +08:00
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
|
2026-01-09 08:31:30 +08:00
|
|
|
func (s *ServerService) GetFile() string {
|
2026-01-06 23:25:49 +08:00
|
|
|
var files []File
|
|
|
|
|
prefix := "logic"
|
|
|
|
|
delimiter := "" // 用于分隔目录
|
|
|
|
|
marker := "" // 初始标记为空
|
|
|
|
|
for {
|
|
|
|
|
entries, _, nextMarker, hasNext, err := s.manager.ListFiles(s.bucket, prefix, delimiter, marker, 100)
|
|
|
|
|
if err != nil {
|
2026-01-09 08:31:30 +08:00
|
|
|
return ""
|
2026-01-06 23:25:49 +08:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
})
|
2026-04-10 19:36:59 +08:00
|
|
|
if len(files) == 0 {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
2026-01-23 20:34:52 +00:00
|
|
|
return files[0].Name
|
2026-01-06 23:25:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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"`
|
|
|
|
|
}
|
2026-04-10 19:36:59 +08:00
|
|
|
|
|
|
|
|
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) {
|
2026-04-13 10:21:13 +08:00
|
|
|
showMap := s.getPrimaryActiveServerShowMap(s.collectServerIDs(servers), now)
|
2026-04-10 19:36:59 +08:00
|
|
|
for i := range servers {
|
2026-04-13 10:21:13 +08:00
|
|
|
s.applyServerShow(&servers[i], showMap[servers[i].OnlineID], now)
|
2026-04-10 19:36:59 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-13 10:21:13 +08:00
|
|
|
func (s *ServerService) applyServerShow(server *model.ServerList, show *model.ServerShow, now time.Time) {
|
2026-04-10 19:36:59 +08:00
|
|
|
if server == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-04-13 10:21:13 +08:00
|
|
|
server.ServerShow = nil
|
2026-04-10 19:36:59 +08:00
|
|
|
server.Owner = 0
|
|
|
|
|
server.ExpireTime = time.Time{}
|
2026-04-13 10:21:13 +08:00
|
|
|
if !s.isActiveServerShow(show, now) {
|
2026-04-10 19:36:59 +08:00
|
|
|
return
|
|
|
|
|
}
|
2026-04-13 10:21:13 +08:00
|
|
|
server.ServerShow = show
|
|
|
|
|
if show.Name != "" {
|
|
|
|
|
server.Name = show.Name
|
2026-04-10 19:36:59 +08:00
|
|
|
}
|
2026-04-13 10:21:13 +08:00
|
|
|
server.Owner = show.Owner
|
|
|
|
|
server.ExpireTime = show.ExpireTime
|
2026-04-10 19:36:59 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-13 10:21:13 +08:00
|
|
|
func (s *ServerService) getActiveServerShowListMap(serverIDs []uint32, now time.Time) map[uint32][]model.ServerShow {
|
|
|
|
|
showMap := make(map[uint32][]model.ServerShow, len(serverIDs))
|
2026-04-10 19:36:59 +08:00
|
|
|
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
|
|
|
|
|
}
|
2026-04-13 10:21:13 +08:00
|
|
|
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
|
2026-04-10 19:36:59 +08:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
}
|