Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

base.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package cli
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net"
  6. "net/url"
  7. "github.com/9seconds/mtg/v2/config"
  8. "github.com/9seconds/mtg/v2/mtglib/network"
  9. )
  10. type base struct {
  11. network network.Network
  12. conf *config.Config
  13. }
  14. func (b *base) ReadConfig(path, version string) error {
  15. content, err := ioutil.ReadFile(path)
  16. if err != nil {
  17. return fmt.Errorf("cannot read config file: %w", err)
  18. }
  19. conf, err := config.Parse(content)
  20. if err != nil {
  21. return fmt.Errorf("cannot parse config: %w", err)
  22. }
  23. ntw, err := b.makeNetwork(conf, version)
  24. if err != nil {
  25. return fmt.Errorf("cannot build a network: %w", err)
  26. }
  27. b.conf = conf
  28. b.network = ntw
  29. return nil
  30. }
  31. func (b *base) makeNetwork(conf *config.Config, version string) (network.Network, error) {
  32. tcpTimeout := conf.Network.Timeout.TCP.Value(network.DefaultTimeout)
  33. idleTimeout := conf.Network.Timeout.Idle.Value(network.DefaultIdleTimeout)
  34. dohIP := conf.Network.DOHIP.Value(net.ParseIP(network.DefaultDOHHostname)).String()
  35. bufferSize := conf.TCPBuffer.Value(network.DefaultBufferSize)
  36. userAgent := "mtg/" + version
  37. baseDialer, err := network.NewDefaultDialer(tcpTimeout, int(bufferSize))
  38. if err != nil {
  39. return nil, fmt.Errorf("cannot build a default dialer: %w", err)
  40. }
  41. proxyURLs := make([]*url.URL, 0, len(conf.Network.Proxies))
  42. for _, v := range conf.Network.Proxies {
  43. if value := v.Value(nil); value != nil {
  44. proxyURLs = append(proxyURLs, v.Value(nil))
  45. }
  46. }
  47. switch len(proxyURLs) {
  48. case 0:
  49. return network.NewNetwork(baseDialer, userAgent, dohIP, idleTimeout)
  50. case 1:
  51. socksDialer, err := network.NewSocks5Dialer(baseDialer, proxyURLs[0])
  52. if err != nil {
  53. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  54. }
  55. return network.NewNetwork(socksDialer, userAgent, dohIP, idleTimeout)
  56. }
  57. socksDialer, err := network.NewLoadBalancedSocks5Dialer(baseDialer, proxyURLs)
  58. if err != nil {
  59. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  60. }
  61. return network.NewNetwork(socksDialer, userAgent, dohIP, idleTimeout)
  62. }