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