From bc0518391ef06d3d6b9f826085b73d1f1e35c913 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Sun, 14 Sep 2025 23:08:09 +0200 Subject: [PATCH] sub template enhancements --- sub/subController.go | 6 +++-- sub/subService.go | 62 +++++++++++--------------------------------- 2 files changed, 19 insertions(+), 49 deletions(-) diff --git a/sub/subController.go b/sub/subController.go index c37ff5a9..0e16a02d 100644 --- a/sub/subController.go +++ b/sub/subController.go @@ -2,6 +2,7 @@ package sub import ( "encoding/base64" + "fmt" "strings" "x-ui/config" @@ -59,7 +60,7 @@ func (a *SUBController) initRouter(g *gin.RouterGroup) { func (a *SUBController) subs(c *gin.Context) { subId := c.Param("subid") scheme, host, hostWithPort, hostHeader := a.subService.ResolveRequest(c) - subs, header, lastOnline, err := a.subService.GetSubs(subId, host) + subs, lastOnline, traffic, err := a.subService.GetSubs(subId, host) if err != nil || len(subs) == 0 { c.String(400, "Error!") } else { @@ -73,7 +74,7 @@ func (a *SUBController) subs(c *gin.Context) { if strings.Contains(strings.ToLower(accept), "text/html") || c.Query("html") == "1" || strings.EqualFold(c.Query("view"), "html") { // Build page data in service subURL, subJsonURL := a.subService.BuildURLs(scheme, hostWithPort, a.subPath, a.subJsonPath, subId) - page := a.subService.BuildPageData(subId, hostHeader, header, lastOnline, subs, subURL, subJsonURL) + page := a.subService.BuildPageData(subId, hostHeader, traffic, lastOnline, subs, subURL, subJsonURL) c.HTML(200, "subscription.html", gin.H{ "title": "subscription.title", "cur_ver": config.GetVersion(), @@ -99,6 +100,7 @@ func (a *SUBController) subs(c *gin.Context) { } // Add headers + header := fmt.Sprintf("upload=%d; download=%d; total=%d; expire=%d", traffic.Up, traffic.Down, traffic.Total, traffic.ExpiryTime/1000) a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle) if a.subEncrypt { diff --git a/sub/subService.go b/sub/subService.go index a47cb6be..ffad23a2 100644 --- a/sub/subService.go +++ b/sub/subService.go @@ -37,20 +37,19 @@ func NewSubService(showInfo bool, remarkModel string) *SubService { } } -func (s *SubService) GetSubs(subId string, host string) ([]string, string, int64, error) { +func (s *SubService) GetSubs(subId string, host string) ([]string, int64, xray.ClientTraffic, error) { s.address = host var result []string - var header string var traffic xray.ClientTraffic var lastOnline int64 var clientTraffics []xray.ClientTraffic inbounds, err := s.getInboundsBySubId(subId) if err != nil { - return nil, "", 0, err + return nil, 0, traffic, err } if len(inbounds) == 0 { - return nil, "", 0, common.NewError("No inbounds found with ", subId) + return nil, 0, traffic, common.NewError("No inbounds found with ", subId) } s.datepicker, err = s.settingService.GetDatepicker() @@ -108,8 +107,7 @@ func (s *SubService) GetSubs(subId string, host string) ([]string, string, int64 } } } - header = fmt.Sprintf("upload=%d; download=%d; total=%d; expire=%d", traffic.Up, traffic.Down, traffic.Total, traffic.ExpiryTime/1000) - return result, header, lastOnline, nil + return result, lastOnline, traffic, nil } func (s *SubService) getInboundsBySubId(subId string) ([]*model.Inbound, error) { @@ -1090,45 +1088,15 @@ func (s *SubService) BuildURLs(scheme, hostWithPort, subPath, subJsonPath, subId } // BuildPageData parses header and prepares the template view model. -func (s *SubService) BuildPageData(subId, hostHeader, header string, lastOnline int64, subs []string, subURL, subJsonURL string) PageData { - // Parse header values - var uploadByte, downloadByte, totalByte, expire int64 - parts := strings.Split(header, ";") - for _, p := range parts { - kv := strings.Split(strings.TrimSpace(p), "=") - if len(kv) != 2 { - continue - } - key := strings.ToLower(strings.TrimSpace(kv[0])) - val := strings.TrimSpace(kv[1]) - switch key { - case "upload": - if v, err := parseInt64(val); err == nil { - uploadByte = v - } - case "download": - if v, err := parseInt64(val); err == nil { - downloadByte = v - } - case "total": - if v, err := parseInt64(val); err == nil { - totalByte = v - } - case "expire": - if v, err := parseInt64(val); err == nil { - expire = v - } - } - } - - download := common.FormatTraffic(downloadByte) - upload := common.FormatTraffic(uploadByte) +func (s *SubService) BuildPageData(subId string, hostHeader string, traffic xray.ClientTraffic, lastOnline int64, subs []string, subURL, subJsonURL string) PageData { + download := common.FormatTraffic(traffic.Down) + upload := common.FormatTraffic(traffic.Up) total := "∞" - used := common.FormatTraffic(uploadByte + downloadByte) + used := common.FormatTraffic(traffic.Up + traffic.Down) remained := "" - if totalByte > 0 { - total = common.FormatTraffic(totalByte) - left := totalByte - (uploadByte + downloadByte) + if traffic.Total > 0 { + total = common.FormatTraffic(traffic.Total) + left := traffic.Total - (traffic.Up + traffic.Down) if left < 0 { left = 0 } @@ -1149,12 +1117,12 @@ func (s *SubService) BuildPageData(subId, hostHeader, header string, lastOnline Total: total, Used: used, Remained: remained, - Expire: expire, + Expire: traffic.ExpiryTime / 1000, LastOnline: lastOnline, Datepicker: datepicker, - DownloadByte: downloadByte, - UploadByte: uploadByte, - TotalByte: totalByte, + DownloadByte: traffic.Down, + UploadByte: traffic.Up, + TotalByte: traffic.Total, SubUrl: subURL, SubJsonUrl: subJsonURL, Result: subs,