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 символов.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package telegram
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "net"
  6. "time"
  7. "github.com/9seconds/mtg/conntypes"
  8. "github.com/9seconds/mtg/utils"
  9. "github.com/9seconds/mtg/wrappers"
  10. )
  11. const telegramDialTimeout = 10 * time.Second
  12. type baseTelegram struct {
  13. dialer net.Dialer
  14. secret []byte
  15. v4DefaultDC conntypes.DC
  16. V6DefaultDC conntypes.DC
  17. v4Addresses map[conntypes.DC][]string
  18. v6Addresses map[conntypes.DC][]string
  19. }
  20. func (b *baseTelegram) Secret() []byte {
  21. return b.secret
  22. }
  23. func (b *baseTelegram) dial(dc conntypes.DC,
  24. protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
  25. addr := ""
  26. switch protocol {
  27. case conntypes.ConnectionProtocolIPv4:
  28. addr = b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC)
  29. default:
  30. addr = b.chooseAddress(b.v6Addresses, dc, b.V6DefaultDC)
  31. }
  32. conn, err := b.dialer.Dial("tcp", addr)
  33. if err != nil {
  34. return nil, fmt.Errorf("dial has failed: %w", err)
  35. }
  36. if err := utils.InitTCP(conn); err != nil {
  37. return nil, fmt.Errorf("cannot initialize tcp socket: %w", err)
  38. }
  39. return wrappers.NewTelegramConn(conn), nil
  40. }
  41. func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
  42. dc, defaultDC conntypes.DC) string {
  43. addrs, ok := addresses[dc]
  44. if !ok {
  45. addrs, _ = addresses[defaultDC]
  46. }
  47. switch {
  48. case len(addrs) == 1:
  49. return addrs[0]
  50. case len(addrs) > 1:
  51. return addrs[rand.Intn(len(addrs))]
  52. }
  53. return ""
  54. }