2025-05-13 18:13:22 +08:00

159 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package internal
import (
"admin/lib/httpclient"
"admin/lib/xlog"
"net/url"
)
type ServerInfo struct {
ProjectId int `json:"project_id"`
ServerId string `json:"serverId"`
ServerName string `json:"serverName"`
Ccu int `json:"ccu"`
TotalRoleCount int `json:"total_role_count"`
TotalAccountCount int `json:"total_account_count"`
Addr string `json:"addr"`
IsServerDown bool `json:"open_whitelist_login"`
}
func (server *ServerInfo) Down(api string) error {
addr := api + "/gm"
params := &url.Values{}
params.Set("server", server.ServerId)
params.Set("cmd_data", "pauseServer")
params.Set("reason", "down")
rsp := make(map[string]any)
err := httpclient.Request(addr, "get", params, rsp)
if err != nil {
return err
}
xlog.Infof("操作项目:%v服务器:%v停服返回:%v", server.ProjectId, server.ServerId, rsp)
return nil
}
func (server *ServerInfo) Up(api string) error {
addr := api + "/gm"
params := &url.Values{}
params.Set("server", server.ServerId)
params.Set("cmd_data", "setWhite")
params.Set("open", "false")
rsp := make(map[string]any)
err := httpclient.Request(addr, "get", params, rsp)
if err != nil {
return err
}
xlog.Infof("操作项目:%v服务器:%v起服返回:%v", server.ProjectId, server.ServerId, rsp)
return nil
}
type ServerInfoList []*ServerInfo
type PageServerCountInfo struct {
Offset int
Count int
RawInfo *ServerInfo
}
type PageInfo struct {
PageNo int // 页数从1开始
Count int // 当前页的数量一般是pageLen但如果是最后一页可能不足
ServerList []*PageServerCountInfo // 参与组成这一页的服务器列表
}
func (list ServerInfoList) FindByID(serverId string) *ServerInfo {
for _, info := range list {
if info.ServerId == serverId {
return info
}
}
return nil
}
func (list ServerInfoList) TidyToPageList(pageLen int, queryCountField func(info *ServerInfo) int) (totalCount int, pageList []*PageInfo) {
curPageNo := 1
curPageNeedCount := pageLen
var curPageInfo *PageInfo
for _, serverInfo := range list {
serverCount := queryCountField(serverInfo)
totalCount += serverCount
serverRestCount := serverCount
serverAccOffset := 0
for {
if serverRestCount >= curPageNeedCount {
// 当前页数量足够,切下一页
if curPageInfo == nil {
curPageInfo = &PageInfo{
PageNo: curPageNo,
}
}
curPageInfo.Count += curPageNeedCount
curPageInfo.ServerList = append(curPageInfo.ServerList, &PageServerCountInfo{
RawInfo: serverInfo,
Offset: serverAccOffset,
Count: curPageNeedCount,
})
// 切下一个页
// 置空,等待下一次循环判断来创建
pageList = append(pageList, curPageInfo)
curPageInfo = nil
serverRestCount -= curPageNeedCount
serverAccOffset += curPageNeedCount
curPageNeedCount = pageLen
curPageNo += 1
if serverRestCount <= 0 {
// 当前服务器没有余额了,也要切下一个服务器
break
}
} else {
// 当前页还不够,切下一个服务器信息
if curPageInfo == nil {
curPageInfo = &PageInfo{
PageNo: curPageNo,
}
}
curPageInfo.Count += serverRestCount
curPageInfo.ServerList = append(curPageInfo.ServerList, &PageServerCountInfo{
RawInfo: serverInfo,
Offset: serverAccOffset,
Count: serverRestCount,
})
// 切下一个服务器,页面不切
serverAccOffset += serverRestCount
curPageNeedCount -= serverRestCount
break
}
}
}
if curPageInfo != nil { // 最后一页还没达到数量的
pageList = append(pageList, curPageInfo)
}
return
}
type RspData struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
List []*ServerInfo `json:"list"`
} `json:"data"`
}
func GetRemoteServerInfoList(alisrvAddr string) (ServerInfoList, error) {
rsp := &RspData{}
err := httpclient.Request(alisrvAddr+"/server", "get", nil, rsp)
if err != nil {
return nil, err
}
return rsp.Data.List, nil
}