This commit is contained in:
2023-09-12 18:40:24 +08:00
commit d894fea89e
25 changed files with 2179 additions and 0 deletions

35
api/controller/clash.go Normal file
View File

@ -0,0 +1,35 @@
package controller
import (
"net/http"
"net/url"
"sub/config"
"sub/validator"
"github.com/gin-gonic/gin"
"gopkg.in/yaml.v3"
)
func SubmodHandler(c *gin.Context) {
// 从请求中获取参数
var query validator.SubQuery
if err := c.ShouldBind(&query); err != nil {
c.String(http.StatusBadRequest, "参数错误: "+err.Error())
return
}
query.Sub, _ = url.QueryUnescape(query.Sub)
// 混合订阅和模板节点
sub, err := MixinSubTemp(query, config.Default.ClashTemplate)
if err != nil {
c.String(http.StatusInternalServerError, err.Error())
return
}
// 添加自定义节点、规则
// 输出
bytes, err := yaml.Marshal(sub)
if err != nil {
c.String(http.StatusInternalServerError, err.Error())
return
}
c.String(http.StatusOK, string(bytes))
}

51
api/controller/default.go Normal file
View File

@ -0,0 +1,51 @@
package controller
import (
"errors"
"gopkg.in/yaml.v3"
"strings"
"sub/model"
"sub/parser"
"sub/utils"
"sub/validator"
)
func MixinSubTemp(query validator.SubQuery, template string) (*model.Subscription, error) {
// 定义变量
var temp *model.Subscription
var sub *model.Subscription
// 加载模板
template, err := utils.LoadTemplate(template)
if err != nil {
return nil, errors.New("加载模板失败: " + err.Error())
}
// 解析模板
err = yaml.Unmarshal([]byte(template), &temp)
if err != nil {
return nil, errors.New("解析模板失败: " + err.Error())
}
// 加载订阅
data, err := utils.LoadSubscription(
query.Sub,
query.Refresh,
)
if err != nil {
return nil, errors.New("加载订阅失败: " + err.Error())
}
// 解析订阅
var proxyList []model.Proxy
err = yaml.Unmarshal(data, &sub)
if err != nil {
// 如果无法直接解析尝试Base64解码
base64, err := parser.DecodeBase64(string(data))
if err != nil {
return nil, errors.New("加载订阅失败: " + err.Error())
}
proxyList = utils.ParseProxy(strings.Split(base64, "\n")...)
} else {
proxyList = sub.Proxies
}
// 添加节点
utils.AddProxy(temp, proxyList...)
return temp, nil
}

36
api/controller/meta.go Normal file
View File

@ -0,0 +1,36 @@
package controller
import (
_ "embed"
"net/http"
"net/url"
"sub/config"
"sub/validator"
"github.com/gin-gonic/gin"
"gopkg.in/yaml.v3"
)
func SubHandler(c *gin.Context) {
// 从请求中获取参数
var query validator.SubQuery
if err := c.ShouldBind(&query); err != nil {
c.String(http.StatusBadRequest, "参数错误: "+err.Error())
return
}
query.Sub, _ = url.QueryUnescape(query.Sub)
// 混合订阅和模板节点
sub, err := MixinSubTemp(query, config.Default.MetaTemplate)
if err != nil {
c.String(http.StatusInternalServerError, err.Error())
return
}
// 添加自定义节点、规则
// 输出
marshal, err := yaml.Marshal(sub)
if err != nil {
c.String(http.StatusInternalServerError, "YAML序列化失败: "+err.Error())
return
}
c.String(http.StatusOK, string(marshal))
}

19
api/route.go Normal file
View File

@ -0,0 +1,19 @@
package api
import (
"github.com/gin-gonic/gin"
"sub/api/controller"
)
func SetRoute(r *gin.Engine) {
r.GET(
"/clash", func(c *gin.Context) {
controller.SubmodHandler(c)
},
)
r.GET(
"/meta", func(c *gin.Context) {
controller.SubHandler(c)
},
)
}