mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 13:44:03 +03:00
FILE / ScuroNeko/mtg
internal/cli/utils.go
Исходный файл и его история в репозитории.
67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/url"
|
|
"os"
|
|
|
|
"github.com/9seconds/mtg/v2/internal/config2"
|
|
"github.com/9seconds/mtg/v2/mtglib"
|
|
"github.com/9seconds/mtg/v2/network"
|
|
)
|
|
|
|
func readTOMLConfig(path string) (*config2.Config, error) {
|
|
content, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot read config file: %w", err)
|
|
}
|
|
|
|
conf, err := config2.Parse(content)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot parse config: %w", err)
|
|
}
|
|
|
|
return conf, nil
|
|
}
|
|
|
|
func makeNetwork(conf *config2.Config, version string) (mtglib.Network, error) {
|
|
tcpTimeout := conf.Network.Timeout.TCP.Get(network.DefaultTimeout)
|
|
httpTimeout := conf.Network.Timeout.HTTP.Get(network.DefaultHTTPTimeout)
|
|
dohIP := conf.Network.DOHIP.Get(net.ParseIP(network.DefaultDOHHostname)).String()
|
|
bufferSize := conf.TCPBuffer.Get(network.DefaultBufferSize)
|
|
userAgent := "mtg/" + version
|
|
|
|
baseDialer, err := network.NewDefaultDialer(tcpTimeout, int(bufferSize))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot build a default dialer: %w", err)
|
|
}
|
|
|
|
if len(conf.Network.Proxies) == 0 {
|
|
return network.NewNetwork(baseDialer, userAgent, dohIP, httpTimeout) // nolint: wrapcheck
|
|
}
|
|
|
|
proxyURLs := make([]*url.URL, 0, len(conf.Network.Proxies))
|
|
for _, v := range conf.Network.Proxies {
|
|
if value := v.Get(nil); value != nil {
|
|
proxyURLs = append(proxyURLs, value)
|
|
}
|
|
}
|
|
|
|
if len(proxyURLs) == 1 {
|
|
socksDialer, err := network.NewSocks5Dialer(baseDialer, proxyURLs[0])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
|
|
}
|
|
|
|
return network.NewNetwork(socksDialer, userAgent, dohIP, httpTimeout) // nolint: wrapcheck
|
|
}
|
|
|
|
socksDialer, err := network.NewLoadBalancedSocks5Dialer(baseDialer, proxyURLs)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
|
|
}
|
|
|
|
return network.NewNetwork(socksDialer, userAgent, dohIP, httpTimeout) // nolint: wrapcheck
|
|
}
|