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
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

telegram.go 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package telegram
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "github.com/9seconds/mtg/v2/essentials"
  7. )
  8. type Telegram struct {
  9. dialer Dialer
  10. preferIP preferIP
  11. pool addressPool
  12. }
  13. func (t Telegram) Dial(ctx context.Context, dc int) (essentials.Conn, error) {
  14. var addresses []tgAddr
  15. switch t.preferIP {
  16. case preferIPOnlyIPv4:
  17. addresses = t.pool.getV4(dc)
  18. case preferIPOnlyIPv6:
  19. addresses = t.pool.getV6(dc)
  20. case preferIPPreferIPv4:
  21. addresses = append(t.pool.getV4(dc), t.pool.getV6(dc)...)
  22. case preferIPPreferIPv6:
  23. addresses = append(t.pool.getV6(dc), t.pool.getV4(dc)...)
  24. }
  25. var conn essentials.Conn
  26. err := ErrNoAddresses
  27. for _, v := range addresses {
  28. conn, err = t.dialer.DialContext(ctx, v.network, v.address)
  29. if err == nil {
  30. return conn, nil
  31. }
  32. }
  33. return nil, fmt.Errorf("cannot dial to %d dc: %w", dc, err)
  34. }
  35. func (t Telegram) IsKnownDC(dc int) bool {
  36. return t.pool.isValidDC(dc)
  37. }
  38. func (t Telegram) GetFallbackDC() int {
  39. return t.pool.getRandomDC()
  40. }
  41. func New(dialer Dialer, ipPreference string, useTestDCs bool) (*Telegram, error) {
  42. var pref preferIP
  43. switch strings.ToLower(ipPreference) {
  44. case "prefer-ipv4":
  45. pref = preferIPPreferIPv4
  46. case "prefer-ipv6":
  47. pref = preferIPPreferIPv6
  48. case "only-ipv4":
  49. pref = preferIPOnlyIPv4
  50. case "only-ipv6":
  51. pref = preferIPOnlyIPv6
  52. default:
  53. return nil, fmt.Errorf("unknown ip preference %s", ipPreference)
  54. }
  55. pool := addressPool{
  56. v4: productionV4Addresses,
  57. v6: productionV6Addresses,
  58. }
  59. if useTestDCs {
  60. pool.v4 = testV4Addresses
  61. pool.v6 = testV6Addresses
  62. }
  63. return &Telegram{
  64. dialer: dialer,
  65. preferIP: pref,
  66. pool: pool,
  67. }, nil
  68. }