From 590567bfa03a8c26576cddf7d5479ec2c4759c50 Mon Sep 17 00:00:00 2001
From: Hassan Dashtizadeh <101067119+Wolf6470@users.noreply.github.com>
Date: Wed, 5 Mar 2025 23:15:23 +0400
Subject: [PATCH] Update subController.go

---
 sub/subController.go | 63 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 60 insertions(+), 3 deletions(-)

diff --git a/sub/subController.go b/sub/subController.go
index 9afbc8da..110357dc 100644
--- a/sub/subController.go
+++ b/sub/subController.go
@@ -2,7 +2,10 @@ package sub
 
 import (
 	"encoding/base64"
+	"fmt"
+	"math"
 	"net"
+	"strconv"
 	"strings"
 
 	"github.com/gin-gonic/gin"
@@ -78,16 +81,42 @@ func (a *SUBController) subs(c *gin.Context) {
 		for _, sub := range subs {
 			result += sub + "\n"
 		}
+		resultSlice := strings.Split(strings.TrimSpace(result), "\n")
 
 		// Add headers
 		c.Writer.Header().Set("Subscription-Userinfo", header)
 		c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval)
 		c.Writer.Header().Set("Profile-Title", subId)
 
-		if a.subEncrypt {
-			c.String(200, base64.StdEncoding.EncodeToString([]byte(result)))
+		acceptHeader := c.GetHeader("Accept")
+		headerMap := parseHeaderString(header)
+		expireValue := headerMap["expire"]
+		upValue := formatBytes(headerMap["upload"], 2)
+		downValue := formatBytes(headerMap["download"], 2)
+		totalValue := formatBytes(headerMap["total"], 2)
+
+		currentURL := "https://" + c.Request.Host + c.Request.RequestURI
+
+		if strings.Contains(acceptHeader, "text/html") {
+			if a.subEncrypt {
+				c.String(200, base64.StdEncoding.EncodeToString([]byte(result)))
+			} else {
+				c.HTML(200, "sub.html", gin.H{
+					"result":   resultSlice,
+					"total":    totalValue,
+					"expire":   expireValue,
+					"upload":   upValue,
+					"download": downValue,
+					"sId":      subId,
+					"subUrl":   currentURL,
+				})
+			}
 		} else {
-			c.String(200, result)
+			if a.subEncrypt {
+				c.String(200, base64.StdEncoding.EncodeToString([]byte(result)))
+			} else {
+				c.String(200, result)
+			}
 		}
 	}
 }
@@ -132,3 +161,31 @@ func getHostFromXFH(s string) (string, error) {
 	}
 	return s, nil
 }
+
+func parseHeaderString(header string) map[string]string {
+	headerMap := make(map[string]string)
+	pairs := strings.Split(header, ";")
+	for _, pair := range pairs {
+		kv := strings.Split(strings.TrimSpace(pair), "=")
+		if len(kv) == 2 {
+			headerMap[kv[0]] = kv[1]
+		}
+	}
+	return headerMap
+}
+
+func formatBytes(sizeStr string, precision int) string {
+	// Convert the string input to a float64
+	size, _ := strconv.ParseFloat(sizeStr, 64)
+
+	if size == 0 {
+		return "0 B"
+	}
+
+	// Calculate base and suffix
+	base := math.Log(size) / math.Log(1024)
+	suffixes := []string{"B", "K", "M", "G", "T"}
+
+	value := math.Pow(1024, base-math.Floor(base))
+	return fmt.Sprintf("%.*f %s", precision, value, suffixes[int(math.Floor(base))])
+}