Преглед изворни кода

Fetch DC ips from Telegram

tags/v2.1.9^2
9seconds пре 2 месеци
родитељ
комит
852ca713c8

+ 29
- 0
go.mod Прегледај датотеку

@@ -28,23 +28,52 @@ require (
28 28
 )
29 29
 
30 30
 require (
31
+	github.com/gotd/td v0.139.0
31 32
 	github.com/txthinking/socks5 v0.0.0-20251011041537-5c31f201a10e
32 33
 	github.com/yl2chen/cidranger v1.0.2
33 34
 )
34 35
 
35 36
 require (
36 37
 	github.com/beorn7/perks v1.0.1 // indirect
38
+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
37 39
 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
40
+	github.com/coder/websocket v1.8.14 // indirect
38 41
 	github.com/davecgh/go-spew v1.1.1 // indirect
42
+	github.com/dlclark/regexp2 v1.11.5 // indirect
43
+	github.com/fatih/color v1.18.0 // indirect
44
+	github.com/ghodss/yaml v1.0.0 // indirect
45
+	github.com/go-faster/errors v0.7.1 // indirect
46
+	github.com/go-faster/jx v1.2.0 // indirect
47
+	github.com/go-faster/xor v1.0.0 // indirect
48
+	github.com/go-faster/yaml v0.4.6 // indirect
49
+	github.com/google/uuid v1.6.0 // indirect
50
+	github.com/gotd/ige v0.2.2 // indirect
51
+	github.com/gotd/neo v0.1.5 // indirect
52
+	github.com/klauspost/compress v1.18.3 // indirect
39 53
 	github.com/kr/text v0.2.0 // indirect
40 54
 	github.com/mattn/go-colorable v0.1.14 // indirect
41 55
 	github.com/mattn/go-isatty v0.0.20 // indirect
42 56
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
57
+	github.com/ogen-go/ogen v1.16.0 // indirect
43 58
 	github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
44 59
 	github.com/pmezard/go-difflib v1.0.0 // indirect
45 60
 	github.com/prometheus/client_model v0.6.2 // indirect
61
+	github.com/segmentio/asm v1.2.1 // indirect
62
+	github.com/shopspring/decimal v1.4.0 // indirect
46 63
 	github.com/txthinking/runnergroup v0.0.0-20250224021307-5864ffeb65ae // indirect
64
+	go.opentelemetry.io/otel v1.40.0 // indirect
65
+	go.opentelemetry.io/otel/metric v1.40.0 // indirect
66
+	go.opentelemetry.io/otel/trace v1.40.0 // indirect
67
+	go.uber.org/atomic v1.11.0 // indirect
68
+	go.uber.org/multierr v1.11.0 // indirect
69
+	go.uber.org/zap v1.27.1 // indirect
47 70
 	go.yaml.in/yaml/v2 v2.4.3 // indirect
71
+	golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 // indirect
72
+	golang.org/x/mod v0.32.0 // indirect
48 73
 	golang.org/x/sync v0.19.0 // indirect
74
+	golang.org/x/text v0.34.0 // indirect
75
+	golang.org/x/tools v0.41.0 // indirect
76
+	gopkg.in/yaml.v2 v2.4.0 // indirect
49 77
 	gopkg.in/yaml.v3 v3.0.1 // indirect
78
+	rsc.io/qr v0.2.0 // indirect
50 79
 )

+ 61
- 0
go.sum Прегледај датотеку

@@ -14,8 +14,12 @@ github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 h1:4NNbNM
14 14
 github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6/go.mod h1:J29hk+f9lJrblVIfiJOtTFk+OblBawmib4uz/VdKzlg=
15 15
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
16 16
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
17
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
18
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
17 19
 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
18 20
 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
21
+github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=
22
+github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
19 23
 github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
20 24
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
21 25
 github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U=
