mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-09-18 01:06:40 +08:00
109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
// Package admin
|
|
// @Link https://github.com/bufanyun/hotgo
|
|
// @Copyright Copyright (c) 2022 HotGo CLI
|
|
// @Author Ms <133814250@qq.com>
|
|
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
|
//
|
|
package admin
|
|
|
|
import (
|
|
"context"
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"hotgo/api/backend/monitor"
|
|
"hotgo/internal/consts"
|
|
"hotgo/internal/model/input/form"
|
|
"hotgo/internal/websocket"
|
|
"hotgo/utility/simple"
|
|
"hotgo/utility/useragent"
|
|
"sort"
|
|
)
|
|
|
|
// Monitor 监控
|
|
var Monitor = cMonitor{
|
|
wsManager: websocket.Manager(),
|
|
}
|
|
|
|
type cMonitor struct {
|
|
wsManager *websocket.ClientManager
|
|
}
|
|
|
|
// Offline 下线用户
|
|
func (c *cMonitor) Offline(ctx context.Context, req *monitor.OfflineReq) (res *monitor.OfflineRes, err error) {
|
|
client := c.wsManager.GetClient(req.Id)
|
|
if client == nil {
|
|
err = gerror.New("客户端已离线")
|
|
return
|
|
}
|
|
|
|
simple.SafeGo(ctx, func(ctx context.Context) {
|
|
websocket.SendSuccess(client, "kick")
|
|
websocket.Close(client)
|
|
})
|
|
|
|
return res, nil
|
|
}
|
|
|
|
// View 获取指定信息
|
|
func (c *cMonitor) View(ctx context.Context, req *monitor.OnlineViewReq) (*monitor.OnlineViewRes, error) {
|
|
var res monitor.OnlineViewRes
|
|
// ...
|
|
return &res, nil
|
|
}
|
|
|
|
// OnlineList 获取在线列表
|
|
func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) (*monitor.OnlineListRes, error) {
|
|
var (
|
|
res monitor.OnlineListRes
|
|
clients []*monitor.OnlineModel
|
|
i int
|
|
)
|
|
|
|
if c.wsManager.GetClientsLen() == 0 {
|
|
return &res, nil
|
|
}
|
|
|
|
for c, _ := range c.wsManager.GetClients() {
|
|
if c.SendClose || c.User == nil {
|
|
continue
|
|
}
|
|
|
|
if req.UserId > 0 && req.UserId != c.User.Id {
|
|
continue
|
|
}
|
|
clients = append(clients, &monitor.OnlineModel{
|
|
ID: c.ID,
|
|
Addr: c.Addr,
|
|
Os: useragent.GetOs(c.UserAgent),
|
|
Browser: useragent.GetBrowser(c.UserAgent),
|
|
FirstTime: c.FirstTime,
|
|
HeartbeatTime: c.HeartbeatTime,
|
|
App: c.User.App,
|
|
UserId: c.User.Id,
|
|
Username: c.User.Username,
|
|
Avatar: c.User.Avatar,
|
|
ExpTime: c.User.Exp,
|
|
})
|
|
}
|
|
|
|
res.PageCount = form.CalPageCount(len(clients), req.PerPage)
|
|
res.Page = req.Page
|
|
res.PerPage = req.PerPage
|
|
|
|
sort.Sort(monitor.OnlineModels(clients))
|
|
isDemo, _ := g.Cfg().Get(ctx, "hotgo.isDemo", false)
|
|
_, perPage, offset := form.CalPage(ctx, req.Page, req.PerPage)
|
|
|
|
for k, v := range clients {
|
|
if k >= offset && i <= perPage {
|
|
i++
|
|
if isDemo.Bool() {
|
|
v.Addr = consts.DemoTips
|
|
}
|
|
res.List = append(res.List, v)
|
|
}
|
|
}
|
|
|
|
return &res, nil
|
|
}
|