Files
sing-box-extended/parser/sip008/parser.go

54 lines
1.4 KiB
Go

package sip008
import (
"context"
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/option"
E "github.com/sagernet/sing/common/exceptions"
"github.com/sagernet/sing/common/json"
)
type ShadowsocksDocument struct {
Version int `json:"version"`
Servers []ShadowsocksServerDocument `json:"servers"`
}
type ShadowsocksServerDocument struct {
ID string `json:"id"`
Remarks string `json:"remarks"`
Server string `json:"server"`
ServerPort int `json:"server_port"`
Password string `json:"password"`
Method string `json:"method"`
Plugin string `json:"plugin"`
PluginOpts string `json:"plugin_opts"`
}
func ParseSIP008Subscription(_ context.Context, content string) ([]option.Outbound, error) {
var document ShadowsocksDocument
err := json.Unmarshal([]byte(content), &document)
if err != nil {
return nil, E.Cause(err, "parse SIP008 document")
}
var servers []option.Outbound
for _, server := range document.Servers {
servers = append(servers, option.Outbound{
Type: C.TypeShadowsocks,
Tag: server.Remarks,
Options: &option.ShadowsocksOutboundOptions{
ServerOptions: option.ServerOptions{
Server: server.Server,
ServerPort: uint16(server.ServerPort),
},
Password: server.Password,
Method: server.Method,
Plugin: server.Plugin,
PluginOptions: server.PluginOpts,
},
})
}
return servers, nil
}