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
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package network
  2. import (
  3. "context"
  4. "errors"
  5. "math/rand"
  6. "net"
  7. "net/http"
  8. "github.com/9seconds/mtg/v2/essentials"
  9. "github.com/9seconds/mtg/v2/mtglib"
  10. )
  11. type multiNetwork struct {
  12. networks []mtglib.Network
  13. }
  14. func (m multiNetwork) Dial(network, address string) (essentials.Conn, error) {
  15. return m.DialContext(context.Background(), network, address)
  16. }
  17. func (m multiNetwork) DialContext(ctx context.Context, network, address string) (essentials.Conn, error) {
  18. networks := m.networks
  19. if len(networks) > 1 {
  20. networks = make([]mtglib.Network, len(m.networks))
  21. copy(networks, m.networks)
  22. rand.Shuffle(len(m.networks), func(i, j int) {
  23. networks[i], networks[j] = networks[j], networks[i]
  24. })
  25. }
  26. errs := make([]error, 1, len(networks)+1)
  27. errs[0] = ErrCannotDial
  28. for _, ntw := range networks {
  29. conn, err := ntw.DialContext(ctx, network, address)
  30. if err == nil {
  31. return conn, nil
  32. }
  33. errs = append(errs, err)
  34. }
  35. return nil, errors.Join(errs...)
  36. }
  37. func (m multiNetwork) NativeDialer() *net.Dialer {
  38. return m.networks[0].NativeDialer()
  39. }
  40. func (m multiNetwork) MakeHTTPClient(
  41. dialFunc func(context.Context, string, string) (essentials.Conn, error),
  42. ) *http.Client {
  43. if dialFunc == nil {
  44. dialFunc = m.DialContext
  45. }
  46. return m.networks[0].MakeHTTPClient(dialFunc)
  47. }
  48. func Join(networks ...mtglib.Network) (mtglib.Network, error) {
  49. if len(networks) == 0 {
  50. return nil, errors.New("cannot join no networks")
  51. }
  52. return multiNetwork{
  53. networks: networks,
  54. }, nil
  55. }