|
|
@@ -1,10 +1,12 @@
|
|
1
|
1
|
package telegram
|
|
2
|
2
|
|
|
3
|
3
|
import (
|
|
4
|
|
- "fmt"
|
|
|
4
|
+ "errors"
|
|
5
|
5
|
"math/rand"
|
|
6
|
6
|
"net"
|
|
7
|
7
|
|
|
|
8
|
+ "go.uber.org/zap"
|
|
|
9
|
+
|
|
8
|
10
|
"github.com/9seconds/mtg/conntypes"
|
|
9
|
11
|
"github.com/9seconds/mtg/utils"
|
|
10
|
12
|
"github.com/9seconds/mtg/wrappers/stream"
|
|
|
@@ -12,10 +14,11 @@ import (
|
|
12
|
14
|
|
|
13
|
15
|
type baseTelegram struct {
|
|
14
|
16
|
dialer net.Dialer
|
|
|
17
|
+ logger *zap.SugaredLogger
|
|
15
|
18
|
|
|
16
|
19
|
secret []byte
|
|
17
|
20
|
v4DefaultDC conntypes.DC
|
|
18
|
|
- V6DefaultDC conntypes.DC
|
|
|
21
|
+ v6DefaultDC conntypes.DC
|
|
19
|
22
|
v4Addresses map[conntypes.DC][]string
|
|
20
|
23
|
v6Addresses map[conntypes.DC][]string
|
|
21
|
24
|
}
|
|
|
@@ -26,25 +29,32 @@ func (b *baseTelegram) Secret() []byte {
|
|
26
|
29
|
|
|
27
|
30
|
func (b *baseTelegram) dial(dc conntypes.DC,
|
|
28
|
31
|
protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
|
|
29
|
|
- addr := ""
|
|
|
32
|
+ addresses := make([]string, 0, 2)
|
|
30
|
33
|
|
|
31
|
|
- switch protocol {
|
|
32
|
|
- case conntypes.ConnectionProtocolIPv4:
|
|
33
|
|
- addr = b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC)
|
|
34
|
|
- default:
|
|
35
|
|
- addr = b.chooseAddress(b.v6Addresses, dc, b.V6DefaultDC)
|
|
|
34
|
+ if protocol&conntypes.ConnectionProtocolIPv6 != 0 {
|
|
|
35
|
+ addresses = append(addresses, b.chooseAddress(b.v6Addresses, dc, b.v6DefaultDC))
|
|
36
|
36
|
}
|
|
37
|
37
|
|
|
38
|
|
- conn, err := b.dialer.Dial("tcp", addr)
|
|
39
|
|
- if err != nil {
|
|
40
|
|
- return nil, fmt.Errorf("dial has failed: %w", err)
|
|
|
38
|
+ if protocol&conntypes.ConnectionProtocolIPv4 != 0 {
|
|
|
39
|
+ addresses = append(addresses, b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC))
|
|
41
|
40
|
}
|
|
42
|
41
|
|
|
43
|
|
- if err := utils.InitTCP(conn); err != nil {
|
|
44
|
|
- return nil, fmt.Errorf("cannot initialize tcp socket: %w", err)
|
|
|
42
|
+ for _, addr := range addresses {
|
|
|
43
|
+ conn, err := b.dialer.Dial("tcp", addr)
|
|
|
44
|
+ if err != nil {
|
|
|
45
|
+ b.logger.Infow("Cannot dial to Telegram", "address", addr, "error", err)
|
|
|
46
|
+ continue
|
|
|
47
|
+ }
|
|
|
48
|
+
|
|
|
49
|
+ if err := utils.InitTCP(conn); err != nil {
|
|
|
50
|
+ b.logger.Infow("Cannot initialize TCP socket", "address", addr, "error", err)
|
|
|
51
|
+ continue
|
|
|
52
|
+ }
|
|
|
53
|
+
|
|
|
54
|
+ return stream.NewTelegramConn(dc, conn), nil
|
|
45
|
55
|
}
|
|
46
|
56
|
|
|
47
|
|
- return stream.NewTelegramConn(dc, conn), nil
|
|
|
57
|
+ return nil, errors.New("cannot dial to the chosen DC")
|
|
48
|
58
|
}
|
|
49
|
59
|
|
|
50
|
60
|
func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
|