| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package telegram
-
- import (
- "fmt"
- "math/rand"
- "net"
-
- "github.com/9seconds/mtg/conntypes"
- "github.com/9seconds/mtg/utils"
- "github.com/9seconds/mtg/wrappers/stream"
- )
-
- type baseTelegram struct {
- dialer net.Dialer
-
- secret []byte
- v4DefaultDC conntypes.DC
- V6DefaultDC conntypes.DC
- v4Addresses map[conntypes.DC][]string
- v6Addresses map[conntypes.DC][]string
- }
-
- func (b *baseTelegram) Secret() []byte {
- return b.secret
- }
-
- func (b *baseTelegram) dial(dc conntypes.DC,
- protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
- addr := ""
-
- switch protocol {
- case conntypes.ConnectionProtocolIPv4:
- addr = b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC)
- default:
- addr = b.chooseAddress(b.v6Addresses, dc, b.V6DefaultDC)
- }
-
- conn, err := b.dialer.Dial("tcp", addr)
- if err != nil {
- return nil, fmt.Errorf("dial has failed: %w", err)
- }
-
- if err := utils.InitTCP(conn); err != nil {
- return nil, fmt.Errorf("cannot initialize tcp socket: %w", err)
- }
-
- return stream.NewTelegramConn(dc, conn), nil
- }
-
- func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
- dc, defaultDC conntypes.DC) string {
- addrs, ok := addresses[dc]
- if !ok {
- addrs, _ = addresses[defaultDC]
- }
-
- switch {
- case len(addrs) == 1:
- return addrs[0]
- case len(addrs) > 1:
- return addrs[rand.Intn(len(addrs))]
- }
-
- return ""
- }
|