@@ -23,15 +27,40 @@ github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkE
23 27
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
24 28
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
25 29
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
30
+github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
31
+github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
32
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
33
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
34
+github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
35
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
36
+github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg=
37
+github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo=
38
+github.com/go-faster/jx v1.2.0 h1:T2YHJPrFaYu21fJtUxC9GzmluKu8rVIFDwwGBKTDseI=
39
+github.com/go-faster/jx v1.2.0/go.mod h1:UWLOVDmMG597a5tBFPLIWJdUxz5/2emOpfsj9Neg0PE=
40
+github.com/go-faster/xor v0.3.0/go.mod h1:x5CaDY9UKErKzqfRfFZdfu+OSTfoZny3w5Ak7UxcipQ=
41
+github.com/go-faster/xor v1.0.0 h1:2o8vTOgErSGHP3/7XwA5ib1FTtUsNtwCoLLBjl31X38=
42
+github.com/go-faster/xor v1.0.0/go.mod h1:x5CaDY9UKErKzqfRfFZdfu+OSTfoZny3w5Ak7UxcipQ=
43
+github.com/go-faster/yaml v0.4.6 h1:lOK/EhI04gCpPgPhgt0bChS6bvw7G3WwI8xxVe0sw9I=
44
+github.com/go-faster/yaml v0.4.6/go.mod h1:390dRIvV4zbnO7qC9FGo6YYutc+wyyUSHBgbXL52eXk=
26 45
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
27 46
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
28 47
 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
48
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
49
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
50
+github.com/gotd/ige v0.2.2 h1:XQ9dJZwBfDnOGSTxKXBGP4gMud3Qku2ekScRjDWWfEk=
51
+github.com/gotd/ige v0.2.2/go.mod h1:tuCRb+Y5Y3eNTo3ypIfNpQ4MFjrnONiL2jN2AKZXmb0=
52
+github.com/gotd/neo v0.1.5 h1:oj0iQfMbGClP8xI59x7fE/uHoTJD7NZH9oV1WNuPukQ=
53
+github.com/gotd/neo v0.1.5/go.mod h1:9A2a4bn9zL6FADufBdt7tZt+WMhvZoc5gWXihOPoiBQ=
54
+github.com/gotd/td v0.139.0 h1:3viuXqNdC0+mmd5GerDFp/rlII/QcZSzh/pjuG56NSU=
55
+github.com/gotd/td v0.139.0/go.mod h1:nBietiOYxaXEo6PmRp73LL64upWlk9rcFEZSJu6VieY=
29 56
 github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
30 57
 github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
31 58
 github.com/jarcoal/httpmock v1.0.8 h1:8kI16SoO6LQKgPE7PvQuV+YuD/inwHd7fOOe2zMbo4k=
32 59
 github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
33 60
 github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
34 61
 github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
62
+github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw=
63
+github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
35 64
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
36 65
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
37 66
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -51,6 +80,8 @@ github.com/miekg/dns v1.1.51 h1:0+Xg7vObnhrz/4ZCZcZh7zPXlmU0aveS2HDBd0m0qSo=
51 80
 github.com/miekg/dns v1.1.51/go.mod h1:2Z9d3CP1LQWihRZUf29mQ19yDThaI4DAYzte2CaQW5c=
52 81
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
53 82
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
83
+github.com/ogen-go/ogen v1.16.0 h1:fKHEYokW/QrMzVNXId74/6RObRIUs9T2oroGKtR25Iw=
84
+github.com/ogen-go/ogen v1.16.0/go.mod h1:s3nWiMzybSf8fhxckyO+wtto92+QHpEL8FmkPnhL3jI=
54 85
 github.com/panjf2000/ants/v2 v2.11.5 h1:a7LMnMEeux/ebqTux140tRiaqcFTV0q2bEHF03nl6Rg=
55 86
 github.com/panjf2000/ants/v2 v2.11.5/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek=
56 87
 github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
@@ -70,9 +101,14 @@ github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4
70 101
 github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
71 102
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
72 103
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
104
+github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
73 105
 github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
74 106
 github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
75 107
 github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
108
+github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0=
109
+github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
110
+github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
111
+github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
76 112
 github.com/smira/go-statsd v1.3.4 h1:kBYWcLSGT+qC6JVbvfz48kX7mQys32fjDOPrfmsSx2c=
77 113
 github.com/smira/go-statsd v1.3.4/go.mod h1:RjdsESPgDODtg1VpVVf9MJrEW2Hw0wtRNbmB1CAhu6A=
