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

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