package controller import ( "github.com/gin-gonic/gin" "time" "x-ui/web/global" "x-ui/web/service" ) type ServerController struct { BaseController serverService service.ServerService lastStatus *service.Status lastGetStatusTime time.Time lastVersions []string lastGetVersionsTime time.Time } func NewServerController(g *gin.RouterGroup) *ServerController { a := &ServerController{ lastGetStatusTime: time.Now(), } a.initRouter(g) a.startTask() return a } func (a *ServerController) initRouter(g *gin.RouterGroup) { g = g.Group("/server") g.Use(a.checkLogin) g.POST("/status", a.status) g.POST("/getXrayVersion", a.getXrayVersion) g.POST("/installXray/:version", a.installXray) } func (a *ServerController) refreshStatus() { status := a.serverService.GetStatus(a.lastStatus) a.lastStatus = status } func (a *ServerController) startTask() { webServer := global.GetWebServer() ctx := webServer.GetCtx() go func() { for { select { case <-ctx.Done(): return default: } now := time.Now() if now.Sub(a.lastGetStatusTime) > time.Minute*3 { time.Sleep(time.Second * 2) continue } a.refreshStatus() } }() } func (a *ServerController) status(c *gin.Context) { a.lastGetStatusTime = time.Now() jsonObj(c, a.lastStatus, nil) } func (a *ServerController) getXrayVersion(c *gin.Context) { now := time.Now() if now.Sub(a.lastGetVersionsTime) <= time.Minute { jsonObj(c, a.lastVersions, nil) return } versions, err := a.serverService.GetXrayVersions() if err != nil { jsonMsg(c, "获取版本", err) return } a.lastVersions = versions a.lastGetVersionsTime = time.Now() jsonObj(c, versions, nil) } func (a *ServerController) installXray(c *gin.Context) { version := c.Param("version") err := a.serverService.UpdateXray(version) jsonMsg(c, "安装 xray", err) }