78 114
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -97,17 +133,33 @@ github.com/tylertreat/BoomFilters v0.0.0-20251117164519-53813c36cc1b/go.mod h1:O
97 133
 github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU=
98 134
 github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g=
99 135
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
136
+go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
137
+go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
138
+go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
139
+go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
140
+go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
141
+go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
142
+go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
143
+go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
100 144
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
101 145
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
146
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
147
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
148
+go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
149
+go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
102 150
 go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
103 151
 go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
104 152
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
105 153
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
106 154
 golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
107 155
 golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
156
+golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY=
157
+golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
108 158
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
109 159
 golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
110 160
 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
161
+golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
162
+golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
111 163
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
112 164
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
113 165
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
@@ -115,6 +167,7 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
115 167
 golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
116 168
 golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
117 169
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
170
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
118 171
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
119 172
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
120 173
 golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
@@ -137,11 +190,15 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
137 190
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
138 191
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
139 192
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
193
+golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
194
+golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
140 195
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
141 196
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
142 197
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
143 198
 golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM=
144 199
 golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
200
+golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
201
+golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
145 202
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
146 203
 google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
147 204
 google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
@@ -149,6 +206,10 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
149 206
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
150 207
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
151 208
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
209
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
210
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
152 211
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
153 212
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
154 213
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
214
+rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY=
215
+rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs=

+ 0
- 41
mtglib/internal/telegram/address_pool.go Прегледај датотеку

@@ -1,41 +0,0 @@
1
-package telegram
2
-
3
-import "math/rand"
4
-
5
-type addressPool struct {
6
-	v4 [][]tgAddr
7
-	v6 [][]tgAddr
8
-}
9
-
10
-func (a addressPool) isValidDC(dc int) bool {
11
-	return dc > 0 && dc <= len(a.v4) && dc <= len(a.v6)
12
-}
13
-
14
-func (a addressPool) getRandomDC() int {
15
-	return 1 + rand.Intn(len(a.v4))
16
-}
17
-
18
-func (a addressPool) getV4(dc int) []tgAddr {
19
-	return a.get(a.v4, dc-1)
20
-}
21
-
22
-func (a addressPool) getV6(dc int) []tgAddr {
23
-	return a.get(a.v6, dc-1)
24
-}
25
-
26
-func (a addressPool) get(addresses [][]tgAddr, dc int) []tgAddr {
27
-	if dc < 0 || dc >= len(addresses) {
28
-		return nil
29
-	}
30
-
31
-	rv := make([]tgAddr, len(addresses[dc]))
32
-	copy(rv, addresses[dc])
33
-
34
-	if len(rv) > 1 {
35
-		rand.Shuffle(len(rv), func(i, j int) {
36
-			rv[i], rv[j] = rv[j], rv[i]
37
-		})
38
-	}
39
-
40
-	return rv
41
-}

+ 19
- 0
mtglib/internal/telegram/dc_addresses.go Прегледај датотеку

@@ -0,0 +1,19 @@
1
+package telegram
2
+
3
+type dcAddresses struct {
4
+	v4 map[int][]tgAddr
5
+	v6 map[int][]tgAddr
6
+}
7
+
8
+func (a dcAddresses) getV4(dc int) []tgAddr {
9
+	return a.v4[dc]
10
+}
11
+
12
+func (a dcAddresses) getV6(dc int) []tgAddr {
13
+	return a.v6[dc]
14
+}
15
+
16
+func (a dcAddresses) isValidDC(dc int) bool {
17
+	_, ok := a.v4[dc]
18
+	return ok
19
+}

+ 25
- 35
mtglib/internal/telegram/init.go Прегледај датотеку

@@ -3,6 +3,7 @@ package telegram
3 3
 import (
4 4
 	"context"
5 5
 	"errors"
6
+	"time"
6 7
 
7 8
 	"github.com/9seconds/mtg/v2/essentials"
8 9
 )
@@ -18,6 +19,18 @@ const (
18 19
 	preferIPPreferIPv6
19 20
 )
20 21
 
