mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-09-19 00:13:03 +00:00
sub template enhancements
Some checks failed
Release 3X-UI / build (386) (push) Has been cancelled
Release 3X-UI / build (amd64) (push) Has been cancelled
Release 3X-UI / build (arm64) (push) Has been cancelled
Release 3X-UI / build (armv5) (push) Has been cancelled
Release 3X-UI / build (armv6) (push) Has been cancelled
Release 3X-UI / build (armv7) (push) Has been cancelled
Release 3X-UI / build (s390x) (push) Has been cancelled
Release 3X-UI / Build for Windows (push) Has been cancelled
Some checks failed
Release 3X-UI / build (386) (push) Has been cancelled
Release 3X-UI / build (amd64) (push) Has been cancelled
Release 3X-UI / build (arm64) (push) Has been cancelled
Release 3X-UI / build (armv5) (push) Has been cancelled
Release 3X-UI / build (armv6) (push) Has been cancelled
Release 3X-UI / build (armv7) (push) Has been cancelled
Release 3X-UI / build (s390x) (push) Has been cancelled
Release 3X-UI / Build for Windows (push) Has been cancelled
This commit is contained in:
parent
5408a2f82c
commit
bc0518391e
2 changed files with 19 additions and 49 deletions
|
@ -2,6 +2,7 @@ package sub
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"x-ui/config"
|
"x-ui/config"
|
||||||
|
|
||||||
|
@ -59,7 +60,7 @@ func (a *SUBController) initRouter(g *gin.RouterGroup) {
|
||||||
func (a *SUBController) subs(c *gin.Context) {
|
func (a *SUBController) subs(c *gin.Context) {
|
||||||
subId := c.Param("subid")
|
subId := c.Param("subid")
|
||||||
scheme, host, hostWithPort, hostHeader := a.subService.ResolveRequest(c)
|
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 {
|
if err != nil || len(subs) == 0 {
|
||||||
c.String(400, "Error!")
|
c.String(400, "Error!")
|
||||||
} else {
|
} 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") {
|
if strings.Contains(strings.ToLower(accept), "text/html") || c.Query("html") == "1" || strings.EqualFold(c.Query("view"), "html") {
|
||||||
// Build page data in service
|
// Build page data in service
|
||||||
subURL, subJsonURL := a.subService.BuildURLs(scheme, hostWithPort, a.subPath, a.subJsonPath, subId)
|
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{
|
c.HTML(200, "subscription.html", gin.H{
|
||||||
"title": "subscription.title",
|
"title": "subscription.title",
|
||||||
"cur_ver": config.GetVersion(),
|
"cur_ver": config.GetVersion(),
|
||||||
|
@ -99,6 +100,7 @@ func (a *SUBController) subs(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add headers
|
// 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)
|
a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle)
|
||||||
|
|
||||||
if a.subEncrypt {
|
if a.subEncrypt {
|
||||||
|
|
|
@ -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
|
s.address = host
|
||||||
var result []string
|
var result []string
|
||||||
var header string
|
|
||||||
var traffic xray.ClientTraffic
|
var traffic xray.ClientTraffic
|
||||||
var lastOnline int64
|
var lastOnline int64
|
||||||
var clientTraffics []xray.ClientTraffic
|
var clientTraffics []xray.ClientTraffic
|
||||||
inbounds, err := s.getInboundsBySubId(subId)
|
inbounds, err := s.getInboundsBySubId(subId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", 0, err
|
return nil, 0, traffic, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(inbounds) == 0 {
|
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()
|
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, lastOnline, traffic, nil
|
||||||
return result, header, lastOnline, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SubService) getInboundsBySubId(subId string) ([]*model.Inbound, error) {
|
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.
|
// 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 {
|
func (s *SubService) BuildPageData(subId string, hostHeader string, traffic xray.ClientTraffic, lastOnline int64, subs []string, subURL, subJsonURL string) PageData {
|
||||||
// Parse header values
|
download := common.FormatTraffic(traffic.Down)
|
||||||
var uploadByte, downloadByte, totalByte, expire int64
|
upload := common.FormatTraffic(traffic.Up)
|
||||||
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)
|
|
||||||
total := "∞"
|
total := "∞"
|
||||||
used := common.FormatTraffic(uploadByte + downloadByte)
|
used := common.FormatTraffic(traffic.Up + traffic.Down)
|
||||||
remained := ""
|
remained := ""
|
||||||
if totalByte > 0 {
|
if traffic.Total > 0 {
|
||||||
total = common.FormatTraffic(totalByte)
|
total = common.FormatTraffic(traffic.Total)
|
||||||
left := totalByte - (uploadByte + downloadByte)
|
left := traffic.Total - (traffic.Up + traffic.Down)
|
||||||
if left < 0 {
|
if left < 0 {
|
||||||
left = 0
|
left = 0
|
||||||
}
|
}
|
||||||
|
@ -1149,12 +1117,12 @@ func (s *SubService) BuildPageData(subId, hostHeader, header string, lastOnline
|
||||||
Total: total,
|
Total: total,
|
||||||
Used: used,
|
Used: used,
|
||||||
Remained: remained,
|
Remained: remained,
|
||||||
Expire: expire,
|
Expire: traffic.ExpiryTime / 1000,
|
||||||
LastOnline: lastOnline,
|
LastOnline: lastOnline,
|
||||||
Datepicker: datepicker,
|
Datepicker: datepicker,
|
||||||
DownloadByte: downloadByte,
|
DownloadByte: traffic.Down,
|
||||||
UploadByte: uploadByte,
|
UploadByte: traffic.Up,
|
||||||
TotalByte: totalByte,
|
TotalByte: traffic.Total,
|
||||||
SubUrl: subURL,
|
SubUrl: subURL,
|
||||||
SubJsonUrl: subJsonURL,
|
SubJsonUrl: subJsonURL,
|
||||||
Result: subs,
|
Result: subs,
|
||||||
|
|
Loading…
Reference in a new issue