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.

base.go 1.3KB

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