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ů.

telegram.go 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package telegram
  2. import (
  3. "context"
  4. "fmt"
  5. "math/rand"
  6. "net"
  7. "strings"
  8. )
  9. type Telegram struct {
  10. dialer Dialer
  11. preferIP preferIP
  12. }
  13. func (t Telegram) Dial(ctx context.Context, dc int) (net.Conn, error) {
  14. if dc <= 0 || dc > 5 {
  15. return nil, fmt.Errorf("do not know how to dial to %d", dc)
  16. }
  17. var addresses []tgAddr
  18. if t.preferIP == preferIPOnlyIPv6 {
  19. addresses = []tgAddr{v6Addresses[dc-1]}
  20. } else {
  21. addresses = append(addresses, v4Addresses[dc-1]...)
  22. rand.Shuffle(len(addresses), func(i, j int) {
  23. addresses[i], addresses[j] = addresses[j], addresses[i]
  24. })
  25. }
  26. switch t.preferIP {
  27. case preferIPPreferIPv4:
  28. addresses = append(addresses, v6Addresses[dc-1])
  29. case preferIPPreferIPv6:
  30. addresses = append([]tgAddr{v6Addresses[dc-1]}, addresses...)
  31. case preferIPOnlyIPv4, preferIPOnlyIPv6:
  32. }
  33. var (
  34. conn net.Conn
  35. err error
  36. )
  37. for _, v := range addresses {
  38. conn, err = t.dialer.DialContext(ctx, v.network, v.address)
  39. if err == nil {
  40. return conn, nil
  41. }
  42. }
  43. return nil, fmt.Errorf("cannot dial to %d dc: %w", dc, err)
  44. }
  45. func New(dialer Dialer, ipPreference string) (*Telegram, error) {
  46. var pref preferIP
  47. switch strings.ToLower(ipPreference) {
  48. case "prefer-ipv4":
  49. pref = preferIPPreferIPv4
  50. case "prefer-ipv6":
  51. pref = preferIPPreferIPv6
  52. case "only-ipv4":
  53. pref = preferIPOnlyIPv4
  54. case "only-ipv6":
  55. pref = preferIPOnlyIPv6
  56. default:
  57. return nil, fmt.Errorf("unknown ip preference %s", ipPreference)
  58. }
  59. return &Telegram{
  60. dialer: dialer,
  61. preferIP: pref,
  62. }, nil
  63. }