nezha/service/singleton/server.go

76 lines
1.9 KiB
Go
Raw Permalink Normal View History

2022-04-12 01:16:33 -04:00
package singleton
import (
"cmp"
"slices"
2022-04-12 01:16:33 -04:00
"sync"
2022-04-14 04:41:34 -04:00
2024-11-28 06:38:54 -05:00
"github.com/nezhahq/nezha/model"
"github.com/nezhahq/nezha/pkg/utils"
2022-04-12 01:16:33 -04:00
)
var (
2024-10-20 11:23:04 -04:00
ServerList map[uint64]*model.Server // [ServerID] -> model.Server
ServerUUIDToID map[string]uint64 // [ServerUUID] -> ServerID
ServerLock sync.RWMutex
2022-04-12 01:16:33 -04:00
SortedServerList []*model.Server // 用于存储服务器列表的 slice按照服务器 ID 排序
SortedServerListForGuest []*model.Server
SortedServerLock sync.RWMutex
2022-04-12 01:16:33 -04:00
)
func InitServer() {
ServerList = make(map[uint64]*model.Server)
2024-10-20 11:23:04 -04:00
ServerUUIDToID = make(map[string]uint64)
2022-04-12 01:16:33 -04:00
}
2024-07-14 07:41:50 -04:00
// loadServers 加载服务器列表并根据ID排序
func loadServers() {
2022-04-12 01:16:33 -04:00
InitServer()
var servers []model.Server
DB.Find(&servers)
for _, s := range servers {
innerS := s
innerS.Host = &model.Host{}
innerS.State = &model.HostState{}
innerS.GeoIP = new(model.GeoIP)
2022-04-12 01:16:33 -04:00
ServerList[innerS.ID] = &innerS
2024-10-20 11:23:04 -04:00
ServerUUIDToID[innerS.UUID] = innerS.ID
2022-04-12 01:16:33 -04:00
}
ReSortServer()
}
// ReSortServer 根据服务器ID 对服务器列表进行排序ID越大越靠前
func ReSortServer() {
ServerLock.RLock()
defer ServerLock.RUnlock()
SortedServerLock.Lock()
defer SortedServerLock.Unlock()
SortedServerList = utils.MapValuesToSlice(ServerList)
2022-04-12 01:16:33 -04:00
// 按照服务器 ID 排序的具体实现ID越大越靠前
slices.SortStableFunc(SortedServerList, func(a, b *model.Server) int {
if a.DisplayIndex == b.DisplayIndex {
return cmp.Compare(a.ID, b.ID)
2022-04-12 01:16:33 -04:00
}
return cmp.Compare(b.DisplayIndex, a.DisplayIndex)
2022-04-12 01:16:33 -04:00
})
SortedServerListForGuest = make([]*model.Server, 0, len(SortedServerList))
for _, s := range SortedServerList {
if !s.HideForGuest {
SortedServerListForGuest = append(SortedServerListForGuest, s)
}
}
2022-04-12 01:16:33 -04:00
}
func OnServerDelete(sid []uint64) {
ServerLock.Lock()
defer ServerLock.Unlock()
for _, id := range sid {
serverUUID := ServerList[id].UUID
delete(ServerUUIDToID, serverUUID)
delete(ServerList, id)
}
}