22
+const (
23
+	defaultDC                    = 2
24
+	defaultUpdateDCAddressesEach = time.Hour
25
+	defaultAppID                 = 123456
26
+	defaultAppHash               = ""
27
+)
28
+
29
+type loggerInterface interface {
30
+	Info(msg string)
31
+	WarningError(msg string, err error)
32
+}
33
+
21 34
 type tgAddr struct {
22 35
 	network string
23 36
 	address string
@@ -25,64 +38,41 @@ type tgAddr struct {
25 38
 
26 39
 // https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30
27 40
 var (
28
-	productionV4Addresses = [][]tgAddr{
29
-		{ // dc1
41
+	defaultV4Addresses = map[int][]tgAddr{
42
+		1: {
30 43
 			{network: "tcp4", address: "149.154.175.50:443"},
31 44
 		},
32
-		{ // dc2
45
+		2: {
33 46
 			{network: "tcp4", address: "149.154.167.51:443"},
34 47
 			{network: "tcp4", address: "95.161.76.100:443"},
35 48
 		},
36
-		{ // dc3
49
+		3: {
37 50
 			{network: "tcp4", address: "149.154.175.100:443"},
38 51
 		},
39
-		{ // dc4
52
+		4: {
40 53
 			{network: "tcp4", address: "149.154.167.91:443"},
41 54
 		},
42
-		{ // dc5
55
+		5: {
43 56
 			{network: "tcp4", address: "149.154.171.5:443"},
44 57
 		},
45 58
 	}
46
-	productionV6Addresses = [][]tgAddr{
47
-		{ // dc1
59
+	defaultV6Addresses = map[int][]tgAddr{
60
+		1: {
48 61
 			{network: "tcp6", address: "[2001:b28:f23d:f001::a]:443"},
49 62
 		},
50
-		{ // dc2
63
+		2: {
51 64
 			{network: "tcp6", address: "[2001:67c:04e8:f002::a]:443"},
52 65
 		},
53
-		{ // dc3
66
+		3: {
54 67
 			{network: "tcp6", address: "[2001:b28:f23d:f003::a]:443"},
55 68
 		},
56
-		{ // dc4
69
+		4: {
57 70
 			{network: "tcp6", address: "[2001:67c:04e8:f004::a]:443"},
58 71
 		},
59
-		{ // dc5
72
+		5: {
60 73
 			{network: "tcp6", address: "[2001:b28:f23f:f005::a]:443"},
61 74
 		},
62 75
 	}
63
-
64
-	testV4Addresses = [][]tgAddr{
65
-		{ // dc1
66
-			{network: "tcp4", address: "149.154.175.10:443"},
67
-		},
68
-		{ // dc2
69
-			{network: "tcp4", address: "149.154.167.40:443"},
70
-		},
71
-		{ // dc3
72
-			{network: "tcp4", address: "149.154.175.117:443"},
73
-		},
74
-	}
75
-	testV6Addresses = [][]tgAddr{
76
-		{ // dc1
77
-			{network: "tcp6", address: "[2001:b28:f23d:f001::e]:443"},
78
-		},
79
-		{ // dc2
80
-			{network: "tcp6", address: "[2001:67c:04e8:f002::e]:443"},
81
-		},
82
-		{ // dc3
83
-			{network: "tcp6", address: "[2001:b28:f23d:f003::e]:443"},
84
-		},
85
-	}
86 76
 )
87 77
 
88 78
 type Dialer interface {

+ 42
- 0
mtglib/internal/telegram/rpc_client.go Прегледај датотеку

@@ -0,0 +1,42 @@
1
+package telegram
2
+
3
+import (
4
+	"context"
5
+	"net"
6
+	"strconv"
7
+
8
+	"github.com/gotd/td/telegram"
9
+)
10
+
11
+type rpcClient struct {
12
+	*telegram.Client
13
+}
14
+
15
+func (r rpcClient) getDCAddresses(logger loggerInterface, ctx context.Context) (dcAddresses, error) {
16
+	addrs := dcAddresses{
17
+		v4: map[int][]tgAddr{},
18
+		v6: map[int][]tgAddr{},
19
+	}
20
+
21
+	err := r.Client.Run(ctx, func(_ context.Context) error {
22
+		for _, opt := range r.Client.Config().DCOptions {
23
+			addr := net.JoinHostPort(opt.IPAddress, strconv.Itoa(opt.Port))
24
+
25
+			if opt.Ipv6 {
26
+				addrs.v6[opt.ID] = append(addrs.v6[opt.ID], tgAddr{
27
+					network: "tcp6",
28
+					address: addr,
29
+				})
30
+			} else {
31
+				addrs.v4[opt.ID] = append(addrs.v4[opt.ID], tgAddr{
32
+					network: "tcp4",
33
+					address: addr,
34
+				})
35
+			}
36
+		}
37
+
38
+		return nil
39
+	})
40
+
41
+	return addrs, err
42
+}

+ 80
- 24
mtglib/internal/telegram/telegram.go Прегледај датотеку

@@ -4,29 +4,39 @@ import (
4 4
 	"context"
5 5
 	"fmt"
6 6
 	"strings"
7
+	"sync"
8
+	"time"
7 9
 
8 10
 	"github.com/9seconds/mtg/v2/essentials"
11
+	"github.com/gotd/td/telegram"
9 12
 )
10 13
 
11 14
 type Telegram struct {
12
-	dialer   Dialer
13
-	preferIP preferIP
14
-	pool     addressPool
15
+	ctx       context.Context
16
+	ctxCancel context.CancelFunc
17
+	lock      sync.RWMutex
18
+
19
+	dialer    Dialer
20
+	preferIP  preferIP
21
+	addresses dcAddresses
22
+	rpc       rpcClient
15 23
 }
16 24
 
17
-func (t Telegram) Dial(ctx context.Context, dc int) (essentials.Conn, error) {
25
+func (t *Telegram) Dial(ctx context.Context, dc int) (essentials.Conn, error) {
18 26
 	var addresses []tgAddr
19 27
 
28
+	t.lock.RLock()
20 29
 	switch t.preferIP {
21 30
 	case preferIPOnlyIPv4:
22
-		addresses = t.pool.getV4(dc)
31
+		addresses = t.addresses.getV4(dc)
23 32
 	case preferIPOnlyIPv6:
24
-		addresses = t.pool.getV6(dc)
33
+		addresses = t.addresses.getV6(dc)
25 34
 	case preferIPPreferIPv4:
26
-		addresses = append(t.pool.getV4(dc), t.pool.getV6(dc)...)
35
+		addresses = append(t.addresses.getV4(dc), t.addresses.getV6(dc)...)
27 36
 	case preferIPPreferIPv6:
28
-		addresses = append(t.pool.getV6(dc), t.pool.getV4(dc)...)
37
+		addresses = append(t.addresses.getV6(dc), t.addresses.getV4(dc)...)
29 38
 	}
39
+	t.lock.RUnlock()
30 40
 
31 41
 	var conn essentials.Conn
32 42
 
@@ -42,15 +52,60 @@ func (t Telegram) Dial(ctx context.Context, dc int) (essentials.Conn, error) {
42 52
 	return nil, fmt.Errorf("cannot dial to %d dc: %w", dc, err)
43 53
 }
44 54
 
45
-func (t Telegram) IsKnownDC(dc int) bool {
46
-	return t.pool.isValidDC(dc)
55
+func (t *Telegram) IsKnownDC(dc int) bool {
56
+	return t.addresses.isValidDC(dc)
57
+}
58
+
59
+func (t *Telegram) GetFallbackDC() int {
60
+	return defaultDC
61
+}
62
+
63
+func (t *Telegram) Shutdown() {
64
+	t.ctxCancel()
65
+}
66
+
67
+func (t *Telegram) Run(logger loggerInterface, updateEach time.Duration) {
68
+	if updateEach == 0 {
69
+		updateEach = defaultUpdateDCAddressesEach
70
+	}
71
+
72
+	t.update(logger)
73
+
74
+	ticker := time.NewTicker(updateEach)
75
+	defer func() {
76
+		ticker.Stop()
77
+
78
+		select {
79
+		case <-ticker.C:
80
+		default:
81
+		}
82
+	}()
83
+
84
+	for {
85
+		select {
86
+		case <-t.ctx.Done():
87
+			return
88
+		case <-ticker.C:
89
+			t.update(logger)
90
+		}
91
+	}
47 92
 }
48 93
 
49
-func (t Telegram) GetFallbackDC() int {
50
-	return t.pool.getRandomDC()
94
+func (t *Telegram) update(logger loggerInterface) {
95
+	otherAddresses, err := t.rpc.getDCAddresses(logger, t.ctx)
96
+	if err != nil {
97
+		logger.WarningError("Cannot update DC list", err)
98
+		return
99
+	}
100
+
101
+	t.lock.Lock()
102
+	t.addresses = otherAddresses
103
+	t.lock.Unlock()
104
+
105
+	logger.Info(fmt.Sprintf("DC are updated: %v", t.addresses))
51 106
 }
52 107
 
53
-func New(dialer Dialer, ipPreference string, useTestDCs bool) (*Telegram, error) {
108
+func New(dialer Dialer, ipPreference string) (*Telegram, error) {
54 109
 	var pref preferIP
55 110
 
56 111
 	switch strings.ToLower(ipPreference) {
@@ -66,18 +121,19 @@ func New(dialer Dialer, ipPreference string, useTestDCs bool) (*Telegram, error)
66 121
 		return nil, fmt.Errorf("unknown ip preference %s", ipPreference)
67 122
 	}
68 123
 
69
-	pool := addressPool{
70
-		v4: productionV4Addresses,
71
-		v6: productionV6Addresses,
72
-	}
73
-	if useTestDCs {
74
-		pool.v4 = testV4Addresses
75
-		pool.v6 = testV6Addresses
76
-	}
124
+	ctx, cancel := context.WithCancel(context.Background())
77 125
 
78 126
 	return &Telegram{
79
-		dialer:   dialer,
80
-		preferIP: pref,
81
-		pool:     pool,
127
+		ctx:       ctx,
128
+		ctxCancel: cancel,
129
+		dialer:    dialer,
130
+		preferIP:  pref,
131
+		addresses: dcAddresses{
132
+			v4: defaultV4Addresses,
133
+			v6: defaultV6Addresses,
134
+		},
135
+		rpc: rpcClient{
136
+			Client: telegram.NewClient(defaultAppID, defaultAppHash, telegram.Options{}),
137
+		},
82 138
 	}, nil
83 139
 }

+ 4
- 1
mtglib/proxy.go Прегледај датотеку

@@ -144,6 +144,7 @@ func (p *Proxy) Shutdown() {
144 144
 	p.ctxCancel()
145 145
 	p.streamWaitGroup.Wait()
146 146
 	p.workerPool.Release()
147
+	p.telegram.Shutdown()
147 148
 
148 149
 	p.allowlist.Shutdown()
149 150
 	p.blocklist.Shutdown()
@@ -292,7 +293,7 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
292 293
 		return nil, fmt.Errorf("invalid settings: %w", err)
293 294
 	}
294 295
 
295
-	tg, err := telegram.New(opts.Network, opts.getPreferIP(), opts.UseTestDCs)
296
+	tg, err := telegram.New(opts.Network, opts.getPreferIP())
296 297
 	if err != nil {
297 298
 		return nil, fmt.Errorf("cannot build telegram dialer: %w", err)
298 299
 	}
@@ -314,6 +315,8 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
314 315
 		telegram:                 tg,
315 316
 	}
316 317
 
318
+	go tg.Run(proxy.logger.Named("telegram"), 0)
319
+
317 320
 	pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
318 321
 		func(arg interface{}) {
319 322
 			proxy.ServeConn(arg.(essentials.Conn)) //nolint: forcetypeassert

+ 2
- 0
mtglib/proxy_opts.go Прегледај датотеку

@@ -110,6 +110,8 @@ type ProxyOpts struct {
110 110
 	// Telegram-related projects.
111 111
 	//
112 112
 	// This is an optional setting.
113
+	//
114
+	// OBSOLETE and DEPRECATED. Ignored.
113 115
 	UseTestDCs bool
114 116
 }
115 117
 

Loading…
Откажи
Сачувај